﻿/// <reference name="MicrosoftAjax.js"/>
/// <reference path="../jquery/jquery-1.3.2-vsdoc.js"/>

var oValidator = function() {
    var me = {};
    // Private Members
    var _returnCtrl = '';
    var _form = $get(document.forms[0].id);
    var _ctrlCount = 0;
    var _validForm = true;
    var _message = '';
    var _formCtrls = new Array();

    var _reWhitespace = /^\s+$/;
    var _reEmail = /^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|coop|info|jobs|mobi|museum|name|travel))$/;
    var _reImagePath = /^([a-zA-Z]:)\\(\w[\w ]*.*)+\.(jpg|png)$/;
    var _reImage = /^[_a-zA-Z0-9-]+([^\/])\.(jpg|png)$/;
    var _reNumeric = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
    var _reByte = /(^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$)/;
    var _reShort = /(^(-?[0-9]{1,4}|[12][0-9]{4}|3[01][0-9]{3}|32[0-6][0-9]{2}|327[0-5][0-9]|3276[0-7]|-3276[0-8])$)/;
    var _reDate = /^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/;
    var _reMoney = /^\$?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/;
    var _rePositiveInt = /^([1-9][0-9]*)$/;
    var _rePhone = /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/;
    var _rePostalCode = /^(?!.*[DFIOQU])[A-VXY][0-9][A-Z] [0-9][A-Z][0-9]$/

    var _vEmpty = function(s) { return ((s == null) || (s.length == 0)) }
    var _vWhitespace = function(s) { return (_reWhitespace.test(s)); }
    var _IsEmpty = function(s) { return (_vEmpty(s) || _vWhitespace(s)); }
    var _IsNumber = function(s) { return (_reNumeric.test(s)); }
    var _IsByte = function(s) { return (_reByte.test(s)); }
    var _IsShort = function(s) { return (_reShort.test(s)); }
    var _IsEmail = function(s) { return (_reEmail.test(s)); }
    var _IsDate = function(s) { return (_reDate.test(s)); }
    var _IsMoney = function(s) { return (_reMoney.test(s)); }
    var _IsImagePath = function(s) { return (_IsEmpty(s) || _reImagePath.test(s)); }
    var _IsImage = function(s) { return (_IsEmpty(s) || _reImage.test(s)); }
    var _IsPositiveInt = function(s) { return (_rePositiveInt.test(s)); }
    var _IsPhone = function(s) { return (_rePhone.test(s)); }
    var _IsPostalCode = function(s) { return (_rePostalCode.test(s)); }

    var _formCtrl = function(ctrl, msg, type, req, group) {
        var c = {};
        c.ctrl = ctrl;
        c.msg = msg;
        c.vtype = type;
        c.req = req;
        c.group = group;
        return c;
    }
    var _queueCtrl = function(ctrl) {
        if (_returnCtrl.length == 0)
            _returnCtrl = ctrl;
    }
    var _vField = function(el, title, vtype, vreq) {
        var val = $(el).val();
        if (vreq) {
            if (_IsEmpty(val)) {
                _failTest(el, title + ' is a Required Field');
                return;
            }
        }
        else {
            if (_IsEmpty(val)) {
                return;
            }
        }
        switch (vtype.toLowerCase()) {
            case 'email':
                if (!_IsEmail(val))
                    _failTest(el, title + ' is not a valid email.');
                break;
            case 'imagepath':
                if (!_IsImagePath(val))
                    _failTest(el, title + ' is not a valid path.');
                break;
            case 'image':
                if (!_IsImage(val))
                    _failTest(el, title + ' is not an accepted image name.');
                break;
            case 'number':
                if (!_IsNumber(val)) {
                    _failTest(el, title + ' needs to be a number');
                    $(el).val('');
                }
                break;
            case 'byte':
                if (!_IsByte(val)) {
                    _failTest(el, title + ' needs to be a number between 0 and 255');
                    $(el).val('');
                }
                break;
            case 'short':
                if (!_IsShort(val)) {
                    _failTest(el, title + ' needs to be a number between -32768 and 32767');
                    $(el).val('');
                }
                break;
            case 'money':
                if (!_IsMoney(val)) {
                    _failTest(el, title + ' needs to be a valid currency format');
                    $(el).val('');
                }
                break;
            case 'n_select':
                if (!_IsPositiveInt(val)) {
                    _failTest(el, 'Please select a ' + title);
                }
                break;
            case 'postalcode':
                if (!_IsPostalCode(val)) {
                    _failTest(el, title + ' needs to be a valid Canadian postal code');
                }
                break;
            case 'phone':
                if (!_IsPhone(val)) {
                    _failTest(el, title + ' needs to be a valid phone number');
                    $(el).val('');
                }
                break;
            case 'date':
                if (!_IsDate(val)) {
                    _failTest(el, title + ' needs to be a date');
                    $(el).val('');
                }
                break;
            default:
                if (vtype != val.constructor.getName().toLowerCase()) {
                    _failTest(el, title + ' needs to be a ' + vtype);
                    $(el).val('');
                }
        }
    }
    var _failTest = function(el, msg) {
        me.addMessage(msg);
        _queueCtrl(el);
        _validForm = false;
    }

    // Public Members
    me.addCtrl = function(ctrl, msg, type, req, group) {
        var vtype = (type) ? type : 'string';
        var vgroup = (group) ? group : 'group';
        var vreq = (req != null) ? req : true;
        var ctrlExists = false;
        for (var i = 0; i < _ctrlCount; i++) {
            if (_formCtrls[i].ctrl == ctrl) {
                ctrlExists = true;
                _formCtrls[i] = _formCtrl(ctrl, msg, vtype, vreq, vgroup);
            }            
        }
        if (!ctrlExists) {
            _formCtrls[_ctrlCount] = _formCtrl(ctrl, msg, vtype, vreq, vgroup);
            _ctrlCount++;
        }
    }
    me.addMessage = function(msg) {
        if (_message.length == 0)
            _message = msg;
        else {
            _message += "\n" + msg;
        }
    }
    me.validate = function(group) {
        _validForm = true;
        var cnt = _formCtrls.length;
        var vgroup = (group) ? group : 'group';
        if (cnt == 0) {
            this.addMessage('No Controls to Validate');
            _validForm = false;
        }
        for (var i = 0; i < cnt; i++) {
            if (vgroup == _formCtrls[i].group)
                _vField(
				_formCtrls[i].ctrl,
				_formCtrls[i].msg,
				_formCtrls[i].vtype,
				_formCtrls[i].req
			);
        }
        if (!_validForm) {
            alert(_message);
            $(_returnCtrl).focus();
            _message = '';
            _returnCtrl = '';
        }
        return _validForm;
    }
    return me;
}();
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();