﻿$(function () {
    function escapeAttributeValue(value) {
        return value.replace(/([!"#$%&'()*+,./:;<=>?@@\[\\\]^`{|}~])/g, "\\$1");
    }

    function getModelPrefix(fieldName) {
        return fieldName.substr(0, fieldName.lastIndexOf(".") + 1);
    }

    function appendModelPrefix(value, prefix) {
        if (value.indexOf("*.") === 0) {
            value = value.replace("*.", prefix);
        }
        return value;
    }

    jQuery.validator.unobtrusive.adapters.add("requiredif", ["otherproperty", "otherpropertyvalue"],
        function (options) {
            options.rules["requiredif"] = options.params;
            options.messages["requiredif"] = options.message
        });
    jQuery.validator.unobtrusive.adapters.add("regularexpressionif", ["otherproperty", "otherpropertyvalue", "pattern"],
        function (options) {
            options.rules["regularexpressionif"] = options.params;
            options.messages["regularexpressionif"] = options.message
        });
    jQuery.validator.unobtrusive.adapters.add("compareif", ["otherproperty", "otherpropertyvalue", "other"],
        function (options) {

            var prefix = getModelPrefix(options.element.name),
                other = options.params.other,
                fullOtherName = appendModelPrefix(other, prefix),
                element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0];

            options.params.other = element.id;
            options.rules["compareif"] = options.params;
            options.messages["compareif"] = options.message;

        });

    jQuery.validator.unobtrusive.adapters.add("booleanrequired",
        function (options) {
            options.rules["booleanrequired"] = options.params;
            options.messages["booleanrequired"] = options.message;
        });

    jQuery.validator.unobtrusive.adapters.add("ensureminimumelementsselected", ["minimumelements", "selectedelementspropertyname", "ignoreselectionpropertyname"],

        function (options) {

            options.rules["ensureminimumelementsselected"] = options.params;
            options.messages["ensureminimumelementsselected"] = options.message;
        });

}(jQuery));

(function ($) {
    jQuery.validator.addMethod("requiredif",
        function (value, element, parameters) {
            var targetElementId = '#' + parameters.otherproperty;
            var targetElementDesiredValue = parameters.otherpropertyvalue;
            var targetElementCurrentValue = null;


            if ($(targetElementId).length) {
                targetElementCurrentValue = $(targetElementId).val();
            } else {
                var selected = $("input[type='radio'][name='" + parameters.otherproperty + "']:checked");
                if (selected.length > 0) {
                    targetElementCurrentValue = selected.val();
                }
            }

            if (targetElementCurrentValue == targetElementDesiredValue) {

                var isValid = $.validator.methods.required.call(this, value, element, parameters);
                return isValid;
            }
            return true;
        }
    );
    jQuery.validator.addMethod("regularexpressionif",
        function (value, element, parameters) {

            var targetElementId = '#' + parameters.otherproperty;
            var targetElementDesiredValue = parameters.otherpropertyvalue;
            var pattern = parameters.pattern;

            if ($(targetElementId).val() == targetElementDesiredValue) {
                var isValid = $.validator.methods.regex.call(this, value, element, pattern);
                return isValid;
            }

            return true;
        }
    );
    jQuery.validator.addMethod("compareif",
        function (value, element, parameters) {

            var targetElementId = '#' + parameters.otherproperty;
            var targetElementDesiredValue = parameters.otherpropertyvalue;

            if ($(targetElementId).val() == targetElementDesiredValue) {

                var isValid = $.validator.methods.equalTo.call(this, value, element, $('#' + parameters.other));
                return isValid;
            }

            return true;
        }
    );
    jQuery.validator.addMethod("booleanrequired",
        function (value, element, parameters) {

            return value === 'true';
        }
    );
    jQuery.validator.addMethod("ensureminimumelementsselected",


        function (value, element, parameters) {

            var minimumElements = parameters.minimumelements;
            var selectedElementsPropertyName = parameters.selectedelementspropertyname;
            var elementName = element.name;

            var selectedElements = $("input:not([type=hidden])[name^='" + elementName + "\['][name$='\]." + selectedElementsPropertyName + "']:checked:enabled");

            return selectedElements.length >= minimumElements;
        }
    );
})(jQuery);