﻿Validation = new function() {

    this.IsValidTextValue = function(value, allowedStringLength) {
        if (!allowedStringLength)
            return true;

        if (isNaN(allowedStringLength))
            return false;

        return (value.length <= allowedStringLength);
    }

    this.IsValidPhoneNumber = function(value) {
        // This regex should stay in sync with the one in Infrastructure.Utilities.Validation.Data.
        re = new RegExp(/^(\(?\+?[0-9]*\)?)?[0-9_\-\. \(\)]*$/);
        return re.test(value);
    }

    this.IsValidPhoneExtensionNumber = function(value) {
        re = new RegExp(/^\d*$/);
        return re.test(value);
    }

    this.IsValidNumber = function(value, allowedDecimalPlaces) {
        // Any empty value is valid 
        if (!value) return true;

        amount = Number.parseInvariant(value);
        if (!isNaN(amount))
            amount = Number.parseLocale(value);

        var exceededAllowedDecimalPlaces = false;
        if (!isNaN(allowedDecimalPlaces)) {
            var length = value.length;
            var decPos = value.indexOf(".");
            var numberOfDecimalsInValue = 0;
            if (decPos >= 0)
                numberOfDecimalsInValue = length - decPos - 1;
            exceededAllowedDecimalPlaces = (numberOfDecimalsInValue > allowedDecimalPlaces)
        }

        return (!isNaN(amount) && !exceededAllowedDecimalPlaces);
    }

    this.IsValidNumberRange = function(value, min, max) {
        if (!value) return false;

        amount = Number.parseInvariant(value);
        if (!isNaN(amount))
            amount = Number.parseLocale(value);

        if (isNaN(amount))
            return false;

        return (amount >= min && amount <= max);
    }


    this.IsValidPercentage = function(value, allowedDecimalPlaces) {
        return Validation.IsValidNumber(value, allowedDecimalPlaces);
    }

    this.IsValidCurrency = function(value) {
        return Validation.IsValidNumber(value, 2);
    }

    this.IsValidDate = function(value) {

        // Any empty value is valid 
        if (!value) return true;

        // Allowed formats: mm/dd/yyyy or mm-dd-yyyy

        var dateValue = Date.parseInvariant(value, "MM/dd/yyyy", "MM-dd-yyyy");

        return !(dateValue == 'NaN' || dateValue == null);
    }

    this.IsEmptyOrWhitespace = function(s) {
        if (s == null || s.length == 0)
            return true;
        var whitespace = " \t\n\r";
        var i;
        for (i = 0; i < s.length; i++) {
            var c = s.charAt(i);
            if (whitespace.indexOf(c) == -1) return false;
        }
        return true;
    }

    this.RegularExpressionValidator = function(parent, controlID, validationGroup, controltovalidate, errormessage, validationexpression, display) {
        if (!parent) throw "No Parent Control Given to Validate.";
        if (!display) display = "Dynamic";
        if (!errormessage) errormessage = "Regular Expression Validation Failure.";
        if (!validationexpression) throw "Validation Expression Not Set.";
        if (!controltovalidate) throw "No Control Given to Validate.";
        if (!controlID) throw "Missing Control ID.";

        var errorSpanElement = document.createElement("<span id='" + controlID + "' name='" + controlID + "' style='color:Red;display:none;'>" + errormessage + "</span>");
        parent.appendChild(errorSpanElement);

        validationexpression = validationexpression.replace(/\\/g, "\\\\");

        var codeblock = "";
        codeblock = codeblock + "var " + controlID + " = document.all ? document.all['" + controlID + "'] : document.getElementById('" + controlID + "');\r\n";
        codeblock = codeblock + controlID + ".controltovalidate = '" + controltovalidate + "';\r\n";
        codeblock = codeblock + controlID + ".errormessage = '" + errormessage + "';\r\n";
        codeblock = codeblock + controlID + ".display = '" + display + "';\r\n";
        if (validationGroup) codeblock = codeblock + controlID + ".validationGroup = '" + validationGroup + "';\r\n";
        codeblock = codeblock + controlID + ".evaluationfunction = RegularExpressionValidatorEvaluateIsValid;";
        codeblock = codeblock + controlID + ".validationexpression = '" + validationexpression + "';\r\n";
        codeblock = codeblock + "Array.add(Dyno_Validators, " + controlID + ");\r\n";

        eval(codeblock);
    }

    // Robert's original version without the parnet paraneter
    //    this.RegularExpressionValidator = function(controlID, validationGroup, controltovalidate, errormessage, validationexpression, display) {
    //        if (!display) display = "Dynamic";
    //        if (!errormessage) errormessage = "Regular Expression Validation Failure.";
    //        if (!validationexpression) throw "Validation Expression Not Set.";
    //        if (!controltovalidate) throw "No Control Given to Validate.";
    //        if (!controlID) throw "Missing Control ID.";

    //        document.write("<span id='" + controlID + "' name='" + controlID + "' style='color:Red;display:none;'>" + errormessage + "</span>");
    //        validationexpression = validationexpression.replace(/\\/g, "\\\\");

    //        var codeblock = "";
    //        codeblock = codeblock + "var " + controlID + " = document.all ? document.all['" + controlID + "'] : document.getElementById('" + controlID + "');\r\n";
    //        codeblock = codeblock + controlID + ".controltovalidate = '" + controltovalidate + "';\r\n";
    //        codeblock = codeblock + controlID + ".errormessage = '" + errormessage + "';\r\n";
    //        codeblock = codeblock + controlID + ".display = '" + display + "';\r\n";
    //        if (validationGroup) codeblock = codeblock + controlID + ".validationGroup = '" + validationGroup + "';\r\n";
    //        codeblock = codeblock + controlID + ".evaluationfunction = RegularExpressionValidatorEvaluateIsValid;";
    //        codeblock = codeblock + controlID + ".validationexpression = '" + validationexpression + "';\r\n";
    //        codeblock = codeblock + "Array.add(Dyno_Validators, " + controlID + ");\r\n";

    //        eval(codeblock);
    //    }

    this.RequiredFieldValidator = function(controlID, validationGroup, controltovalidate, errormessage, initialvalue, display) {
        if (!display) display = "Dynamic";
        if (!errormessage) errormessage = "Required Field Validator Failure.";
        if (!initialvalue) initialvalue = "";
        if (!controltovalidate) throw "No Control Given to Validate.";
        if (!controlID) throw "Missing Control ID.";

        document.write("<span id='" + controlID + "' name='" + controlID + "' style='color:Red;display:none;'>" + errormessage + "</span>");

        var codeblock = "";
        codeblock = codeblock + "var " + controlID + " = document.all ? document.all['" + controlID + "'] : document.getElementById('" + controlID + "');\r\n";
        codeblock = codeblock + controlID + ".controltovalidate = '" + controltovalidate + "';\r\n";
        codeblock = codeblock + controlID + ".errormessage = '" + errormessage + "';\r\n";
        codeblock = codeblock + controlID + ".display = '" + display + "';\r\n";
        if (validationGroup) codeblock = codeblock + controlID + ".validationGroup = '" + validationGroup + "';\r\n";
        codeblock = codeblock + controlID + ".evaluationfunction = RequiredFieldValidatorEvaluateIsValid;";
        codeblock = codeblock + controlID + ".initialvalue = '" + initialvalue + "';\r\n";
        codeblock = codeblock + "Array.add(Dyno_Validators, " + controlID + ");\r\n";

        eval(codeblock);
    }

    this.RangeValidator = function(controlID, validationGroup, controltovalidate, errormessage, type, minimumvalue, maximumvalue, display) {
        if (!display) display = "Dynamic";
        if (!errormessage) errormessage = "Range Field Validator Failure.";
        if (!type) throw "Type Not Set.";
        if (!minimumvalue) throw "Minimum Value Not Set.";
        if (!maximumvalue) throw "Maximum Value Not Set.";
        if (!controltovalidate) throw "No Control Given to Validate.";
        if (!controlID) throw "Missing Control ID.";

        document.write("<span id='" + controlID + "' name='" + controlID + "' style='color:Red;display:none;'>" + errormessage + "</span>");

        var codeblock = "";
        codeblock = codeblock + "var " + controlID + " = document.all ? document.all['" + controlID + "'] : document.getElementById('" + controlID + "');\r\n";
        codeblock = codeblock + controlID + ".controltovalidate = '" + controltovalidate + "';\r\n";
        codeblock = codeblock + controlID + ".errormessage = '" + errormessage + "';\r\n";
        codeblock = codeblock + controlID + ".display = '" + display + "';\r\n";
        if (validationGroup) codeblock = codeblock + controlID + ".validationGroup = '" + validationGroup + "';\r\n";
        codeblock = codeblock + controlID + ".evaluationfunction = RangeValidatorEvaluateIsValid;";
        codeblock = codeblock + controlID + ".type = '" + type + "';\r\n";
        codeblock = codeblock + controlID + ".minimumvalue = '" + minimumvalue + "';\r\n";
        codeblock = codeblock + controlID + ".maximumvalue = '" + maximumvalue + "';\r\n";
        codeblock = codeblock + "Array.add(Dyno_Validators, " + controlID + ");\r\n";

        eval(codeblock);
    }

    this.CompareValidator = function(controlID, validationGroup, controltovalidate, errormessage, controltocompare, display) {
        if (!display) display = "Dynamic";
        if (!errormessage) errormessage = "Compare Field Validator Failure.";
        if (!controltocompare) throw "Control To Compare Not Set.";
        if (!controltovalidate) throw "No Control Given to Validate.";
        if (!controlID) throw "Missing Control ID.";

        document.write("<span id='" + controlID + "' name='" + controlID + "' style='color:Red;display:none;'>" + errormessage + "</span>");

        var codeblock = "";
        codeblock = codeblock + "var " + controlID + " = document.all ? document.all['" + controlID + "'] : document.getElementById('" + controlID + "');\r\n";
        codeblock = codeblock + controlID + ".controltovalidate = '" + controltovalidate + "';\r\n";
        codeblock = codeblock + controlID + ".errormessage = '" + errormessage + "';\r\n";
        codeblock = codeblock + controlID + ".display = '" + display + "';\r\n";
        if (validationGroup) codeblock = codeblock + controlID + ".validationGroup = '" + validationGroup + "';\r\n";
        codeblock = codeblock + controlID + ".evaluationfunction = CompareValidatorEvaluateIsValid;";
        codeblock = codeblock + controlID + ".controltocompare = '" + controltocompare + "';\r\n";
        codeblock = codeblock + controlID + ".controlhookup = '" + controltocompare + "';\r\n";
        codeblock = codeblock + "Array.add(Dyno_Validators, " + controlID + ");\r\n";

        eval(codeblock);
    }

    this.CustomValidator = function(controlID, validationGroup, controltovalidate, errormessage, clientvalidationfunction, display) {
        if (!display) display = "Dynamic";
        if (!errormessage) errormessage = "Custom Field Validator Failure.";
        if (!clientvalidationfunction) throw "Client Validation Function Not Set.";
        if (!controltovalidate) throw "No Control Given to Validate.";
        if (!controlID) throw "Missing Control ID.";

        document.write("<span id='" + controlID + "' name='" + controlID + "' style='color:Red;display:none;'>" + errormessage + "</span>");

        var codeblock = "";
        codeblock = codeblock + "var " + controlID + " = document.all ? document.all['" + controlID + "'] : document.getElementById('" + controlID + "');\r\n";
        codeblock = codeblock + controlID + ".controltovalidate = '" + controltovalidate + "';\r\n";
        codeblock = codeblock + controlID + ".errormessage = '" + errormessage + "';\r\n";
        codeblock = codeblock + controlID + ".display = '" + display + "';\r\n";
        if (validationGroup) codeblock = codeblock + controlID + ".validationGroup = '" + validationGroup + "';\r\n";
        codeblock = codeblock + controlID + ".evaluationfunction = CustomValidatorEvaluateIsValid;";
        codeblock = codeblock + controlID + ".clientvalidationfunction = '" + clientvalidationfunction + "';\r\n";
        codeblock = codeblock + "Array.add(Dyno_Validators, " + controlID + ");\r\n";

        eval(codeblock);
    }
}
// End of Validation static class
