{"version":3,"file":"jquery/jquery.validate.unobtrusive.js","sources":["jquery/jquery.validate.unobtrusive.js"],"sourcesContent":["// Unobtrusive validation support library for jQuery and jQuery Validate\r\n// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n// @version v3.2.12\r\n\r\n/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */\r\n/*global document: false, jQuery: false */\r\n\r\n(function (factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n // AMD. Register as an anonymous module.\r\n define(\"jquery.validate.unobtrusive\", ['jquery-validation'], factory);\r\n } else if (typeof module === 'object' && module.exports) {\r\n // CommonJS-like environments that support module.exports\r\n module.exports = factory(require('jquery-validation'));\r\n } else {\r\n // Browser global\r\n jQuery.validator.unobtrusive = factory(jQuery);\r\n }\r\n}(function ($) {\r\n var $jQval = $.validator,\r\n adapters,\r\n data_validation = \"unobtrusiveValidation\";\r\n\r\n function setValidationValues(options, ruleName, value) {\r\n options.rules[ruleName] = value;\r\n if (options.message) {\r\n options.messages[ruleName] = options.message;\r\n }\r\n }\r\n\r\n function splitAndTrim(value) {\r\n return value.replace(/^\\s+|\\s+$/g, \"\").split(/\\s*,\\s*/g);\r\n }\r\n\r\n function escapeAttributeValue(value) {\r\n // As mentioned on http://api.jquery.com/category/selectors/\r\n return value.replace(/([!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^`{|}~])/g, \"\\\\$1\");\r\n }\r\n\r\n function getModelPrefix(fieldName) {\r\n return fieldName.substr(0, fieldName.lastIndexOf(\".\") + 1);\r\n }\r\n\r\n function appendModelPrefix(value, prefix) {\r\n if (value.indexOf(\"*.\") === 0) {\r\n value = value.replace(\"*.\", prefix);\r\n }\r\n return value;\r\n }\r\n\r\n function onError(error, inputElement) { // 'this' is the form element\r\n var container = $(this).find(\"[data-valmsg-for='\" + escapeAttributeValue(inputElement[0].name) + \"']\"),\r\n replaceAttrValue = container.attr(\"data-valmsg-replace\"),\r\n replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;\r\n\r\n container.removeClass(\"field-validation-valid\").addClass(\"field-validation-error\");\r\n error.data(\"unobtrusiveContainer\", container);\r\n\r\n if (replace) {\r\n container.empty();\r\n error.removeClass(\"input-validation-error\").appendTo(container);\r\n }\r\n else {\r\n error.hide();\r\n }\r\n }\r\n\r\n function onErrors(event, validator) { // 'this' is the form element\r\n var container = $(this).find(\"[data-valmsg-summary=true]\"),\r\n list = container.find(\"ul\");\r\n\r\n if (list && list.length && validator.errorList.length) {\r\n list.empty();\r\n container.addClass(\"validation-summary-errors\").removeClass(\"validation-summary-valid\");\r\n\r\n $.each(validator.errorList, function () {\r\n $(\"
  • \").html(this.message).appendTo(list);\r\n });\r\n }\r\n }\r\n\r\n function onSuccess(error) { // 'this' is the form element\r\n var container = error.data(\"unobtrusiveContainer\");\r\n\r\n if (container) {\r\n var replaceAttrValue = container.attr(\"data-valmsg-replace\"),\r\n replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;\r\n\r\n container.addClass(\"field-validation-valid\").removeClass(\"field-validation-error\");\r\n error.removeData(\"unobtrusiveContainer\");\r\n\r\n if (replace) {\r\n container.empty();\r\n }\r\n }\r\n }\r\n\r\n function onReset(event) { // 'this' is the form element\r\n var $form = $(this),\r\n key = '__jquery_unobtrusive_validation_form_reset';\r\n if ($form.data(key)) {\r\n return;\r\n }\r\n // Set a flag that indicates we're currently resetting the form.\r\n $form.data(key, true);\r\n try {\r\n $form.data(\"validator\").resetForm();\r\n } finally {\r\n $form.removeData(key);\r\n }\r\n\r\n $form.find(\".validation-summary-errors\")\r\n .addClass(\"validation-summary-valid\")\r\n .removeClass(\"validation-summary-errors\");\r\n $form.find(\".field-validation-error\")\r\n .addClass(\"field-validation-valid\")\r\n .removeClass(\"field-validation-error\")\r\n .removeData(\"unobtrusiveContainer\")\r\n .find(\">*\") // If we were using valmsg-replace, get the underlying error\r\n .removeData(\"unobtrusiveContainer\");\r\n }\r\n\r\n function validationInfo(form) {\r\n var $form = $(form),\r\n result = $form.data(data_validation),\r\n onResetProxy = $.proxy(onReset, form),\r\n defaultOptions = $jQval.unobtrusive.options || {},\r\n execInContext = function (name, args) {\r\n var func = defaultOptions[name];\r\n func && $.isFunction(func) && func.apply(form, args);\r\n };\r\n\r\n if (!result) {\r\n result = {\r\n options: { // options structure passed to jQuery Validate's validate() method\r\n errorClass: defaultOptions.errorClass || \"input-validation-error\",\r\n errorElement: defaultOptions.errorElement || \"span\",\r\n errorPlacement: function () {\r\n onError.apply(form, arguments);\r\n execInContext(\"errorPlacement\", arguments);\r\n },\r\n invalidHandler: function () {\r\n onErrors.apply(form, arguments);\r\n execInContext(\"invalidHandler\", arguments);\r\n },\r\n messages: {},\r\n rules: {},\r\n success: function () {\r\n onSuccess.apply(form, arguments);\r\n execInContext(\"success\", arguments);\r\n }\r\n },\r\n attachValidation: function () {\r\n $form\r\n .off(\"reset.\" + data_validation, onResetProxy)\r\n .on(\"reset.\" + data_validation, onResetProxy)\r\n .validate(this.options);\r\n },\r\n validate: function () { // a validation function that is called by unobtrusive Ajax\r\n $form.validate();\r\n return $form.valid();\r\n }\r\n };\r\n $form.data(data_validation, result);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n $jQval.unobtrusive = {\r\n adapters: [],\r\n\r\n parseElement: function (element, skipAttach) {\r\n /// \r\n /// Parses a single HTML element for unobtrusive validation attributes.\r\n /// \r\n /// The HTML element to be parsed.\r\n /// [Optional] true to skip attaching the\r\n /// validation to the form. If parsing just this single element, you should specify true.\r\n /// If parsing several elements, you should specify false, and manually attach the validation\r\n /// to the form when you are finished. The default is false.\r\n var $element = $(element),\r\n form = $element.parents(\"form\")[0],\r\n valInfo, rules, messages;\r\n\r\n if (!form) { // Cannot do client-side validation without a form\r\n return;\r\n }\r\n\r\n valInfo = validationInfo(form);\r\n valInfo.options.rules[element.name] = rules = {};\r\n valInfo.options.messages[element.name] = messages = {};\r\n\r\n $.each(this.adapters, function () {\r\n var prefix = \"data-val-\" + this.name,\r\n message = $element.attr(prefix),\r\n paramValues = {};\r\n\r\n if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy)\r\n prefix += \"-\";\r\n\r\n $.each(this.params, function () {\r\n paramValues[this] = $element.attr(prefix + this);\r\n });\r\n\r\n this.adapt({\r\n element: element,\r\n form: form,\r\n message: message,\r\n params: paramValues,\r\n rules: rules,\r\n messages: messages\r\n });\r\n }\r\n });\r\n\r\n $.extend(rules, { \"__dummy__\": true });\r\n\r\n if (!skipAttach) {\r\n valInfo.attachValidation();\r\n }\r\n },\r\n\r\n parse: function (selector) {\r\n /// \r\n /// Parses all the HTML elements in the specified selector. It looks for input elements decorated\r\n /// with the [data-val=true] attribute value and enables validation according to the data-val-*\r\n /// attribute values.\r\n /// \r\n /// Any valid jQuery selector.\r\n\r\n // $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one\r\n // element with data-val=true\r\n var $selector = $(selector),\r\n $forms = $selector.parents()\r\n .addBack()\r\n .filter(\"form\")\r\n .add($selector.find(\"form\"))\r\n .has(\"[data-val=true]\");\r\n\r\n $selector.find(\"[data-val=true]\").each(function () {\r\n $jQval.unobtrusive.parseElement(this, true);\r\n });\r\n\r\n $forms.each(function () {\r\n var info = validationInfo(this);\r\n if (info) {\r\n info.attachValidation();\r\n }\r\n });\r\n }\r\n };\r\n\r\n adapters = $jQval.unobtrusive.adapters;\r\n\r\n adapters.add = function (adapterName, params, fn) {\r\n /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.\r\n /// The name of the adapter to be added. This matches the name used\r\n /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).\r\n /// [Optional] An array of parameter names (strings) that will\r\n /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and\r\n /// mmmm is the parameter name).\r\n /// The function to call, which adapts the values from the HTML\r\n /// attributes into jQuery Validate rules and/or messages.\r\n /// \r\n if (!fn) { // Called with no params, just a function\r\n fn = params;\r\n params = [];\r\n }\r\n this.push({ name: adapterName, params: params, adapt: fn });\r\n return this;\r\n };\r\n\r\n adapters.addBool = function (adapterName, ruleName) {\r\n /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\r\n /// the jQuery Validate validation rule has no parameter values.\r\n /// The name of the adapter to be added. This matches the name used\r\n /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).\r\n /// [Optional] The name of the jQuery Validate rule. If not provided, the value\r\n /// of adapterName will be used instead.\r\n /// \r\n return this.add(adapterName, function (options) {\r\n setValidationValues(options, ruleName || adapterName, true);\r\n });\r\n };\r\n\r\n adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {\r\n /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\r\n /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and\r\n /// one for min-and-max). The HTML parameters are expected to be named -min and -max.\r\n /// The name of the adapter to be added. This matches the name used\r\n /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).\r\n /// The name of the jQuery Validate rule to be used when you only\r\n /// have a minimum value.\r\n /// The name of the jQuery Validate rule to be used when you only\r\n /// have a maximum value.\r\n /// The name of the jQuery Validate rule to be used when you\r\n /// have both a minimum and maximum value.\r\n /// [Optional] The name of the HTML attribute that\r\n /// contains the minimum value. The default is \"min\".\r\n /// [Optional] The name of the HTML attribute that\r\n /// contains the maximum value. The default is \"max\".\r\n /// \r\n return this.add(adapterName, [minAttribute || \"min\", maxAttribute || \"max\"], function (options) {\r\n var min = options.params.min,\r\n max = options.params.max;\r\n\r\n if (min && max) {\r\n setValidationValues(options, minMaxRuleName, [min, max]);\r\n }\r\n else if (min) {\r\n setValidationValues(options, minRuleName, min);\r\n }\r\n else if (max) {\r\n setValidationValues(options, maxRuleName, max);\r\n }\r\n });\r\n };\r\n\r\n adapters.addSingleVal = function (adapterName, attribute, ruleName) {\r\n /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\r\n /// the jQuery Validate validation rule has a single value.\r\n /// The name of the adapter to be added. This matches the name used\r\n /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).\r\n /// [Optional] The name of the HTML attribute that contains the value.\r\n /// The default is \"val\".\r\n /// [Optional] The name of the jQuery Validate rule. If not provided, the value\r\n /// of adapterName will be used instead.\r\n /// \r\n return this.add(adapterName, [attribute || \"val\"], function (options) {\r\n setValidationValues(options, ruleName || adapterName, options.params[attribute]);\r\n });\r\n };\r\n\r\n $jQval.addMethod(\"__dummy__\", function (value, element, params) {\r\n return true;\r\n });\r\n\r\n $jQval.addMethod(\"regex\", function (value, element, params) {\r\n var match;\r\n if (this.optional(element)) {\r\n return true;\r\n }\r\n\r\n match = new RegExp(params).exec(value);\r\n return (match && (match.index === 0) && (match[0].length === value.length));\r\n });\r\n\r\n $jQval.addMethod(\"nonalphamin\", function (value, element, nonalphamin) {\r\n var match;\r\n if (nonalphamin) {\r\n match = value.match(/\\W/g);\r\n match = match && match.length >= nonalphamin;\r\n }\r\n return match;\r\n });\r\n\r\n if ($jQval.methods.extension) {\r\n adapters.addSingleVal(\"accept\", \"mimtype\");\r\n adapters.addSingleVal(\"extension\", \"extension\");\r\n } else {\r\n // for backward compatibility, when the 'extension' validation method does not exist, such as with versions\r\n // of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for\r\n // validating the extension, and ignore mime-type validations as they are not supported.\r\n adapters.addSingleVal(\"extension\", \"extension\", \"accept\");\r\n }\r\n\r\n adapters.addSingleVal(\"regex\", \"pattern\");\r\n adapters.addBool(\"creditcard\").addBool(\"date\").addBool(\"digits\").addBool(\"email\").addBool(\"number\").addBool(\"url\");\r\n adapters.addMinMax(\"length\", \"minlength\", \"maxlength\", \"rangelength\").addMinMax(\"range\", \"min\", \"max\", \"range\");\r\n adapters.addMinMax(\"minlength\", \"minlength\").addMinMax(\"maxlength\", \"minlength\", \"maxlength\");\r\n adapters.add(\"equalto\", [\"other\"], function (options) {\r\n var prefix = getModelPrefix(options.element.name),\r\n other = options.params.other,\r\n fullOtherName = appendModelPrefix(other, prefix),\r\n element = $(options.form).find(\":input\").filter(\"[name='\" + escapeAttributeValue(fullOtherName) + \"']\")[0];\r\n\r\n setValidationValues(options, \"equalTo\", element);\r\n });\r\n adapters.add(\"required\", function (options) {\r\n // jQuery Validate equates \"required\" with \"mandatory\" for checkbox elements\r\n if (options.element.tagName.toUpperCase() !== \"INPUT\" || options.element.type.toUpperCase() !== \"CHECKBOX\") {\r\n setValidationValues(options, \"required\", true);\r\n }\r\n });\r\n adapters.add(\"remote\", [\"url\", \"type\", \"additionalfields\"], function (options) {\r\n var value = {\r\n url: options.params.url,\r\n type: options.params.type || \"GET\",\r\n data: {}\r\n },\r\n prefix = getModelPrefix(options.element.name);\r\n\r\n $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {\r\n var paramName = appendModelPrefix(fieldName, prefix);\r\n value.data[paramName] = function () {\r\n var field = $(options.form).find(\":input\").filter(\"[name='\" + escapeAttributeValue(paramName) + \"']\");\r\n // For checkboxes and radio buttons, only pick up values from checked fields.\r\n if (field.is(\":checkbox\")) {\r\n return field.filter(\":checked\").val() || field.filter(\":hidden\").val() || '';\r\n }\r\n else if (field.is(\":radio\")) {\r\n return field.filter(\":checked\").val() || '';\r\n }\r\n return field.val();\r\n };\r\n });\r\n\r\n setValidationValues(options, \"remote\", value);\r\n });\r\n adapters.add(\"password\", [\"min\", \"nonalphamin\", \"regex\"], function (options) {\r\n if (options.params.min) {\r\n setValidationValues(options, \"minlength\", options.params.min);\r\n }\r\n if (options.params.nonalphamin) {\r\n setValidationValues(options, \"nonalphamin\", options.params.nonalphamin);\r\n }\r\n if (options.params.regex) {\r\n setValidationValues(options, \"regex\", options.params.regex);\r\n }\r\n });\r\n adapters.add(\"fileextensions\", [\"extensions\"], function (options) {\r\n setValidationValues(options, \"extension\", options.params.extensions);\r\n });\r\n\r\n $(function () {\r\n $jQval.unobtrusive.parse(document);\r\n });\r\n\r\n return $jQval.unobtrusive;\r\n}));\r\n"],"names":["factory","define","amd","module","exports","require","jQuery","validator","unobtrusive","$","adapters","$jQval","data_validation","setValidationValues","options","ruleName","value","rules","message","messages","escapeAttributeValue","replace","getModelPrefix","fieldName","substr","lastIndexOf","appendModelPrefix","prefix","indexOf","onReset","event","$form","this","key","data","resetForm","removeData","find","addClass","removeClass","validationInfo","form","execInContext","name","args","func","defaultOptions","isFunction","apply","result","onResetProxy","proxy","errorClass","errorElement","errorPlacement","onError","error","inputElement","container","replaceAttrValue","attr","parseJSON","empty","appendTo","hide","arguments","invalidHandler","onErrors","list","length","errorList","each","html","success","onSuccess","attachValidation","off","on","validate","valid","parseElement","element","skipAttach","valInfo","$element","parents","paramValues","undefined","params","adapt","extend","__dummy__","parse","selector","$selector","$forms","addBack","filter","add","has","info","adapterName","fn","push","addBool","addMinMax","minRuleName","maxRuleName","minMaxRuleName","minAttribute","maxAttribute","min","max","addSingleVal","attribute","addMethod","optional","match","RegExp","exec","index","nonalphamin","methods","extension","fullOtherName","other","tagName","toUpperCase","type","url","additionalfields","split","i","paramName","field","is","val","regex","extensions","document"],"mappings":"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"}