﻿/// <reference path="jquery.js" />
function ValidationObject() {
    var that = {
        Integer: function ValidateInteger(strValue) {
            var intPattern = /^\d*$/;
            return intPattern.test(strValue);
        },
        CreditScore: function (strValue) {
            var bolReturn = false;
            var csPattern = /^0$|^[3-8]\d\d$/;
            return csPattern.test(strValue);
        },
        Currency: function (strValue) {
            //var intPattern = /^\$?\d{0,10}(\.\d{1,2})?$/;
            var intPattern = /^\$?[ ]?[1-9]\d{0,2}(,?\d{3})*(\.\d{2})?$/;
            return intPattern.test(strValue);
        },
        Date: function (strValue) {
            return !(isNaN(Date.parse(strValue)));
        },
        Email: function (strValue) {
            var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
            return emailPattern.test(strValue);
        },
        NotEmpty: function (strValue) {
            return (strValue !== "" && strValue !== null);
        },
        Phone: function (strValue) {
            var phonePattern = /^(\(?\d\d\d\)?)?( |-|\.)?\d\d\d( |-|\.)?\d{4,4}(( |-|\.)?[ext\.]+ ?\d+)?$/;
            return phonePattern.test(strValue);
        },
        PhoneEx: function (strValue) {
            if (strValue !== "") {
                var phonePattern = /^(\(?\d\d\d\)?)?( |-|\.)?\d\d\d( |-|\.)?\d{4,4}(( |-|\.)?[ext\.]+ ?\d+)?$/;
                return phonePattern.test(strValue);
            } else { return true; }
        },
        SSN: function (strValue) {
            if (strValue !== "") {
                var SSNPattern = /^\d{3}( |-|\.)?\d{2}( |-|\.)?\d{4}$/;
                return SSNPattern.test(strValue);
            } else { return true; }
        },
        ZipCode: function (strZip) {
            var zipCodePattern = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
            return zipCodePattern.test(strZip);
        },
        Password: function (strValue) {
            var anPattern = /^[a-z][-a-z0-9_ ]{6,20}$/i;
            return anPattern.test(strValue);
        },
        GetElement: function (strId) {
            if (document.getElementById(strId) === null) { return { className: "" }; }
            else { return document.getElementById(strId); }
        },
        ABANumber: function (value) {
            var chars = (value && value.toString ? value.toString() : "").split("");
            var intMultipliers = [3, 7, 1, 3, 7, 1, 3, 7, 1];
            var total = 0;
           if (value && value.length == 9 && that.Integer(value)) {
                for (i in chars) { total += ((parseInt(chars[i]) * intMultipliers[i]) || 0); }
                return (total && !(total % 10));
            }
            return false;
        }
    };
    return that;
}

var _validate = ValidationObject();
var validate = ValidationObject();

$.CreateValidator = function (LabelErrorClass, StatusErrorClass) {
    var strErrorLabelClass = (LabelErrorClass) ? LabelErrorClass : "error";
    var strErrorStatusClass = (StatusErrorClass) ? StatusErrorClass : "error";
    var arrRules = [
			{ "className": "email", "validation": function (elem) { return _validate.Email(elem.value) }, "Message": "Valid email required." },
			{ "className": "phone", "validation": function (elem) { return _validate.Phone(elem.value) }, "Message": "Valid Phone Number required." },
			{ "className": "zipcode", "validation": function (elem) { return _validate.ZipCode(elem.value) }, "Message": "Valid Zip Code required." },
			{ "className": "integer", "validation": function (elem) { return _validate.Integer(elem.value) }, "Message": "Valid number required." },
			{ "className": "ssn", "validation": function (elem) { return _validate.SSN(elem.value) }, "Message": "Valid SSN required." },
			{ "className": "date", "validation": function (elem) { return _validate.Date(elem.value) }, "Message": "Valid Date required (mm/dd/yyyy)." },
			{ "className": "currency", "validation": function (elem) { return _validate.Currency(elem.value) }, "Message": "Currency Amount required." },
			{ "className": "creditscore", "validation": function (elem) { return _validate.CreditScore(elem.value) }, "Message": "Credit Score required." },
			{ "className": "creditcard", "validation": function (elem) { return ($.trim(elem.value).length > 14) }, "Message": "Credit Card Number required." },
			{
			    "className": "compare",
			    "validation": function (txtCompare1) {
			        var compareID = "";
			        if (txtCompare1.className) { var classnames = txtCompare1.className.split(' '); var regexContainsSymbol = /[@]./; for (n in classnames) { if (regexContainsSymbol.test(classnames[n])) { compareID = classnames[n].split('@')[1]; break; } } }
			        var txtCompare2 = document.getElementById((compareID || txtCompare1.rel || txtCompare1.name));
			        if (txtCompare2) { return (txtCompare1.value == txtCompare2.value); }
			        return false;
			    }, 
                "Message": "Password Does Not Match"
			},
			{ "className": "aba", "validation": function (elem) { return _validate.ABANumber(elem.value) }, "Message": "Valid ABA Number required." }
		];
    return {
        validateForm: function (strForm) {
            var focusTarget = null;
            var arrErrors = [];
            strFormID = (typeof (strForm) == "string") ? ("#" + strForm + " ") : "";
            function IsValidationRequired(obj) {
                var bolRetun = false;
                if (typeof (obj.value) == 'string') {
                    if ($(obj).hasClass("required") || $.trim(obj.value) != "") {
                        bolRetun = true;
                    }
                }
                return bolRetun;
            }
            function SetLabel(obj, bolValid) {
                if (!bolValid) {
                    if (obj.id) { $("label[for=" + obj.id + "]").addClass(strErrorLabelClass); }
                    if (obj.error) { arrErrors[arrErrors.length] = obj.error; }
                }
            }
            $(strFormID + " ." + strErrorLabelClass).removeClass(strErrorLabelClass);
            $(strFormID + ":input").each(
				function () {
				    var _valid = true;
				    var intRuleLenght = arrRules.length;
				    for (var i = 0; i < intRuleLenght; i++) {
				        var rule = arrRules[i];
				        if ($(this).hasClass(rule["className"])) {
				            if (IsValidationRequired(this)) {
				                if ((typeof (rule["validation"]) == 'function') && rule["validation"](this)) {
				                    this.error = "";
				                } else {
				                    this.error = (rule.Message) ? ((this.value && this.type != "password") ? " (" + this.value + " not valid) " : "") + rule.Message : "error";
				                    _valid = false;
				                }
				            }
				        }
				    }
				    if ($(this).hasClass("required")) {
				        if (IsValidationRequired(this)) {
				            if ($.trim(this.value) == "") {
				                _valid = false;
				                if ($.trim(this.error) == "") {
				                    this.error = ((this.title) ? (this.title) : "Field") + " is required.";
				                }
				            }
				        }
				    }
				    SetLabel(this, _valid);
				    if ((focusTarget == null) && (!_valid)) { focusTarget = this; }
				});
            if (strForm) {
                if (arrErrors.length > 0) {
                    if (arrErrors.length > 5) { arrErrors.length = 5; arrErrors[4] += "..."; }
                    $("label[for='" + strForm + "']").addClass(strErrorStatusClass).html(arrErrors.join("<br />")).show();
                } else {
                    $("label[for='" + strForm + "']").removeClass().html("");
                }
            }
            if (focusTarget) { try { focusTarget.focus(); } catch (e) { } }
            return (arrErrors.length == 0);
        },
        AddRule: function (strClassName, funcValidator, strMessage) {
            if ((typeof (strClassName) == "string") && (typeof (funcValidator) == "function") && (typeof (strMessage) == "string")) {
                arrRules[arrRules.length] = { "className": strClassName, "validation": funcValidator, "Message": strMessage };
            }
            return this;
        },
        SetLabelErrorClass: function (strClassName) {
            strErrorLabelClass = (typeof (strClassName) == 'string') ? strClassName : strErrorLabelClass;
            return this
        },
        SetStatusErrorClass: function (strClassName) {
            strErrorStatusClass = (typeof (strClassName) == 'string') ? strClassName : strErrorStatusClass;
            return this;
        }
    };
}

function EnterKeyButton(e, btnFn) {
    var scrElem = e.srcElement || e.originalTarget;
    if (e.keyCode == 13 && (scrElem.type || "").toLowerCase() != "textarea") {
        if (typeof e.preventDefault == 'function') { e.preventDefault(); }
        if (typeof e.stopPropagation == 'function') { e.stopPropagation(); }
        if (typeof (btnFn) == "function") {
            btnFn();
        } else if (typeof (btnFn) == "string") {
            var elemButton = document.getElementById(strBtnID);
            if (elemButton) {
                $(elemButton).click();
            }
        }
        return false;
    }
}

function getElem(elem) {
    return (typeof (elem) == "string") ? document.getElementById(elem) : elem;
}    
   
// extend the jQuery object with a valiadtion object
(function () {
    var arrRules = [
        { "className": "email", "validation": function (elem) { return _validate.Email(elem.value) }, "Message": "Valid email required." },
        { "className": "phone", "validation": function (elem) { return _validate.Phone(elem.value) }, "Message": "Valid Phone Number required." },
        { "className": "zipcode", "validation": function (elem) { return _validate.ZipCode(elem.value) }, "Message": "Valid Zip Code required." },
        { "className": "integer", "validation": function (elem) { return _validate.Integer(elem.value) }, "Message": "Valid number required." },
        { "className": "ssn", "validation": function (elem) { return _validate.SSN(elem.value) }, "Message": "Valid SSN required." },
        { "className": "date", "validation": function (elem) { return _validate.Date(elem.value) }, "Message": "Valid Date required (mm/dd/yyyy)." },
        { "className": "currency", "validation": function (elem) { return _validate.Currency(elem.value) }, "Message": "Currency Amount required." },
        { "className": "creditscore", "validation": function (elem) { return _validate.CreditScore(elem.value) }, "Message": "Credit Score required." },
        { "className": "compare", "validation": function (txtCompare1) {
            var compareID = "";
            if (txtCompare1.className) {
                var classnames = txtCompare1.className.split(' ');
                var regexContainsSymbol = /[@]./;
                for (n in classnames) { if (regexContainsSymbol.test(classnames[n])) { compareID = classnames[n].split('@')[1]; break; } }
            }
            var txtCompare2 = document.getElementById((compareID || txtCompare1.rel || txtCompare1.name));
            if (txtCompare2) { return (txtCompare1.value == txtCompare2.value); }
            return false;
        }, "Message": "Password Does Not Match"
        }];

    jQuery.addValidation = function (className, fnvalidation, msg) {
        arrRules.push({ "className": className, "validation": fnvalidation, "Message": msg });
    }

    jQuery.fn.validate = function (resultElem) {
        var strErrorLabelClass, strErrorStatusClass;
        strErrorLabelClass = strErrorStatusClass = "error";
        var context = this;
        resultElem = (resultElem) ? $(resultElem) : ((context[0]) ? $("label[for=" + context[0]["id"] + "]") : $("<label>"));
        var focusTarget = null;
        var arrErrors = [];

        function IsValidationRequired(obj) {
            var bolRetun = false;
            if (typeof (obj.value) == 'string') { if ($(obj).hasClass("required") || $.trim(obj.value) != "") { bolRetun = true; } }
            return bolRetun;
        }

        function SetLabel(obj, bolValid) {
            if (!bolValid) {
                if (obj.id) { $("label[for=" + obj.id + "]").addClass(strErrorLabelClass); }
                if (obj.error) { arrErrors[arrErrors.length] = obj.error; }
            }
        }
        $("." + strErrorLabelClass, context).removeClass(strErrorLabelClass);
        $(":input", context).each(
            function () {
                var _valid = true;
                var intRuleLenght = arrRules.length;
                for (var i = 0; i < intRuleLenght; i++) {
                    var rule = arrRules[i];
                    if ($(this).hasClass(rule["className"])) {
                        if (IsValidationRequired(this)) {
                            if ((typeof (rule["validation"]) == 'function') && rule["validation"](this)) {
                                this.error = "";
                            } else {
                                this.error = (rule.Message) ? ((this.value && this.type != "password") ? " (" + this.value + " not valid) " : "") + rule.Message : "error";
                                _valid = false;
                            }
                        }
                    }
                }
                if ($(this).hasClass("required")) {
                    if (IsValidationRequired(this)) {
                        if ($.trim(this.value) == "") {
                            _valid = false;
                            if ($.trim(this.error) == "") {
                                this.error = ((this.title) ? (this.title) : "Field") + " is required.";
                            }
                        }
                    }
                }
                SetLabel(this, _valid);
                if ((focusTarget == null) && (!_valid)) { focusTarget = this; }
            });
        if (resultElem.length) {
            if (arrErrors.length > 0) {
                if (arrErrors.length > 5) { arrErrors.length = 5; arrErrors[4] += "..."; }
                resultElem.addClass(strErrorStatusClass).html(arrErrors.join("<br />"));
            } else {
                resultElem.removeClass(strErrorStatusClass).html("");
            }
        }
        if (focusTarget) { try { focusTarget.focus(); } catch (e) { } }
        return (arrErrors.length == 0);
    }

    jQuery.fn.clearFields = function () {
        $(":input", this).each(function () {
            this.value = "";
        });
        return this;
    }

    jQuery.fn.enterKeyPress = function (callback) {
        return this.not("textarea").keypress(function (e) {
            var targetType = e.originalTarget ? e.originalTarget.type.toLowerCase() : e.srcElement.tagName.toLowerCase();
            if (e.keyCode == 13 && targetType != "textarea") {
                callback($(this));
                return false;
            }
        });
    };
}
)();


function GetBrowserData() {
    var n_x = navigator;
    var n_z = {"location":document.location};
    for (var y in n_x) { if (typeof n_x[y] == "string" && n_x[y]) { n_z[y] = n_x[y] }; }
    return n_z;
}