﻿jQuery.validator.addMethod("validate_dependent_property", function(value, element, params) {
    return true;
}, "");

function CustomDataType_IsValid(value, element, params, validator) {
    if (jQuery.validator.prototype.optional(element)) { return true; }
    switch (params.dataType) {
        case 10: //"EmailAddress"
            return jQuery.validator.methods["email"].call(validator, value.replace(/\r/g, ""), element, params);
            //return jQuery.validator.methods.email(value, element);
        case 2: //"Date"
            return jQuery.validator.methods["date"].call(validator, value.replace(/\r/g, ""), element, params);
            //return jQuery.validator.methods.date(value, element);
        case 1: //"DateTime"
            return jQuery.validator.methods["xVal_regex"].call(validator, value.replace(/\r/g, ""), element, ["^\\d{1,2}/\\d{1,2}/(\\d{2}|\\d{4})\\s+\\d{1,2}\\:\\d{2}(\\:\\d{2})?$", ""]);
            //return jQuery.validator.methods.xVal_regex(value, element, ["^\\d{1,2}/\\d{1,2}/(\\d{2}|\\d{4})\\s+\\d{1,2}\\:\\d{2}(\\:\\d{2})?$", ""]);
        case 3: //"Time"
            return jQuery.validator.methods["xVal_regex"].call(validator, value.replace(/\r/g, ""), element, ["^((([0]?[1-9]|1[0-2])(:|\.)[0-5][0-9]((:|\.)[0-5][0-9])?( )?(am|pm))|(([0]?[0-9]|1[0-9]|2[0-3])(:|\.)[0-5][0-9]((:|\.)[0-5][0-9])?))$", ""]);
            //return jQuery.validator.methods.xVal_regex(value, element, ["^((([0]?[1-9]|1[0-2])(:|\.)[0-5][0-9]((:|\.)[0-5][0-9])?( )?(am|pm))|(([0]?[0-9]|1[0-9]|2[0-3])(:|\.)[0-5][0-9]((:|\.)[0-5][0-9])?))$", ""]);
        case 6: //"Currency"
            return jQuery.validator.methods["xVal_regex"].call(validator, value.replace(/\r/g, ""), element, ["^\\D?\\s?([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(.[0-9][0-9])?$", ""]);
            //return jQuery.validator.methods.xVal_regex(value, element, ["^\\D?\\s?([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(.[0-9][0-9])?$", ""]);
        case 4: //"Duration"
            return jQuery.validator.methods["xVal_regex"].call(validator, value.replace(/\r/g, ""), element, ["^(\\d\\d\\:){0,2}\\d\\d$", ""]);
            //return jQuery.validator.methods.xVal_regex(value, element, ["^(\\d\\d\\:){0,2}\\d\\d$", ""]);
        case 12: //"Url"
            return jQuery.validator.methods["xVal_regex"].call(validator, value.replace(/\r/g, ""), element, ["^(http(s?)\\:\\/\\/|~/|/)?([\\w]+:\\w+@)?([a-zA-Z]{1}([\\w\\-]+\\.)+([\\w]{2,5}))(:[\\d]{1,5})?(\\/?)([a-zA-Z0-9\\-\\.\\?\\,\\'\\/\\\\\\+&amp;%\\$#_]*)?$", ""]);
            //return jQuery.validator.methods.xVal_regex(value, element, ["^(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?$", ""]);
        /*
        case "Integer":
            return jQuery.validator.methods.xVal_regex(value, element, ["^\\-?\\d+$", ""]);
        case "Decimal":
            return jQuery.validator.methods["number"].call(validator, value.replace(/\r/g, ""), element, params);
            //return jQuery.validator.methods.number(value, element);
        case "CreditCardLuhn":
            return jQuery.validator.methods.xVal_creditCardLuhn(value, element);
        */
    }
    return true;
}

function CustomStringLength_IsValid(value, element, params, validator) {
    if (jQuery.validator.prototype.optional(element)) { return true; }
    return jQuery.validator.methods["rangelength"].call(validator, value.replace(/\r/g, ""), element, [params.minimum, params.maximum]);
}

function CompareObjects(value1, value2, compareValueType) {
    var tmpValue1, tmpValue2;
    try {
        switch (compareValueType) {
            case 1: //CustomCompareValueType.String:
                tmpValue1 = value1;
                tmpValue2 = value2;
                break;
            case 2: //CustomCompareValueType.Long:
                tmpValue1 = parseInt(value1);
                tmpValue2 = parseInt(value2);
                break;
            case 3: //CustomCompareValueType.Double:
                tmpValue1 = parseFloat(value1);
                tmpValue2 = parseFloat(value2);
                break;
            case 4: //CustomCompareValueType.Date:
                tmpValue1 = Date.parse(value1);
                tmpValue2 = Date.parse(value2);
                break;
        }
        return tmpValue1 == tmpValue2 ? 0 : (tmpValue1 > tmpValue2 ? 1 : -1);
    }
    catch (e) {
        return null;
    }
    return null;
}

function Compare(value1, value2, comparisonOperator, compareValueType) {
    if (value1 == null || value2 == null) {
        return true;
    }
    var compareResult = CompareObjects(value1, value2, compareValueType);
    if (compareResult == null) {
        return true;
    }
    switch (comparisonOperator) {
        case 1: //Equal:
            return compareResult == 0;
        case 2: //NotEqual:
            return compareResult != 0;
        case 3: //GreaterThan:
            return compareResult > 0;
        case 4: //GreaterThanEqual:
            return compareResult >= 0;
        case 5: //LessThan:
            return compareResult < 0;
        case 6: //LessThanEqual:
            return compareResult <= 0;
    }
    return true; // Ignore unrecognized operator
}

function CustomCompare_IsValid(value, element, params, validator) {
    if (jQuery.validator.prototype.optional(element)) { return true; }
    var elemid = $(element).attr("id");
    var prefix = elemid.lastIndexOf(".") > 0 ? elemid.substring(0, elemid.lastIndexOf(".")) : "";
    var elemToCompare = $("#" + prefix + params.compareTo);
    elemToCompare.rules("remove", "validate_dependent_property");
    elemToCompare.rules("add", { validate_dependent_property: elemid });
    return Compare(value, elemToCompare.val(), params.comparisonOperator, params.compareValueType);
}

function RequiredDepended_IsValid(value, element, params, validator) {
    var elemid = $(element).attr("id");
    var prefix = elemid.lastIndexOf(".") > 0 ? elemid.substring(0, elemid.lastIndexOf(".")) : "";
    var elemToDepend = $("#" + prefix + params.dependedTo);
    elemToDepend.rules("remove", "validate_dependent_property");
    elemToDepend.rules("add", { validate_dependent_property: elemid });
    if (Compare(elemToDepend.val(), params.dependedValue, params.dependedValueComparisonOperator, params.dependedValueType)) {
        return jQuery.validator.methods["required"].call(validator, value.replace(/\r/g, ""), element, "");
    }
    return true;
}

function DataTypeDepended_IsValid(value, element, params, validator) {
    var elemid = $(element).attr("id");
    var prefix = elemid.lastIndexOf(".") > 0 ? elemid.substring(0, elemid.lastIndexOf(".")) : "";
    var elemToDepend = $("#" + prefix + params.dependedTo);
    elemToDepend.rules("remove", "validate_dependent_property");
    elemToDepend.rules("add", { validate_dependent_property: elemid });
    if (Compare(elemToDepend.val(), params.dependedValue, params.dependedValueComparisonOperator, params.dependedValueType)) {
        return CustomDataType_IsValid(value, element, { dataType: params.dataType }, validator);
    }
    return true;
}

function StringLengthDepended_IsValid(value, element, params, validator) {
    var elemid = $(element).attr("id");
    var prefix = elemid.lastIndexOf(".") > 0 ? elemid.substring(0, elemid.lastIndexOf(".")) : "";
    var elemToDepend = $("#" + prefix + params.dependedTo);
    elemToDepend.rules("remove", "validate_dependent_property");
    elemToDepend.rules("add", { validate_dependent_property: elemid });
    if (Compare(elemToDepend.val(), params.dependedValue, params.dependedValueComparisonOperator, params.dependedValueType)) {
        return CustomStringLength_IsValid(value, element, { minimum: params.minimum, maximum: params.maximum }, validator);
    }
    return true;
}

function CompareDepended_IsValid(value, element, params, validator) {
    var elemid = $(element).attr("id");
    var prefix = elemid.lastIndexOf(".") > 0 ? elemid.substring(0, elemid.lastIndexOf(".")) : "";
    var elemToDepend = $("#" + prefix + params.dependedTo);
    elemToDepend.rules("remove", "validate_dependent_property");
    elemToDepend.rules("add", { validate_dependent_property: elemid });

    var elemToCompare = $("#" + prefix + params.compareTo);
    elemToCompare.rules("remove", "validate_dependent_property");

    if (Compare(elemToDepend.val(), params.dependedValue, params.dependedValueComparisonOperator, params.dependedValueType)) {
        return CustomCompare_IsValid(value, element, { compareTo: params.compareTo, comparisonOperator: params.comparisonOperator, compareValueType: params.compareValueType }, validator);
    }
    return true;
}

