﻿/// <reference path="i.js" />
function QuickValidator(qvObj, formEl, errorEl)
{
    var _qvObj = qvObj;
    for(var i in _qvObj)
    {
        _qvObj[i].isValid = false;//todo: create actual objects: instead of dynamically adding this property (for defaults);
        _qvObj[i].passedRegex = true;
    }
    this.Valid = false;
    this.Validate = function()
    {
        _validate();
        UpdateErrorList();
        for(var i in _qvObj)
        {
            if(!_qvObj[i].isValid)
            {
                return false;
            }
        }
        return true;
    }
    function _validate()
    {
        for(var i in _qvObj)
        {
            var name = _qvObj[i].name;
            var value = $(_qvObj[i].inputEl).val();
            if(value.length >= _qvObj[i].mincharlength)
            {
                if(_qvObj[i].regex != undefined)
                {
                    var regex = _qvObj[i].regex;
                    if(regex.test(value))
                    {
                        validated(_qvObj[i]);
                    }
                    else FailedRegex(_qvObj[i]);
                }
                else validated(_qvObj[i]);
            }
            else NotValid(_qvObj[i]);
        }
    }
    function UpdateView()
    {
        $(formEl).find('.PassedValidation').parent().removeClass('Invalid').addClass('Valid');
        $(formEl).find('.FailedValidation').parent().removeClass('Valid').addClass('Invalid');
    }
    function NotValid(aQvObj, error)
    {
        if($(aQvObj.inputEl).hasClass('TriedInput'))
        {
            aQvObj.isValid = false;
            $(aQvObj.inputEl).removeClass('PassedValidation').addClass('FailedValidation');
            UpdateView();
        }
    }
    function FailedRegex(aQvObj)
    {
        if($(aQvObj.inputEl).hasClass('TriedInput'))
        {
            aQvObj.isValid = false;
            aQvObj.passedRegex = false;
            $(aQvObj.inputEl).removeClass('PassedValidation').addClass('FailedValidation');
            UpdateView();
        }
    }
    function validated(aQvObj)
    {
        aQvObj.isValid = true;
        $(aQvObj.inputEl).removeClass('FailedValidation').addClass('PassedValidation');
        UpdateView();
    }
    
    function UpdateErrorList()
    {
        //redo this...
        $(errorEl).html('');
        var errors = '';
        var errorTemplate = '<li></li>';
        var message;
        for(var i in _qvObj)
        {
            if(!_qvObj[i].isValid)
            {
                message = (!_qvObj[i].passedRegex) ? _qvObj[i].regexError : _qvObj[i].message;
                $(errorEl).append($(errorTemplate).append(message));
            }
        }
    }
    
    //handle blur events
    $(formEl).find('*').blur(function()
    {
        _validate();
    })
    .change(function()
    {
        _validate();
    })
    .focus(function()
    {
        $(this).addClass('TriedInput');
    })
}

