
var Validator =
{
    // Controllers
    
    validateForm : function(meta)
    {
        // Validate all form elements
        for (var i = 0; i < meta.elements.length; i++) {
            // Validate element
            var result = Validator.validateElement(meta.elements[i]);
            if (result !== true) {
                return false;
            }
        }
        return true;
    },
    
    validateElement : function(element)
    {
        var control = document.getElementById(element.id);
        // If element is multiple
        if (!control && element.options) {
            // Get all multiple elements and assign to value
            control = {
                value : [],
                focus : function(){}
            };
            for (var j = 0; j < element.options.length; j++) {
                var e = document.getElementById(element.id + '_' + element.options[j]);
                if (e.checked) {
                    control.value.push(e.value);
                }
            }
        }
        // Get control value
        var value = control.value;
        if (typeof(value) == 'string') {
            value = Validator.trim(value);
        }
        // Run all element's validators
        for (var k = 0; k < element.validators.length; k++) {
            var validator = element.validators[k];
            // Run validator
            var result = Validator.validate(validator, value, element);
            if (result !== true) {
                Validator.alert(element, result);
                control.focus();
                return result;
            }
        }
        return true;
    },
    
    validate : function(validator, value, element)
    {
        if (!eval(validator.code)) {
            // Validation failed - show error message and return
            var message = validator.message;
            if (element.label) {
                message = element.label + ': ' + message;
            }
            return message;
        }
        return true;
    },
    
    alert : function(element, error)
    {
        alert(error);
    },
    
    // Validators
    
    length : function(value, min, max)
    {
        if (!Validator.mandatory(value)) return true;
        return value.length >= min && value.length <= max;
    },
    
    regexp : function(value, pattern)
    {
        if (!Validator.mandatory(value)) return true;
        return pattern.test(value);
    },
    
    mandatory : function(value)
    {
        return !!String(value).length;
    },
    
    // Common methods
    
    trim : function(value)
    {
        return value.replace(/(^\s*|\s$)/, '');
    },
    
    test : function(value)
    {
        console.log(value);
    }
};