renyard/validity

View on GitHub
src/ui/js/options.js

Summary

Maintainability
D
2 days
Test Coverage
var validity = (function(validity) {
    "use strict";
    var options = {},
        $ = function(id) {
            return document.getElementById(id);
        },
        enableHostsElm,
        validateHostsElm,
        validateHost;

    function loadOptions() {
        var validateHosts,
            hostOpt,
            validator = $('validator'),
            legacy = $('legacy'),
            collapsed = $('collapse');

        //    Load options
        window.addEventListener('load', function() {
            var enableHosts = [],
                validateHosts = [],
                validatorURL = validity.opts.option('validator');

            //    TODO: abstract select box population into function
            if (validity.opts.option('enableHosts')) {
                enableHosts = validity.opts.option('enableHosts');
                for (var i = 0; i < enableHosts.length; i++) {
                    hostOpt = document.createElement('option');
                    hostOpt.textContent = enableHosts[i];
                    enableHostsElm.appendChild(hostOpt);
                }
            }

            if (validity.opts.option('validateHosts') !== undefined) {
                validateHosts = validity.opts.option('validateHosts');
                //    Loop through hosts to populate select box
                for (var j = 0; j < validateHosts.length; j++) {
                    hostOpt = document.createElement('option');
                    hostOpt.textContent = validateHosts[j];
                    validateHostsElm.appendChild(hostOpt);
                }
            }

            if (validatorURL === undefined || validatorURL.search(/^\s*$/) !== -1) {
                legacy.disabled = true;
            }
            else {
                validator.value = validity.opts.option('validator');
            }

            if (validity.opts.option('legacy') !== undefined) {
                legacy.checked = validity.opts.option('legacy');
            }

            if (validity.opts.option('collapseResults') !== undefined) {
                collapsed.checked = validity.opts.option('collapseResults');
            }
            else {
                //    Defaults to true
                collapsed.checked = true;
            }
        });
    }

    //    Save options
    function saveOptions() {
        var enableHosts = [],
            validateHosts = [];

        for (var i = 0; i < enableHostsElm.childNodes.length; i++) {
            enableHosts.push(enableHostsElm.childNodes[i].textContent);
        }

        for (var j = 0; j < validateHostsElm.childNodes.length; j++) {
            validateHosts.push(validateHostsElm.childNodes[j].textContent);
        }

        //    Sort hosts alphabetically
        enableHosts.sort();
        validateHosts.sort();

        validity.opts.option('enableHosts', enableHosts);
        validity.opts.option('validateHosts', validateHosts);
        validity.opts.option('legacy', legacy.disabled?false:legacy.checked);
        validity.opts.option('validator', validator.value);
        validity.opts.option('collapseResults', collapse.checked);
    }

    //    Edit hosts
    options.addOptionToSelect = function(optionText, select) {
        var option = document.createElement('option');

        option.textContent = optionText;
        select.appendChild(option);

        return option;
    };

    options.removeOptionsFromSelect = function(select) {
        var option;

        for (var i = 0; i < select.childNodes.length; i++) {
            option = select.childNodes[i];
            if (option.selected === true) {
                select.removeChild(option);
            }
        }
    };

    options.toBool = function(input) {
        if (typeof input === 'string') {
            return input.toLowerCase() === 'true';
        }
        return !!input;
    };

    options.init = function() {
        var validator = $('validator'),
            legacy = $('legacy');

        enableHostsElm = $('enableHosts');
        validateHostsElm = $('validateHosts');
        //validateHost = $('validateHost');

        //    Load option values into UI
        loadOptions();

        //    Attach add and remove events for select boxes
        $('enableAdd').addEventListener('click', function() {
            var textArea = $('enableHost');
            if (textArea.value !== '') {
                options.addOptionToSelect(textArea.value, enableHostsElm);
            }
            textArea.value = '';
        });

        $('enableRemove').addEventListener('click', function() {
            options.removeOptionsFromSelect(enableHostsElm);
        });

        //    Add host on enter keypress
        $('enableHost').addEventListener('keypress', function(e) {
            if (e.which === 13) {
                //    Cancel submit
                e.preventDefault();
                $('enableAdd').click();
            }
        });

        $('validateAdd').addEventListener('click', function() {
            var textArea = $('validateHost');
            if (textArea.value !== '') {
                options.addOptionToSelect(textArea.value, validateHostsElm);
            }
            textArea.value = '';
        });

        $('validateRemove').addEventListener('click', function() {
            options.removeOptionsFromSelect(validateHostsElm);
        });

        //    Add host on enter keypress
        $('validateHost').addEventListener('keypress', function(e) {
            if (e.which === 13) {
                //    Cancel submit
                e.preventDefault();
                $('validateAdd').click();
            }
        });

        validator.addEventListener('change', function() {
            var url = validator.value;

            if (url.search(/^\s*$/) !== -1) {
                legacy.disabled = true;
            }
            else {
                legacy.disabled = false;
            }
        });

        //    Attach save and apply events
        $('apply').addEventListener('click', function() {
            saveOptions();
        });

        $('optionsForm').addEventListener('submit', function(e) {
            saveOptions();
            window.close();
            return false;
        });
    };

    validity.options = options;

    //    Run init() if we're on the options page.
    if ($('validity-options')) {
        document.addEventListener('DOMContentLoaded', function() {
            validity.options.init();
        });
    }

    return validity;
})(validity || {});