/*
 *  Forms validator class for standard s1js forms
 *
 */

s1JS.Jobs.Validator = Base.extend({

    form: null,
    required: [],
    rules: [],
    errors: [],      
    
    constructor: function(form, options)
    {
        this.form = form; 
    },    
    
    getFieldElement: function(field_name)
    {
        return this.form[field_name];    
    },
    
    /*
     *  Add validation rules
     */
    addRequired: function(fields)
    {
        for(var i = 0; i < fields.length; i++) 
        {
            this.required.push(fields[i]);
        }
    },  
    addRule: function(fields, rule_function)
    {
        this.rules.push([fields, rule_function]);
    },
    
    validateOnSubmit: function()
    {
        var validator = this;         
        $(this.form).submit(function() { 
            validator.validate();
            if(validator.hasErrors())
            {
                validator.applyErrors();
                return false;
            }
        });
    },
    
    /*
     *  Validation processing
     */
    validate: function(total)
    {        
        // Everybody deserves a fresh start...
        this.clearErrors();
    
        // Evaluate required fields first
        for(var i = 0; i < this.required.length; i++)
        {
            var el = this.getFieldElement(this.required[i]);
            var $el = $(el);            
           
            if( ($el && ! jQuery.trim($el.val())) || ($el.is("input[@type='checkbox']") && !el.checked ) )
            {
                this.addError(this.required[i], 'This is a required field.');
            }
        }
        
        
        // no sense checking rules if they haven't filled in the basics,
        // so unless this is explicitly asked for, crap out here if there are
        // errors
        if(this.hasErrors() && !total) { return false; }
        
        // Now check the rules
        for(var i = 0; i < this.rules.length; i++)
        {
            var fields = this.rules[i][0];
            var ruleFunction = this.rules[i][1];            
            ruleFunction.call(this, fields);
        }
    },
    
    /*
     *  Error handling
     */
    addError: function(field, message)
    {
        this.errors.push({field:field, message:message});
    },
    getErrors: function()
    {
        return this.errors;
    },
    hasErrors:function()
    {
        return (this.errors.length > 0);
    },
    applyErrors:function()
    {
        for(var i = 0; i < this.errors.length; i++)
        {
            $(this.getFieldElement(this.errors[i].field)).parent().parent().addClass('error').append("<p class=\"s1js-error\">" + this.errors[i].message + "</small></p>");            
        }
    },    
    clearErrors:function()
    {
        this.errors = [];
        $('.s1js-error').remove();
        $('.error').removeClass('error');
    },
    
    /*
     *  Common rule shortcuts 
     */
    equal: function(fields, message)
    {    
        var error_message = (message) ? message : 'Field does not match original';
        
        var equalityTest = function(data)
        {
            var tmp = $(this.getFieldElement(data[0])).val();
            
            for(var i = 1; i < data.length; i++)
            {
                if(tmp != $(this.getFieldElement(data[i])).val())
                {
                    this.addError(data[i], error_message);
                }
            }
        };

        this.addRule(fields, equalityTest);  
    },
    email: function(field, message)
    {
        var error_message = (message) ? message : 'The email address you entered is not valid.';
        
        var emailTest = function(data)
        {
            var email_pattern = /^[^@]+@[a-zA-Z0-9.-]+\.[a-zA-Z]+$/;
            var val = $(this.getFieldElement(data)).val();

            if (!(email_pattern.test(val))) 
            { 
                this.addError(data, error_message);
            }            
        };
        
        this.addRule(field, emailTest);
    }
    
    
});

