
/* This script redefines some of the functions of the ASP.NET 
validation script to fix a problem with the SetFocusOnError behavior.
Comments on what was changed for each function are included. */
function ValidationFrameworkExtender() {

	ValidatedControlOnBlur = function(evt) { };

	// A "nofocus" parameter was added to be able to call this function without setting the focus
	ValidatorValidate = function(val, validationGroup, evt, nofocus) {
		val.isvalid = true;
		if (evt == null)
			evt = window.event || window.Event;

		if ((typeof (val.enabled) == "undefined" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup) && typeof (val.evaluationfunction) == "function") {
			val.isvalid = val.evaluationfunction(val);
			if (nofocus != true && !val.isvalid && Page_InvalidControlToBeFocused == null && typeof (val.focusOnError) == "string" && val.focusOnError == "t")
				ValidatorSetFocus(val, evt);
		}
		ValidatorUpdateDisplay(val);
	}

	// This function was changed to call ValidatorValidate with the new "nofocus" parameter to true.
	ValidatorOnChange = function(evt) {
		if (evt == null)
			evt = window.event || window.Event;

		Page_InvalidControlToBeFocused = null;
		var targetedControl;
		if (evt == null)
			targetedControl = null;
		else if (typeof (evt.srcElement) != "undefined" && evt.srcElement != null)
			targetedControl = evt.srcElement;
		else
			targetedControl = evt.target;

		if (targetedControl != null) {
			if (targetedControl.value != "" || targetedControl.validatorInitialized) {
				var vals;
				if (typeof (targetedControl.Validators) != "undefined")
					vals = targetedControl.Validators;
				else if (targetedControl.tagName.toLowerCase() == "label") {
					targetedControl = $get(targetedControl.htmlFor);
					vals = targetedControl.Validators;
				}

				targetedControl.validatorInitialized = true;

				var i;
				for (i = 0; i < vals.length; i++)
					ValidatorValidate(vals[i], null, evt, true);
			}
		}
		ValidatorUpdateIsValid();
	}

	ValidtionReset = function(validtionGroup) {
	    window.cancelValidation = false; //Ensures that Validation will run

	    if (typeof (Page_Validators) == "undefined") { //Validators aren't defined
	        return;
	    }

	    if (typeof (Page_ValidationSummaries) != "undefined") {
	        for (i = 0; i < Page_ValidationSummaries.length; i++) {
	            var summary = Page_ValidationSummaries[i];
	            summary.parentNode.style.display = "none"; //Hide the Error Summary
	        }
	    }

	    if (typeof (validtionGroup) != 'undefined' && validtionGroup != null && validtionGroup != "") { //validationGroup is a valid keyword
	        var i;
	        for (i = 0; i < Page_Validators.length; i++) {
	            var validator = Page_Validators[i];
	            if (validator.validationgroup = validtionGroup) { //Is part of the specified validation group
	                validator.isvalid = true;
	                validator.hasrun = false; //this should be set to true only after a validator has executed
	            }
	        }
	    }
	    else { //Run Reset on every Validator!
	        var i;
	        for (i = 0; i < Page_Validators.length; i++) {
	            var validator = Page_Validators[i];
	            validator.isvalid = true;
	            validator.hasrun = false; //this should be set to true only after a validator has executed
	        }
	    }
	}

	// Extending the WebForm_DoPostBackWithOptions function to record the eventTarget
	var vff_oldWebForm_DoPostBackWithOptions = WebForm_DoPostBackWithOptions;
	WebForm_DoPostBackWithOptions = function(options) {
	    ValidtionReset(options.validationGroup); //Reset Validation values so that multiple Client-side calls can be made
	    var validationResult = true;
	    window.postBackSource = $get(options.eventTarget.replace(/\$/g, '_')); // Replacing $ with _ to get the control's ID instead of it's name.
	    if (options.validation) {
	        if (typeof (Page_ClientValidate) == 'function') {
	            validationResult = Page_ClientValidate(options.validationGroup);
	        }
	    }
	    window.cancelValidation = false;
	    if (validationResult) {
	        if ((typeof (options.actionUrl) != "undefined") && (options.actionUrl != null) && (options.actionUrl.length > 0)) {
	            theForm.action = options.actionUrl;
	        }
	        if (options.trackFocus) {
	            var lastFocus = theForm.elements["__LASTFOCUS"];
	            if ((typeof (lastFocus) != "undefined") && (lastFocus != null)) {
	                if (typeof (document.activeElement) == "undefined") {
	                    lastFocus.value = options.eventTarget;
	                }
	                else {
	                    var active = document.activeElement;
	                    if ((typeof (active) != "undefined") && (active != null)) {
	                        if ((typeof (active.id) != "undefined") && (active.id != null) && (active.id.length > 0)) {
	                            lastFocus.value = active.id;
	                        }
	                        else if (typeof (active.name) != "undefined") {
	                            lastFocus.value = active.name;
	                        }
	                    }
	                }
	            }
	        }
	    }
	    window.integralValidation = false;
	    window.postBackSource = null;
	    if (validationResult == false) {
	        var evt = evt = window.event || window.Event;	        
	        if (evt != null && evt.type) {
	            evt.returnValue = false;	            
	            return false;
	        }
	    }
	    else {
	        __doPostBack(options.eventTarget, options.eventArgument);
	    }
	};
}

// This part will delay the declaration of the new methods until the page has loaded 
var vff_oldonload = window.onload;
if (vff_oldonload)
	window.onload = function() {
		vff_oldonload();
		window.cancelValidation = false;
		ValidationFrameworkExtender();
	}
else
	window.onload = ValidationFrameworkExtender;

var Ignore = 0, Inclusive = 1, Exclusive = 2, All = 0, Any = 1;
var ComparisonOperator = { Equal: 1, GreaterThan: 2, GreaterThanEqual: 3, LessThan: 4, LessThanEqual: 5, NotEqual: 6 };
var ValidCardTypes = { AMEX: 1, MC: 1, RZVISA: 1, VISA: 1, DINNERSCLUB: 1, ENROUTE: 1, DISCOVER: 1, JCB: 1, FSCC: 1, BBYCC: 1 };
var CapsLockEnabled = false;
function capsError(capsEngaged) { if (capsEngaged) { CapsLockEnabled = true; } else { CapsLockEnabled = false; } }
function capsDetect(e) { if (!e) { e = window.event; } if (!e) { MWJ_say_Caps(false); return; } var theKey = e.which ? e.which : (e.keyCode ? e.keyCode : (e.charCode ? e.charCode : 0)); var theShift = e.shiftKey || (e.modifiers && (e.modifiers & 4)); MWJ_say_Caps((theKey > 64 && theKey < 91 && !theShift) || (theKey > 96 && theKey < 123 && theShift)); }
function MWJ_say_Caps(oC) { if (typeof (capsError) == 'string') { if (oC) { alert(capsError); } } else { capsError(oC); } }

var ValidationFramework = new function() {
    var m_displayAllMessages = false;
    var m_resetFieldOnFailure = false;
    function isInt(str) { var res = removeLeadingZeros(str); var i = parseInt(res); if ("NaN" == i) return false; i = i.toString(); if (i != res) return false; return true; }
    function isFloat(str) { var num = removeFloatLeadingZeros(str.replace(',', '.')); num = removeFloatTrailingZeros(num); var i = parseFloat(num); if ("NaN" == i) return false; i = i.toString(); if (i != num) return false; return true; }
    function isDate(dateStr) { var datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/; var matchArray = dateStr.match(datePat); if (matchArray == null) { return false; } month = matchArray[1]; day = matchArray[3]; year = matchArray[5]; if (month < 1 || month > 12) { return false; } if (day < 1 || day > 31) { return false; } if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 31) { return false; } if (month == 2) { var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); if (day > 29 || (day == 29 && !isleap)) { return false; } } return true; }
    function isInRange(lowerBoundType, upperBoundType, lowerBound, upperBound, value) { if (lowerBoundType > 0) { if (value < lowerBound) return false; if (lowerBoundType == 2 && value == lowerBound) return false; } if (upperBoundType > 0) { if (value > upperBound) return false; if (upperBoundType == 2 && value == upperBound) return false; } return true; }
    function isRegExValid(expr, targetValue) { if (targetValue == "" && window.integralValidation) return true; if (expr.test(targetValue)) { return true; } else { return false; } }
    function isDomainValid(domains, targetValue) { var found = false; for (i = 0; i < domains.length; i++) { if (domains[i] == targetValue) { found = true; break; } } return found; }
    function isUpperCase(myString) { return (myString == myString.toUpperCase()); }
    function containsCharacters(characterSet, containsCharactersType, value) { var ret = false; if (containsCharactersType == 1) { for (i = 0; i < characterSet.length; i++) { if (value.indexOf(characterSet.charAt(i).toString()) != -1) { ret = true; break; } } } else { ret = true; for (i = 0; i < characterSet.length; i++) { if (value.indexOf(characterSet.charAt(i).toString()) == -1) { ret = false; break; } } } return ret; }
    function ValidatePasswordLength(typedPassword, minLength, maxLength) { if (typedPassword.length >= minLength && typedPassword.length <= maxLength) return true; else return false; }
    function ValidatePasswordMinCaracters(typedPassword, minChars) { var charCount = 0; var i; for (i = 0; i < typedPassword.length; i++) { var c = typedPassword.substring(i, i + 1); if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { charCount = charCount + 1; } } if (charCount < minChars && minChars > 0) return false; else return true; }
    function ValidatePasswordMinDigits(typedPassword, minDigits) { var digitsCount = 0; var i; for (i = 0; i < typedPassword.length; i++) { var d = typedPassword.substring(i, i + 1); if (d >= '0' && d <= '9') { digitsCount = digitsCount + 1; } } if (digitsCount < minDigits && minDigits > 0) return false; else return true; }
    function ValidatePasswordMixedCase(typedPassword) { var lowerCase = false; var upperCase = false; var i; for (i = 0; i < typedPassword.length; i++) { var c = typedPassword.substring(i, i + 1); if (!(c >= '0' && c <= '9')) { if (isUpperCase(c)) upperCase = true; else lowerCase = true; } if (upperCase && lowerCase) return true; } return false; }
    function isValidCardType(cardNumber, cardType, validCardTypes) { if ((cardNumber.match(/^(34|37)/)) && (cardType == "AMEX") && ((validCardTypes.AMEX) != 0)) return (15 == cardNumber.length); else if ((cardNumber.match(/^(51|52|53|54|55)/)) && (cardType == "MC") && ((validCardTypes.MC) != 0)) return (16 == cardNumber.length); else if ((cardNumber.match(/^(4)/)) && (cardType == "VISA") && ((validCardTypes.VISA) != 0)) return (13 == cardNumber.length || 16 == cardNumber.length); else if ((cardNumber.match(/^(4619)/)) && (cardType == "RZVISA") && ((validCardTypes.RZVISA) != 0)) return (13 == cardNumber.length || 16 == cardNumber.length); else if ((cardNumber.match(/^(300|301|302|303|304|305|36|38)/)) && (cardType == "DINNERSCLUB") && ((validCardTypes.DINNERSCLUB) != 0)) return (14 == cardNumber.length); else if ((cardNumber.match(/^(2014|2149)/)) && (cardType == "ENROUTE") && ((validCardTypes.ENROUTE) != 0)) return (15 == cardNumber.length); else if ((cardNumber.match(/^(6011)/)) && (cardType == "DISCOVER") && ((validCardTypes.DISCOVER) != 0)) return (16 == cardNumber.length); else if ((cardNumber.match(/^(3)/)) && (cardType == "JCB") && ((validCardTypes.JCB) != 0)) return (16 == cardNumber.length); else if ((cardNumber.match(/^(2131|1800)/)) && (cardType == "JCB") && ((validCardTypes.JCB) != 0)) return (15 == cardNumber.length); else if ((cardNumber.match(/^(855501|855601|50284901|50284980)/)) && (cardType == "FSCC") && ((validCardTypes.FSCC) != 0)) return true; else if ((cardNumber.match(/^(850501|850601|50284900|50284990)/)) && (cardType == "BBYCC") && ((validCardTypes.BBYCC) != 0)) return true; else { return false; } }
    function ValidateCreditCard(cardNumber, cardType, validCardTypes) { cardNumber = cardNumber.replace(/ /gi, ''); if (isValidCardType(cardNumber, cardType, validCardTypes)) { var CheckNumbers = new Array(); var CardLength = cardNumber.length; for (var i = CardLength - 2; i >= 0; i = i - 2) { CheckNumbers[CheckNumbers.length] = (parseInt(cardNumber.charAt(i).toString()) * 2); } var CheckSum = 0; for (var iCount = 0; iCount <= CheckNumbers.length - 1; iCount++) { var _count = 0; if (parseInt(CheckNumbers[iCount]) > 9) { var _numLength = (parseInt(CheckNumbers[iCount])).toString().length; for (var x = 0; x < _numLength; x++) { _count = _count + parseInt((parseInt(CheckNumbers[iCount])).toString().charAt(x).toString()); } } else { _count = parseInt(CheckNumbers[iCount]); } CheckSum = CheckSum + _count; } var OriginalSum = 0; for (var y = CardLength - 1; y >= 0; y = y - 2) { OriginalSum = OriginalSum + parseInt(cardNumber.charAt(y).toString()); } return (((OriginalSum + CheckSum) % 10) == 0); } else { return false; } }
    function removeLeadingZeros(val) { while (val.charAt(0) == '0' && val.length > 1) val = val.substring(1, val.length); return val; }
    function removeFloatLeadingZeros(val) { while (val.charAt(0) == '0' && val.charAt(1) != '.' && val.charAt(1) != ',' && val.length > 1) val = val.substring(1, val.length); return val; }
    function removeFloatTrailingZeros(val) { while (val.charAt(val.length - 1) == '0' && (val.indexOf('.') != -1 || val.indexOf(',') != -1) && val.indexOf('.') != val.length - 2 && val.indexOf(',') != val.length - 2) val = val.substring(0, val.length - 1); if (val.charAt(val.length - 1) == '0' && (val.indexOf('.') != -1 || val.indexOf(',') != -1) && (val.indexOf('.') == val.length - 2 || val.indexOf(',') == val.length - 2)) val = val.substring(0, val.length - 2); return val; }
    function showErrorOnImage(obj, errorMsg) { for (i = 0; i < obj.childNodes.length; i++) { if (obj.childNodes[i].tagName == "IMG") { obj.childNodes[i].alt = errorMsg; obj.childNodes[i].title = errorMsg; } } }
    function resetPasswordField() { var objs = document.getElementsByTagName("input"); if (objs != null) { for (i = 0; i < objs.length; i++) { if (objs[i].type == "password") { objs[i].value = ""; } } } }
    function trim(str, chars) { return ltrim(rtrim(str, chars), chars); }
    function ltrim(str, chars) { chars = chars || "\\s"; return str.replace(new RegExp("^[" + chars + "]+", "g"), ""); }
    function rtrim(str, chars) { chars = chars || "\\s"; return str.replace(new RegExp("[" + chars + "]+$", "g"), ""); }

    this.IntegralValidate = function() {
        window.integralValidation = true;
        var groups = new Array();
        var groupCount = 0;
        for (i = 0; i < Page_ValidationSummaries.length; i++) {
            Page_ValidationSummaries[i].innerHTML = "";
            if (typeof (Page_ValidationSummaries[i].validationGroup) != "undefined" && Page_ValidationSummaries[i].validationGroup != "searchKeyword") {
                groups[groupCount] = Page_ValidationSummaries[i].validationGroup;
                groupCount++;
            }
        }
        var valid = Page_ClientValidate('');
        var result = valid;
        var n = 0;
        for (n = 0; n < groups.length; n++) {
            if (valid) valid = Page_ClientValidate(groups[n]); else result = Page_ClientValidate(groups[n]); if (!result) valid = result;
        }
        if (window.integralValidation && !valid) {
            //find global summary
            var gSummary = null;
            for (i = 0; i < Page_ValidationSummaries.length; i++) {
                var summary = Page_ValidationSummaries[i];
                if (typeof (summary.validationGroup) == "undefined" || summary.validationGroup == "") {
                    gSummary = Page_ValidationSummaries[i]; break;
                }
            }
            if (gSummary != null) {
                //merge group content to global summary
                for (i = 0; i < Page_ValidationSummaries.length; i++) {
                    var summary = Page_ValidationSummaries[i];
                    if (summary.validationGroup != "" && summary.validationGroup != "searchKeyword" && !IsSummaryEmpty(summary.innerHTML)) {
                        gSummary.innerHTML += summary.innerHTML;
                    }
                }
                HideNotice();
                gSummary.parentNode.style.display = "block";
                gSummary.style.display = "block";
            }
        }
        window.integralValidation = false;
        return valid;
    };

    function IsSummaryEmpty(text) {
        text = text.replace('\n\n', '').trim();
        if (text == "") return true;
        return false;
    }

    this.ValidationReturnPackage = function(a, b, c, d) {
        var m_valid = a;
        var m_restricted = b;
        var m_ignorePrevious = c;
        var m_errormsg = d;
        this.IsValid = function() { return m_valid; };
        this.IsRestricted = function() { return m_restricted; };
        this.IgnorePrevious = function() { return m_ignorePrevious; };
        this.ErrorMessage = function() { return m_errormsg; };
    };

    this.AlwaysValidValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious) {
        return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
    };

    this.NotNullValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious) {
        if ((value == null) || negated) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
        return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
    };

    this.NullValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious) {
        if ((value != null) || negated) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
        return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
    };

    this.EmptyStringValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious) {
        if (window.integralValidation) return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
        if (value == "") { return new ValidationFramework.ValidationReturnPackage(negated, restricted, ignorePrevious, negated ? "" : errorMsg); }
        return new ValidationFramework.ValidationReturnPackage(!negated, false, ignorePrevious, negated ? errorMsg : "");
    };

    this.StringLengthValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, lowerBoundType, upperBoundType, lowerBound, upperBound) {
        if (!isInRange(lowerBoundType, upperBoundType, lowerBound, upperBound, value.length) || negated) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
        return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
    };

    this.Int32RangeValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, lowerBoundType, upperBoundType, lowerBound, upperBound) {
        if (window.integralValidation && value.length == 0) return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
        if (!isInt(value) || !isInRange(lowerBoundType, upperBoundType, lowerBound, upperBound, value)) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
        return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
    };

    this.DateTimeRangeValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, lowerBoundType, upperBoundType, lowerBound, upperBound) {
        if (!isDate(value) || !isInRange(lowerBoundType, upperBoundType, new Date(lowerBound), new Date(upperBound), new Date(value))) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
        return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
    };

    this.RegExValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, regEx) {
        if (!isRegExValid(regEx, value)) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
        return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
    };

    this.DomainValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, domains) {
        if (!isDomainValid(domains, value) || negated) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
        return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
    };

    this.CreditCardValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, cardType, validCardTypes) {
        if (!ValidateCreditCard(value, $get(cardType).value, validCardTypes) || negated) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
        return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
    };

    this.PasswordStrengthValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, minLength, maxLength, minChars, minDigits) {
        if ((!ValidatePasswordLength(value, minLength, maxLength)) || negated) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
        if ((!ValidatePasswordMinCaracters(value, minChars)) || negated) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
        if ((!ValidatePasswordMinDigits(value, minDigits))) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
        if ((!ValidatePasswordMixedCase(value)) || negated) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
        return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
    };

    this.ContainsCharactersValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, characterSet, charContains) {
        if ((!containsCharacters(characterSet, charContains, value)) || negated) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
        return new ValidationFramework.ValidationReturnPackage(true, false, "");
    };

    this.ValidNumberValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious) {
        if (window.integralValidation && value.length == 0) return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
        if (!isInt(value) || negated) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
        return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
    };

    this.ValidDoubleValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious) {
        if (!isFloat(value) || negated) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
        return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
    };

    this.CompareValidator = function(sender, value, typeToCompare, negated, errorMsg, restricted, ignorePrevious, elTarget, targetOperator) {
        elTarget = $get(elTarget);

        if (elTarget != null && elTarget.value != "" && value != "") {
            var val1 = null;
            var val2 = null;

            for (var i = 0; i < elTarget.Validators.length; i++) {
                if (elTarget.Validators[i].id == sender.id) continue;
                if (!elTarget.Validators[i].isvalid) {
                    return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
                }
            }

            if (typeToCompare == "datetime") {
                val1 = new Date(value);
                val2 = new Date(elTarget.value);
            }
            else {
                val1 = value;
                val2 = elTarget.value;
            }

            switch (targetOperator) {
                case ComparisonOperator.Equal:
                    if ((!(val1 == val2)) || negated) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
                    break;
                case ComparisonOperator.GreaterThan:
                    if ((!(val1 > val2)) || negated) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
                    break;
                case ComparisonOperator.GreaterThanEqual:
                    if ((!(val1 >= val2)) || negated) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
                    break;
                case ComparisonOperator.LessThan:
                    if ((!(val1 < val2)) || negated) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
                    break;
                case ComparisonOperator.LessThanEqual:
                    if ((!(val1 <= val2)) || negated) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
                    break;
                case ComparisonOperator.NotEqual:
                    if (((val1 == val2))) { return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }
                    break;
            }
        }

        return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");

    };

    this.ContextValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, elTarget, targetValue, sTargetValue, validators) {
        elTarget = $get(elTarget);
        if (elTarget != null) {
            if (((elTarget.type == "radio" || elTarget.type == "checkbox") && elTarget.checked == sTargetValue)) {
                return ValidationFramework.AndCompositeValidator(sender, value, negated, errorMsg, restricted, ignorePrevious, validators);
            }
            else if (elTarget.value == targetValue) {
                return ValidationFramework.AndCompositeValidator(sender, value, negated, errorMsg, restricted, ignorePrevious, validators);
            }
        }
        return new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
    };

    this.PhoneNumberValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, areaCodeField, prefixField, suffixField, extensionField, isRequired) {

        var isValid = false;
        
        // NOTE:  The Extension field handles the validation of ALL the fields, and runs last.
        if (sender.controltovalidate == areaCodeField
            || sender.controltovalidate == prefixField
            || sender.controltovalidate == suffixField
            ) {
            isValid = true;
        }
        else {
            var areaCodeCtrl = $get(areaCodeField);
            var prefixCtrl = $get(prefixField);
            var suffixCtrl = $get(suffixField);
            var extensionCtrl = $get(extensionField);
            phoneValue1 = areaCodeCtrl == null ? "" : areaCodeCtrl.value;
            phoneValue2 = prefixCtrl == null ? "" : prefixCtrl.value;
            phoneValue3 = suffixCtrl == null ? "" : suffixCtrl.value;
            phoneValue4 = extensionCtrl == null ? "" : extensionCtrl.value;            
            if (!isRequired) { if (phoneValue1.length == 0 && phoneValue2.length == 0 && phoneValue3.length == 0 && phoneValue4.length == 0) { isValid = true; } }
            if (!isValid) { if (phoneValue1.match(/^\d{3}$/) && phoneValue2.match(/^\d{3}$/) && phoneValue3.match(/^\d{4}$/) && phoneValue4.match(/^.*$/)) { isValid = true; } }
            if (sender.controltovalidate == areaCodeField && phoneValue1.match(/^\d{3}$/)) { isValid = true; }
            else if (sender.controltovalidate == prefixField && phoneValue1.match(/^\d{3}$/) && phoneValue2.match(/^\d{3}$/)) { isValid = true; }
            else if (sender.controltovalidate == suffixField && phoneValue1.match(/^\d{3}$/) && phoneValue2.match(/^\d{3}$/) && phoneValue3.match(/^\d{4}$/)) { isValid = true; }
            if (areaCodeCtrl != null) ProcessDepdendantField(areaCodeCtrl.parentNode.id + "_proxyValidator", errorMsg, isValid);
            if (prefixCtrl != null) ProcessDepdendantField(prefixCtrl.parentNode.id + "_proxyValidator", errorMsg, isValid);
            if (suffixCtrl != null) ProcessDepdendantField(suffixCtrl.parentNode.id + "_proxyValidator", errorMsg, isValid);
            if (isValid || sender.controltovalidate == extensionField) { if (isValid || phoneValue4 != "") { if (extensionCtrl != null) ProcessDepdendantField(extensionCtrl.parentNode.id + "_proxyValidator", errorMsg, isValid); } }
            if (isValid) { if (sender.controltovalidate != areaCodeField && fieldSender != null && fieldSender.ValidatorCalloutBehavior == null) { isValid = true; } else if (phoneValue4 != "") { if (sender.controltovalidate != extensionField) { isValid = true; } } else if (sender.controltovalidate != suffixField) { isValid = true; } }
        }

        return new ValidationFramework.ValidationReturnPackage(isValid, restricted, ignorePrevious, isValid ? "" : errorMsg);
    };

    this.GiftCardValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, giftCardNumberField, securityCodeField, giftCardRegEx, securityCodeRegEx, isRequired, validateRequiredOnly) {

        var ctrl1 = $get(giftCardNumberField);
        var ctrl2 = $get(securityCodeField);

        giftCardValue1 = ctrl1 == null ? null : ctrl1.value;
        giftCardValue2 = ctrl2 == null ? null : ctrl2.value;

        var GiftCardNumberToDisplay = "";  //This number willl be attached to the end of the Validation Message

        if (giftCardValue1 != null && giftCardValue1.toString().length >= 4)
            GiftCardNumberToDisplay = "************" + giftCardValue1.toString().substring(giftCardValue1.toString().length - 4, giftCardValue1.toString().length);

        var GiftCardIsANumber = !isNaN(giftCardValue1);

        if (validateRequiredOnly) {
            if (parseInt(ctrl1.getAttribute("rowIndex")) == 0) {
                if ((giftCardValue1 == "" || giftCardValue2 == "") && window.postBackSource != null && (window.postBackSource.id.indexOf("BtnApplyToOrder") > -1 || window.postBackSource.id.indexOf("BtnCheckBalance") > -1)) {
                    return new ValidationFramework.ValidationReturnPackage(negated, restricted, ignorePrevious, negated ? "" : errorMsg);
                }
                else if (((giftCardValue1 == "" && giftCardValue2 != "") || (giftCardValue1 != "" && giftCardValue2 == "")) && window.postBackSource != null && window.postBackSource.id.indexOf("BtnSubmit") > -1) {
                    return new ValidationFramework.ValidationReturnPackage(negated, restricted, ignorePrevious, negated ? "" : errorMsg);
                }
                else {
                    return new ValidationFramework.ValidationReturnPackage(!negated, restricted, ignorePrevious, !negated ? "" : errorMsg);
                }
            }
            else {
                if (giftCardValue1 == "" && giftCardValue2 == "") {
                    return new ValidationFramework.ValidationReturnPackage(!negated, restricted, ignorePrevious, !negated ? "" : errorMsg);
                }
                else if (((giftCardValue1 == "" && giftCardValue2 != "") || (giftCardValue1 != "" && giftCardValue2 == "")) && window.postBackSource != null) {
                    return new ValidationFramework.ValidationReturnPackage(negated, restricted, ignorePrevious, negated ? "" : errorMsg);
                }
                else {
                    return new ValidationFramework.ValidationReturnPackage(!negated, restricted, ignorePrevious, !negated ? "" : errorMsg);
                }
            }
        }
        else {
            if (giftCardValue1 != "" && giftCardValue2 != "") {
                // Card Number check...
                if (giftCardValue1.toString().match(giftCardRegEx) && !isNaN(giftCardValue1) && giftCardValue1.length > 0) { //GiftCard Number is Valid               
                    return new ValidationFramework.ValidationReturnPackage(!negated, restricted, ignorePrevious, !negated ? "" : errorMsg + " " + GiftCardNumberToDisplay);
                }

                // Security Code check...
                if (giftCardValue2.toString().match(securityCodeRegEx) && !isNaN(giftCardValue2) && giftCardValue2.length > 0) { //Security Code is Valid                 
                    return new ValidationFramework.ValidationReturnPackage(!negated, restricted, ignorePrevious, !negated ? "" : errorMsg + " " + GiftCardNumberToDisplay);
                }
            }
            else {  // one of the fields is blank, in which case the gift card validator with ValidateRequiredOnly = true will catch that...
                return new ValidationFramework.ValidationReturnPackage(!negated, restricted, ignorePrevious, !negated ? "" : errorMsg + " " + GiftCardNumberToDisplay);
            }
        }

        return new ValidationFramework.ValidationReturnPackage(negated, restricted, ignorePrevious, negated ? "" : errorMsg + " " + GiftCardNumberToDisplay);
    };


    function ProcessDepdendantField(controlid, errorMsg, isValid) {
        var userAgent = navigator.userAgent;
        var versionOffset = userAgent.indexOf("MSIE");
        var isIE = (versionOffset >= 0);
        fieldSender = $get(controlid);
        if (fieldSender != null) {
            var control = $get(fieldSender.controltovalidate);
            if (isValid) {
                fieldSender.errormessage = "";
                if (control != null) {
                    control.className = control.className.replace(" highlight", "");
                    if (control.tagName.toLowerCase() == "select" && isIE) {
                        var div = control.parentNode;
                        if (div.id == 'tmpSpan') {
                            var parent = div.parentNode;
                            parent.insertBefore(control, div);
                            parent.removeChild(div);
                        }
                    }
                }
            }
            else {
                fieldSender.errormessage = errorMsg;
                if (control != null && control.className.indexOf(" highlight") == -1) {
                    control.className += " highlight";
                    if (control.parentNode.id != 'tmpSpan' && control.tagName.toLowerCase() == "select" && isIE) {
                        var newdiv = document.createElement('span');
                        newdiv.setAttribute('id', 'tmpSpan');
                        control.parentNode.insertBefore(newdiv, control);
                        newdiv.appendChild(control);
                        newdiv.className += " highlight";
                    }
                }
            }
            if (fieldSender.ValidatorCalloutBehavior != null) {
                if (isValid) {
                    fieldSender.ValidatorCalloutBehavior.hide();
                    if (fieldSender.ValidatorCalloutBehavior._ValidationPopupBehavior != null) {
                        var di = fieldSender.ValidatorCalloutBehavior._ValidationPopupBehavior._element;
                        if (di != null) { di.style.display = "none"; di.style.visibility = "hidden"; }
                    }
                }
                else { fieldSender.ValidatorCalloutBehavior.show(true); }
            }
        }
    }

    this.ExpiryDateValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, monthCtrl, yearCtrl, expDaysValid, isRequired, validateRequiredOnly) {
        var ret = null;

        var month = parseInt($get(monthCtrl).value);
        var year = parseInt($get(yearCtrl).value);

        if (!isRequired) { if ($get(monthCtrl).value == "" || $get(yearCtrl).value == "" || month == 0 || year == 0 || isNaN(month) || isNaN(year)) { ret = new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, ""); } }
        else if ($get(monthCtrl).value == "" || $get(yearCtrl).value == "" || month == 0 || year == 0 || isNaN(month) || isNaN(year)) { ret = new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg); }

        if (!validateRequiredOnly) {
            if (ret == null) {

                /* perform expiry date validation rules */
                var cardMonth = month; // js 0-based months;
                var cardYear = year;
                if (hasExpired(cardMonth, cardYear, expDaysValid)) {
                    ret = new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg);
                }
            }
        }

        if (ret == null) ret = new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");

        if (window.postBackSource == null) {
            if ($get(monthCtrl).value == "" || $get(yearCtrl).value == "") {
                ret = new ValidationFramework.ValidationReturnPackage(true, false, ignorePrevious, "");
            }
        }

        if (sender.controltovalidate != yearCtrl) {
            if ($get(yearCtrl).parentNode.id == 'tmpSpan') {
                ProcessDepdendantField($get(yearCtrl).parentNode.parentNode.id + "_proxyValidator", errorMsg, ret.IsValid());
            }
            else
                ProcessDepdendantField($get(yearCtrl).parentNode.id + "_proxyValidator", errorMsg, ret.IsValid());
        }
        else {
            if ($get(monthCtrl).parentNode.id == 'tmpSpan') {
                ProcessDepdendantField($get(monthCtrl).parentNode.parentNode.id + "_proxyValidator", errorMsg, ret.IsValid());
                ProcessDepdendantField($get(yearCtrl).parentNode.parentNode.id + "_proxyValidator", errorMsg, ret.IsValid());
            }
            else {
                ProcessDepdendantField($get(monthCtrl).parentNode.id + "_proxyValidator", errorMsg, ret.IsValid());
                ProcessDepdendantField($get(yearCtrl).parentNode.id + "_proxyValidator", errorMsg, ret.IsValid());
            }
        }

        return ret;
    };

    function getDaysInMonth(month, year) {
        var m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
        // check febuary
        if (month != 2) return m[month];
        // check if not leap year
        if (year % 4 != 0) return m[1];
        // further check not leap year
        if (year % 100 == 0 && year % 400 != 0) return m[1];
        // it is a leap year
        return m[1] + 1;
    };

    function hasExpired(cardMonth, cardYear, cexpW) {
        // js month must be 0 to 11 not 1 to 12
        cardMonth -= 1;
        var daysInMonth = getDaysInMonth(cardMonth, cardYear);

        var lastDayCardIsValid = new Date(cardYear, cardMonth, daysInMonth);
        lastDayCardIsValid.setDate(lastDayCardIsValid.getDate() - cexpW);

        var today = new Date();
        if (today >= lastDayCardIsValid) {
            return true;
        }
        else {
            return false;
        }
    };

    this.WildcardValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, wildCardCharacter, minimumCharacter) {
        if (value != "") {
            if (value.substr(value.length - 1, 1) == wildCardCharacter) {
                if (value.length > minimumCharacter) {
                    return new ValidationFramework.ValidationReturnPackage(!negated, restricted, ignorePrevious, errorMsg);
                }
            }
            return new ValidationFramework.ValidationReturnPackage(negated, restricted, ignorePrevious, errorMsg);
        }
        return new ValidationFramework.ValidationReturnPackage(!negated, restricted, ignorePrevious, errorMsg);
    };

    this.DependencyValidator = function(sender, value, negated, restricted, errorMsg, ignorePrevious, isRequired, strictDepdendency, dependencyControls) {
        var el = null;
        if (dependencyControls != null) {
            for (var i = 0; i < dependencyControls.length; i++) {
                el = $get(dependencyControls[i]);
                if (el == null) continue;
                if (!strictDepdendency || el.Validators.length == 0) {
                    if (el.value.length == 0)
                        return new ValidationFramework.ValidationReturnPackage(negated, restricted, ignorePrevious, negated ? "" : errorMsg);
                }
                else {
                    for (var j = 0; j < el.Validators.length; j++) {

                        var validator = el.Validators[j];
                        if (validator == null) continue;
                        if (validator.id == sender.id) continue;
                        if (!validator.isvalid || (validator.isvalid && validator.hasrun && !ignorePrevious)) {
                            return new ValidationFramework.ValidationReturnPackage(negated, restricted, ignorePrevious, negated ? "" : errorMsg);
                        }
                    }
                }
            }
        }

        return new ValidationFramework.ValidationReturnPackage(!negated, restricted, ignorePrevious, negated ? errorMsg : "");
    }

    this.AndCompositeValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, validators) {
        var isValid = true, inErrorMsg = "";
        for (var i = 0; i < validators.length; i++) {
            var validator = validators[i];
            if (typeof (validator) == "undefined" || validator == null) continue;
            var ret = validator[0](sender, value, validator[1], validator[2], validator[3], validator[4], validator[5], validator[6], validator[7], validator[8], validator[9], validator[10]);
            ignorePrevious = ret.IgnorePrevious();
            if (!ret.IsValid()) {
                isValid = false;
                if (ret.IgnorePrevious()) { inErrorMsg = ""; }
                if (m_displayAllMessages) { inErrorMsg += (inErrorMsg != "" ? "<br />" : "") + ret.ErrorMessage(); }
                else if (inErrorMsg == "") { inErrorMsg = ret.ErrorMessage(); }
                if (ret.IsRestricted()) break;
            }
        }
        if (inErrorMsg != "") errorMsg = inErrorMsg;
        return new ValidationFramework.ValidationReturnPackage(isValid, restricted, ignorePrevious, isValid ? "" : errorMsg);
    };

    this.OrCompositeValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, orValidators) {
        var inErrorMsg = "";
        for (var i = 0; i < orValidators.length; i++) {
            var validator = orValidators[i];
            if (typeof (validator) == "undefined" || validator == null) continue;
            var ret = validator[0](sender, value, validator[1], validator[2], validator[3], validator[4], validator[5], validator[6], validator[7], validator[8], validator[9], validator[10]);
            ignorePrevious = ret.IgnorePrevious();
            if (ret.IsValid()) {
                return new ValidationFramework.ValidationReturnPackage(true, restricted, ignorePrevious, "");
            }
            else if (!ret.IsRestricted()) {
                if (ret.IgnorePrevious()) { inErrorMsg = ""; }
                if (inErrorMsg != "" && m_displayAllMessages) { inErrorMsg += "<br />" + ret.ErrorMessage(); }
                else if (inErrorMsg == "") { inErrorMsg = ret.ErrorMessage(); }
            }
            else { inErrorMsg = ret.ErrorMessage(); }
        }
        if (inErrorMsg != "") errorMsg = inErrorMsg;
        return new ValidationFramework.ValidationReturnPackage(false, restricted, ignorePrevious, errorMsg);
    };

    this.PageValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, required, pageControls, cancelValidation) {
        var atLeastOne = window.integralValidation;
        if (!atLeastOne) {
            for (var i = 0; i < pageControls.length; i++) {
                var obj = $get(pageControls[i]);
                if (obj != null) {
                    if (obj.tagName.toLowerCase() == "select") { if (obj.selectedIndex > 0) { atLeastOne = true; break; } }
                    else if (obj.value.length > 0) { atLeastOne = true; break; }
                }
            }
        }
        if (!atLeastOne && cancelValidation) {
            window.cancelValidation = true;
        }
        return new ValidationFramework.ValidationReturnPackage(atLeastOne, restricted, ignorePrevious, atLeastOne ? "" : errorMsg);
    };

    this.UniqueValueListValidator = function(sender, value, negated, errorMsg, restricted, ignorePrevious, required, pageControls) {
        var values = new Array();
        var j = 0;
        var valid = true;
        for (var i = 0; i < pageControls.length; i++) {
            var obj = $get(pageControls[i]);
            if (obj != null) {
                if (obj.tagName.toLowerCase() == "input" && obj.type == "text" && obj.value != "") {
                    for (k = 0; k < j; k++) {
                        if (obj.value.toLowerCase() == values[k].toLowerCase()) {
                            valid = false;
                            break;
                        }
                    }
                    values[j] = obj.value;
                    j++;
                }
            }
            if (!valid) break;
        }
        window.cancelValidation = !valid;
        return new ValidationFramework.ValidationReturnPackage(valid, restricted, ignorePrevious, valid ? "" : errorMsg);
    };

    this.FireValidation = function(sender, args, builtValidator) {
        var cancel = false;
        var validator = null;
        var validatorContainer = null;
        if (!builtValidator) {
            var senderId = sender.id + "_ValidatorObject";
            try { validatorContainer = eval(senderId); } catch (e) { }
            if (validatorContainer == null) return;
            if (validatorContainer.Validators == null) return;
            m_displayAllMessages = validatorContainer.DisplayAllMessages;
            m_resetFieldOnFailure = validatorContainer.ResetFieldOnFailure;
            m_dynamicDisplay = validatorContainer.DynamicDisplay;
            m_labelField = validatorContainer.LabelBehavior;
            m_template = validatorContainer.TemplateBehavior;
            validator = validatorContainer.Validators[0];
            if (validator == null) return;
        }
        else { validator = builtValidator; }
        var validatorObj = validator[0];
        var ret = null;
        if (validatorObj == null || window.cancelValidation == true) {
            args.IsValid = true;
            sender.errormessage = "";
            cancel = window.cancelValidation;
        }
        else {
            var ret = validatorObj(sender, trim(args.Value), validator[1], validator[2], validator[3], validator[4], validator[5], validator[6], validator[7], validator[8], validator[9], validator[10]);
            args.IsValid = ret.IsValid();
            sender.hasrun = true; //Mark the Validator as being run
            sender.errormessage = ret.ErrorMessage();
            if (!args.IsValid && ret.IgnorePrevious() && window.integralValidation) {
                window.cancelValidation = true;
            }
        }

        ActivateRequiredTemplates(args.IsValid, sender.errormessage);

        if (!args.IsValid && m_resetFieldOnFailure) {
            var field = sender.nextSibling;
            if (!field || field.type != "text") field = sender.previousSibling;

            if (field && field.type == "text") field.value = "";
        }

        if (IsInline(sender) && typeof (UpdateErrorNotice) == "function") { UpdateErrorNotice(); }
        else { HideNotice(); }
        if (!cancel && !IsInline(sender)) ManageSummaries(sender.validationGroup, args.IsValid);
    };

    function ManageSummaries(validationGroup, isValid) {
        if (window.postBackSource != null && typeof (Page_ValidationSummaries) != "undefined") {
            for (i = 0; i < Page_ValidationSummaries.length; i++) {
                var summary = Page_ValidationSummaries[i];
                if (IsSummaryVisible(validationGroup, summary, isValid)) { HideNotice(); summary.parentNode.style.display = "block"; summary.style.display = "block"; }
                else if (summary.style.display == "none") { summary.parentNode.style.display = "none"; }
            }
        }
    }

    function IsSummaryVisible(validationGroup, summary, isValid) {
        if (!window.integralValidation && validationGroup == summary.validationGroup && !isValid) return true;
        return false;
    }

    function HideNotice() {
        var obj = $get("errornotice");
        if (obj != null) {
            obj.style.display = "none";
        }
    }

    function IsInline(sender) {
        if (sender.ValidatorCalloutBehavior != null && sender.ValidatorCalloutBehavior._ValidationPopupBehavior != null) { return true; }
        return false;
    }

    function ActivateRequiredTemplates(isValid, errorMsg) {
        var el = window.postBackSource;
        if (el) {
            if (el.type == "submit" || el.type == "button" || el.type == "image" || isValid || m_dynamicDisplay) {
                if (m_labelField != null) {
                    var labelField = $get(m_labelField.clientId);
                    if (labelField != null) { labelField.className = labelField.className.replace(' ' + m_labelField.className, '') + (isValid ? '' : ' ' + m_labelField.className); }
                }
                if (m_template != null) {
                    var templateField = $get(m_template[0].clientId);
                    if (templateField != null) {
                        templateField.style.display = (isValid ? 'none' : 'inline');
                        if (!isValid) { showErrorOnImage(templateField, errorMsg); }
                    }
                }
            }
        }
    }

} ();
