Advertisement
Shimmy

Untitled

Apr 26th, 2015
514
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (function ($) {
  2.     var $jQval = $.validator,
  3.         adapters, data_validation = "unobtrusiveValidation";
  4.  
  5.     function setValidationValues(options, ruleName, value) {
  6.         options.rules[ruleName] = value;
  7.         if (options.message) {
  8.             options.messages[ruleName] = options.message;
  9.         }
  10.     }
  11.     function splitAndTrim(value) {
  12.         return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g);
  13.     }
  14.     function escapeAttributeValue(value) {
  15.         return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1");
  16.    }
  17.    function getModelPrefix(fieldName) {
  18.        return fieldName.substr(0, fieldName.lastIndexOf(".") + 1);
  19.    }
  20.    function appendModelPrefix(value, prefix) {
  21.        if (value.indexOf("*.") === 0) {
  22.            value = value.replace("*.", prefix);
  23.        }
  24.        return value;
  25.    }
  26.    function onError(error, inputElement) {
  27.        var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
  28.            replaceAttrValue = container.attr("data-valmsg-replace"),
  29.            replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;
  30.        container.removeClass("field-validation-valid").addClass("field-validation-error");
  31.        error.data("unobtrusiveContainer", container);
  32.        if (replace) {
  33.            container.empty();
  34.            error.removeClass("input-validation-error").appendTo(container);
  35.        } else {
  36.            error.hide();
  37.        }
  38.    }
  39.    function onErrors(event, validator) {
  40.        var container = $(this).find("[data-valmsg-summary=true]"),
  41.            list = container.find("ul");
  42.        if (list && list.length && validator.errorList.length) {
  43.            list.empty();
  44.            container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
  45.            $.each(validator.errorList, function () {
  46.                $("<li />").html(this.message).appendTo(list);
  47.            });
  48.        }
  49.    }
  50.    function onSuccess(error) {
  51.        var container = error.data("unobtrusiveContainer"),
  52.            replaceAttrValue = container.attr("data-valmsg-replace"),
  53.            replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;
  54.        if (container) {
  55.            container.addClass("field-validation-valid").removeClass("field-validation-error");
  56.            error.removeData("unobtrusiveContainer");
  57.            if (replace) {
  58.                container.empty();
  59.            }
  60.        }
  61.    }
  62.    function onReset(event) {
  63.        var $form = $(this),
  64.            key = '__jquery_unobtrusive_validation_form_reset';
  65.        if ($form.data(key)) {
  66.            return;
  67.        }
  68.        $form.data(key, true);
  69.        try {
  70.            $form.data("validator").resetForm();
  71.        } finally {
  72.            $form.removeData(key);
  73.        }
  74.        $form.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors");
  75.        $form.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer");
  76.    }
  77.    function validationInfo(form) {
  78.        var $form = $(form),
  79.            result = $form.data(data_validation),
  80.            onResetProxy = $.proxy(onReset, form),
  81.            defaultOptions = $jQval.unobtrusive.options || {}, execInContext = function (name, args) {
  82.                var func = defaultOptions[name];
  83.                func && $.isFunction(func) && func.apply(form, args);
  84.            }
  85.        if (!result) {
  86.            result = {
  87.                options: {
  88.                    errorClass: defaultOptions.errorClass || "input-validation-error",
  89.                    errorElement: defaultOptions.errorElement || "span",
  90.                    errorPlacement: function () {
  91.                        onError.apply(form, arguments);
  92.                        execInContext("errorPlacement", arguments);
  93.                    },
  94.                    invalidHandler: function () {
  95.                        onErrors.apply(form, arguments);
  96.                        execInContext("invalidHandler", arguments);
  97.                    },
  98.                    messages: {},
  99.                    rules: {},
  100.                    success: function () {
  101.                        onSuccess.apply(form, arguments);
  102.                        execInContext("success", arguments);
  103.                    }
  104.                },
  105.                attachValidation: function () {
  106.                    $form.off("reset." + data_validation, onResetProxy).on("reset." + data_validation, onResetProxy).validate(this.options);
  107.                },
  108.                validate: function () {
  109.                    $form.validate();
  110.                    return $form.valid();
  111.                }
  112.            };
  113.            $form.data(data_validation, result);
  114.        }
  115.        return result;
  116.    }
  117.    $jQval.unobtrusive = {
  118.        adapters: [],
  119.        parseElement: function (element, skipAttach) {
  120.            var $element = $(element),
  121.                form = $element.parents("form")[0],
  122.                valInfo, rules, messages;
  123.            if (!form) {
  124.                return;
  125.            }
  126.            valInfo = validationInfo(form);
  127.            valInfo.options.rules[element.name] = rules = {};
  128.            valInfo.options.messages[element.name] = messages = {};
  129.            $.each(this.adapters, function () {
  130.                var prefix = "data-val-" + this.name,
  131.                    message = $element.attr(prefix),
  132.                    paramValues = {};
  133.                if (message !== undefined) {
  134.                    prefix += "-";
  135.                    $.each(this.params, function () {
  136.                        paramValues[this] = $element.attr(prefix + this);
  137.                    });
  138.                    this.adapt({
  139.                        element: element,
  140.                        form: form,
  141.                        message: message,
  142.                        params: paramValues,
  143.                        rules: rules,
  144.                        messages: messages
  145.                    });
  146.                }
  147.            });
  148.            $.extend(rules, {
  149.                "__dummy__": true
  150.            });
  151.            if (!skipAttach) {
  152.                valInfo.attachValidation();
  153.            }
  154.        },
  155.        parse: function (selector) {
  156.            var $selector = $(selector),
  157.                $forms = $selector.parents().addBack().filter("form").add($selector.find("form")).has("[data-val=true]");
  158.            $selector.find("[data-val=true]").each(function () {
  159.                $jQval.unobtrusive.parseElement(this, true);
  160.            });
  161.            $forms.each(function () {
  162.                var info = validationInfo(this);
  163.                if (info) {
  164.                    info.attachValidation();
  165.                }
  166.            });
  167.        }
  168.    };
  169.    adapters = $jQval.unobtrusive.adapters;
  170.    adapters.add = function (adapterName, params, fn) {
  171.        if (!fn) {
  172.            fn = params;
  173.            params = [];
  174.        }
  175.        this.push({
  176.            name: adapterName,
  177.            params: params,
  178.            adapt: fn
  179.        });
  180.        return this;
  181.    };
  182.    adapters.addBool = function (adapterName, ruleName) {
  183.        return this.add(adapterName, function (options) {
  184.            setValidationValues(options, ruleName || adapterName, true);
  185.        });
  186.    };
  187.    adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {
  188.        return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) {
  189.            var min = options.params.min,
  190.                max = options.params.max;
  191.            if (min && max) {
  192.                setValidationValues(options, minMaxRuleName, [min, max]);
  193.            } else if (min) {
  194.                setValidationValues(options, minRuleName, min);
  195.            } else if (max) {
  196.                setValidationValues(options, maxRuleName, max);
  197.            }
  198.        });
  199.    };
  200.    adapters.addSingleVal = function (adapterName, attribute, ruleName) {
  201.        return this.add(adapterName, [attribute || "val"], function (options) {
  202.            setValidationValues(options, ruleName || adapterName, options.params[attribute]);
  203.        });
  204.    };
  205.    $jQval.addMethod("__dummy__", function (value, element, params) {
  206.        return true;
  207.    });
  208.    $jQval.addMethod("regex", function (value, element, params) {
  209.        var match;
  210.        if (this.optional(element)) {
  211.            return true;
  212.        }
  213.        match = new RegExp(params).exec(value);
  214.        return (match && (match.index === 0) && (match[0].length === value.length));
  215.    });
  216.    $jQval.addMethod("nonalphamin", function (value, element, nonalphamin) {
  217.        var match;
  218.        if (nonalphamin) {
  219.            match = value.match(/\W/g);
  220.            match = match && match.length >= nonalphamin;
  221.        }
  222.        return match;
  223.    });
  224.    if ($jQval.methods.extension) {
  225.        adapters.addSingleVal("accept", "mimtype");
  226.        adapters.addSingleVal("extension", "extension");
  227.    } else {
  228.        adapters.addSingleVal("extension", "extension", "accept");
  229.    }
  230.    adapters.addSingleVal("regex", "pattern");
  231.    adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");
  232.    adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range");
  233.    adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength");
  234.    adapters.add("equalto", ["other"], function (options) {
  235.        var prefix = getModelPrefix(options.element.name),
  236.            other = options.params.other,
  237.            fullOtherName = appendModelPrefix(other, prefix),
  238.            element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0];
  239.        setValidationValues(options, "equalTo", element);
  240.    });
  241.    adapters.add("required", function (options) {
  242.        if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") {
  243.            setValidationValues(options, "required", true);
  244.        }
  245.    });
  246.    adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
  247.        var value = {
  248.            url: options.params.url,
  249.            type: options.params.type || "GET",
  250.            data: {}
  251.        }, prefix = getModelPrefix(options.element.name);
  252.        $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
  253.            var paramName = appendModelPrefix(fieldName, prefix);
  254.            value.data[paramName] = function () {
  255.                var field = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']");
  256.                if (field.is(":checkbox")) {
  257.                    return field.filter(":checked").val() || field.filter(":hidden").val() || '';
  258.                } else if (field.is(":radio")) {
  259.                    return field.filter(":checked").val() || '';
  260.                }
  261.                return field.val();
  262.            };
  263.        });
  264.        setValidationValues(options, "remote", value);
  265.    });
  266.    adapters.add("password", ["min", "nonalphamin", "regex"], function (options) {
  267.        if (options.params.min) {
  268.            setValidationValues(options, "minlength", options.params.min);
  269.        }
  270.        if (options.params.nonalphamin) {
  271.            setValidationValues(options, "nonalphamin", options.params.nonalphamin);
  272.        }
  273.        if (options.params.regex) {
  274.            setValidationValues(options, "regex", options.params.regex);
  275.        }
  276.    });
  277.    $(function () {
  278.        $jQval.unobtrusive.parse(document);
  279.    });
  280. }(jQuery));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement