parsley-rails 2.7.0.0 → 2.8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["parsley.js","src/parsley/utils.js","src/parsley/defaults.js","src/parsley/base.js","src/parsley/validator.js","src/parsley/validator_registry.js","src/parsley/ui.js","src/parsley/form.js","src/parsley/constraint.js","src/parsley/field.js","src/parsley/multiple.js","src/parsley/factory.js","src/parsley/main.js","src/parsley/pubsub.js","src/parsley/remote.js","src/i18n/en.js","src/vendor/inputevent.js","src/parsley.js"],"names":[],"mappings":"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","file":"parsley.js","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :\n typeof define === 'function' && define.amd ? define(['jquery'], factory) :\n global.parsley = factory(global.$)\n}(this, function ($) { 'use strict';\n\n var globalID = 1;\n var pastWarnings = {};\n\n var Utils__Utils = {\n // Parsley DOM-API\n // returns object from dom attributes and values\n attr: function ($element, namespace, obj) {\n var i;\n var attribute;\n var attributes;\n var regex = new RegExp('^' + namespace, 'i');\n\n if ('undefined' === typeof obj)\n obj = {};\n else {\n // Clear all own properties. This won't affect prototype's values\n for (i in obj) {\n if (obj.hasOwnProperty(i))\n delete obj[i];\n }\n }\n\n if ('undefined' === typeof $element || 'undefined' === typeof $element[0])\n return obj;\n\n attributes = $element[0].attributes;\n for (i = attributes.length; i--; ) {\n attribute = attributes[i];\n\n if (attribute && attribute.specified && regex.test(attribute.name)) {\n obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n }\n }\n\n return obj;\n },\n\n checkAttr: function ($element, namespace, checkAttr) {\n return $element.is('[' + namespace + checkAttr + ']');\n },\n\n setAttr: function ($element, namespace, attr, value) {\n $element[0].setAttribute(this.dasherize(namespace + attr), String(value));\n },\n\n generateID: function () {\n return '' + globalID++;\n },\n\n /** Third party functions **/\n // Zepto deserialize function\n deserializeValue: function (value) {\n var num;\n\n try {\n return value ?\n value == \"true\" ||\n (value == \"false\" ? false :\n value == \"null\" ? null :\n !isNaN(num = Number(value)) ? num :\n /^[\\[\\{]/.test(value) ? $.parseJSON(value) :\n value)\n : value;\n } catch (e) { return value; }\n },\n\n // Zepto camelize function\n camelize: function (str) {\n return str.replace(/-+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n });\n },\n\n // Zepto dasherize function\n dasherize: function (str) {\n return str.replace(/::/g, '/')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n .replace(/_/g, '-')\n .toLowerCase();\n },\n\n warn: function () {\n if (window.console && 'function' === typeof window.console.warn)\n window.console.warn(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n parse: {\n date: function(string) {\n let parsed = string.match(/^(\\d{4,})-(\\d\\d)-(\\d\\d)$/);\n if (!parsed)\n return null;\n let [_, year, month, day] = parsed.map(x => parseInt(x, 10));\n let date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day)\n return null;\n return date;\n },\n string: function(string) {\n return string;\n },\n integer: function(string) {\n if (isNaN(string))\n return null;\n return parseInt(string, 10);\n },\n number: function(string) {\n if (isNaN(string))\n throw null;\n return parseFloat(string);\n },\n 'boolean': function _boolean(string) {\n return !(/^\\s*false\\s*$/i.test(string));\n },\n object: function(string) {\n return Utils__Utils.deserializeValue(string);\n },\n regexp: function(regexp) {\n var flags = '';\n\n // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n if (/^\\/.*\\/(?:[gimy]*)$/.test(regexp)) {\n // Replace the regexp literal string with the first match group: ([gimy]*)\n // If no flag is present, this will be a blank string\n flags = regexp.replace(/.*\\/([gimy]*)$/, '$1');\n // Again, replace the regexp literal string with the first match group:\n // everything excluding the opening and closing slashes and the flags\n regexp = regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n } else {\n // Anchor regexp:\n regexp = '^' + regexp + '$';\n }\n return new RegExp(regexp, flags);\n }\n },\n\n parseRequirement: function(requirementType, string) {\n var converter = this.parse[requirementType || 'string'];\n if (!converter)\n throw 'Unknown requirement specification: \"' + requirementType + '\"';\n let converted = converter(string);\n if (converted === null)\n throw `Requirement is not a ${requirementType}: \"${string}\"`;\n return converted;\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })(),\n\n _SubmitSelector: 'input[type=\"submit\"], button:submit'\n };\n\n var Utils__default = Utils__Utils;\n\n // All these options could be overriden and specified directly in DOM using\n // `data-parsley-` default DOM-API\n // eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n // eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n\n var Defaults = {\n // ### General\n\n // Default data-namespace for DOM API\n namespace: 'data-parsley-',\n\n // Supported inputs by default\n inputs: 'input, textarea, select',\n\n // Excluded inputs by default\n excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n\n // Stop validating field on highest priority failing constraint\n priorityEnabled: true,\n\n // ### Field only\n\n // identifier used to group together inputs (e.g. radio buttons...)\n multiple: null,\n\n // identifier (or array of identifiers) used to validate only a select group of inputs\n group: null,\n\n // ### UI\n // Enable\\Disable error messages\n uiEnabled: true,\n\n // Key events threshold before validation\n validationThreshold: 3,\n\n // Focused field on form validation error. 'first'|'last'|'none'\n focus: 'first',\n\n // event(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (Field) {},\n\n // Return the `$element` where errors will be appended\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n errorsContainer: function (Field) {},\n\n // ul elem that would receive errors' list\n errorsWrapper: '<ul class=\"parsley-errors-list\"></ul>',\n\n // li elem that would receive error message\n errorTemplate: '<li></li>'\n };\n\n var Base = function () {\n this.__id__ = Utils__default.generateID();\n };\n\n Base.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n Utils__default.attr(this.$element, this.options.namespace, this.domOptions);\n if (this.parent && this.parent.actualizeOptions)\n this.parent.actualizeOptions();\n return this;\n },\n\n _resetOptions: function (initOptions) {\n this.domOptions = Utils__default.objectCreate(this.parent.options);\n this.options = Utils__default.objectCreate(this.domOptions);\n // Shallow copy of ownProperties of initOptions:\n for (var i in initOptions) {\n if (initOptions.hasOwnProperty(i))\n this.options[i] = initOptions[i];\n }\n this.actualizeOptions();\n },\n\n _listeners: null,\n\n // Register a callback for the given event name\n // Callback is called with context as the first argument and the `this`\n // The context is the current parsley instance, or window.Parsley if global\n // A return value of `false` will interrupt the calls\n on: function (name, fn) {\n this._listeners = this._listeners || {};\n var queue = this._listeners[name] = this._listeners[name] || [];\n queue.push(fn);\n\n return this;\n },\n\n // Deprecated. Use `on` instead\n subscribe: function(name, fn) {\n $.listenTo(this, name.toLowerCase(), fn);\n },\n\n // Unregister a callback (or all if none is given) for the given event name\n off: function (name, fn) {\n var queue = this._listeners && this._listeners[name];\n if (queue) {\n if (!fn) {\n delete this._listeners[name];\n } else {\n for (var i = queue.length; i--; )\n if (queue[i] === fn)\n queue.splice(i, 1);\n }\n }\n return this;\n },\n\n // Deprecated. Use `off`\n unsubscribe: function(name, fn) {\n $.unsubscribeTo(this, name.toLowerCase());\n },\n\n // Trigger an event of the given name\n // A return value of `false` interrupts the callback chain\n // Returns false if execution was interrupted\n trigger: function (name, target, extraArg) {\n target = target || this;\n var queue = this._listeners && this._listeners[name];\n var result;\n var parentResult;\n if (queue) {\n for (var i = queue.length; i--; ) {\n result = queue[i].call(target, target, extraArg);\n if (result === false) return result;\n }\n }\n if (this.parent) {\n return this.parent.trigger(name, target, extraArg);\n }\n return true;\n },\n\n asyncIsValid: function (group, force) {\n Utils__default.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n this.parent.$element.find(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`)\n : this.$element;\n }\n };\n\n var convertArrayRequirement = function(string, length) {\n var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n if (!m)\n throw 'Requirement is not an array: \"' + string + '\"';\n var values = m[1].split(',').map(Utils__default.trimString);\n if (values.length !== length)\n throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n return values;\n };\n\n var convertExtraOptionRequirement = function(requirementSpec, string, extraOptionReader) {\n var main = null;\n var extra = {};\n for (var key in requirementSpec) {\n if (key) {\n var value = extraOptionReader(key);\n if ('string' === typeof value)\n value = Utils__default.parseRequirement(requirementSpec[key], value);\n extra[key] = value;\n } else {\n main = Utils__default.parseRequirement(requirementSpec[key], string);\n }\n }\n return [main, extra];\n };\n\n // A Validator needs to implement the methods `validate` and `parseRequirements`\n\n var Validator = function(spec) {\n $.extend(true, this, spec);\n };\n\n Validator.prototype = {\n // Returns `true` iff the given `value` is valid according the given requirements.\n validate: function(value, requirementFirstArg) {\n if (this.fn) { // Legacy style validator\n\n if (arguments.length > 3) // If more args then value, requirement, instance...\n requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest\n return this.fn(value, requirementFirstArg);\n }\n\n if ($.isArray(value)) {\n if (!this.validateMultiple)\n throw 'Validator `' + this.name + '` does not handle multiple values';\n return this.validateMultiple(...arguments);\n } else {\n let instance = arguments[arguments.length - 1];\n if (this.validateDate && instance._isDateInput()) {\n arguments[0] = Utils__default.parse.date(arguments[0]);\n if (arguments[0] === null)\n return false;\n return this.validateDate(...arguments);\n }\n if (this.validateNumber) {\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return $.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if ($.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = Utils__default.parseRequirement(type[i], values[i]);\n return values;\n } else if ($.isPlainObject(type)) {\n return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n } else {\n return [Utils__default.parseRequirement(type, requirements)];\n }\n },\n // Defaults:\n requirementType: 'string',\n\n priority: 2\n\n };\n\n var ValidatorRegistry = function (validators, catalog) {\n this.__class__ = 'ValidatorRegistry';\n\n // Default Parsley locale is en\n this.locale = 'en';\n\n this.init(validators || {}, catalog || {});\n };\n\n var typeTesters = {\n email: /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n date: {\n test: value => Utils__default.parse.date(value) !== null\n },\n\n url: new RegExp(\n \"^\" +\n // protocol identifier\n \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\" +\n // IP address exclusion\n // private & local networks\n // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" + // ** mod: allow local networks\n // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n \"|\" +\n // host name\n \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\" +\n // domain name\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\" +\n // TLD identifier\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\" +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:/\\\\S*)?\" +\n \"$\", 'i'\n )\n };\n typeTesters.range = typeTesters.number;\n\n // See http://stackoverflow.com/a/10454560/8279\n var decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n };\n\n // parseArguments('number', ['1', '2']) => [1, 2]\n let ValidatorRegistry__parseArguments = (type, args) => args.map(Utils__default.parse[type]);\n // operatorToValidator returns a validating function for an operator function, applied to the given type\n let ValidatorRegistry__operatorToValidator = (type, operator) => {\n return (value, ...requirementsAndInput) => {\n requirementsAndInput.pop(); // Get rid of `input` argument\n return operator(value, ...ValidatorRegistry__parseArguments(type, requirementsAndInput));\n };\n };\n\n let ValidatorRegistry__comparisonOperator = operator => ({\n validateDate: ValidatorRegistry__operatorToValidator('date', operator),\n validateNumber: ValidatorRegistry__operatorToValidator('number', operator),\n requirementType: operator.length <= 2 ? 'string' : ['string', 'string'], // Support operators with a 1 or 2 requirement(s)\n priority: 30\n });\n\n ValidatorRegistry.prototype = {\n init: function (validators, catalog) {\n this.catalog = catalog;\n // Copy prototype's validators:\n this.validators = $.extend({}, this.validators);\n\n for (var name in validators)\n this.addValidator(name, validators[name].fn, validators[name].priority);\n\n window.Parsley.trigger('parsley:validator:init');\n },\n\n // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n setLocale: function (locale) {\n if ('undefined' === typeof this.catalog[locale])\n throw new Error(locale + ' is not available in the catalog');\n\n this.locale = locale;\n\n return this;\n },\n\n // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n addCatalog: function (locale, messages, set) {\n if ('object' === typeof messages)\n this.catalog[locale] = messages;\n\n if (true === set)\n return this.setLocale(locale);\n\n return this;\n },\n\n // Add a specific message for a given constraint in a given locale\n addMessage: function (locale, name, message) {\n if ('undefined' === typeof this.catalog[locale])\n this.catalog[locale] = {};\n\n this.catalog[locale][name] = message;\n\n return this;\n },\n\n // Add messages for a given locale\n addMessages: function (locale, nameMessageObject) {\n for (var name in nameMessageObject)\n this.addMessage(locale, name, nameMessageObject[name]);\n\n return this;\n },\n\n // Add a new validator\n //\n // addValidator('custom', {\n // requirementType: ['integer', 'integer'],\n // validateString: function(value, from, to) {},\n // priority: 22,\n // messages: {\n // en: \"Hey, that's no good\",\n // fr: \"Aye aye, pas bon du tout\",\n // }\n // })\n //\n // Old API was addValidator(name, function, priority)\n //\n addValidator: function (name, arg1, arg2) {\n if (this.validators[name])\n Utils__default.warn('Validator \"' + name + '\" is already defined.');\n else if (Defaults.hasOwnProperty(name)) {\n Utils__default.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n return;\n }\n return this._setValidator(...arguments);\n },\n\n updateValidator: function (name, arg1, arg2) {\n if (!this.validators[name]) {\n Utils__default.warn('Validator \"' + name + '\" is not already defined.');\n return this.addValidator(...arguments);\n }\n return this._setValidator(...arguments);\n },\n\n removeValidator: function (name) {\n if (!this.validators[name])\n Utils__default.warn('Validator \"' + name + '\" is not defined.');\n\n delete this.validators[name];\n\n return this;\n },\n\n _setValidator: function (name, validator, priority) {\n if ('object' !== typeof validator) {\n // Old style validator, with `fn` and `priority`\n validator = {\n fn: validator,\n priority: priority\n };\n }\n if (!validator.validate) {\n validator = new Validator(validator);\n }\n this.validators[name] = validator;\n\n for (var locale in validator.messages || {})\n this.addMessage(locale, name, validator.messages[locale]);\n\n return this;\n },\n\n getErrorMessage: function (constraint) {\n var message;\n\n // Type constraints are a bit different, we have to match their requirements too to find right error message\n if ('type' === constraint.name) {\n var typeMessages = this.catalog[this.locale][constraint.name] || {};\n message = typeMessages[constraint.requirements];\n } else\n message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n },\n\n // Kind of light `sprintf()` implementation\n formatMessage: function (string, parameters) {\n if ('object' === typeof parameters) {\n for (var i in parameters)\n string = this.formatMessage(string, parameters[i]);\n\n return string;\n }\n\n return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = 'any', base = 0} = {}) {\n var tester = typeTesters[type];\n if (!tester) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!tester.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: ValidatorRegistry__comparisonOperator((value, requirement) => value >= requirement),\n max: ValidatorRegistry__comparisonOperator((value, requirement) => value <= requirement),\n range: ValidatorRegistry__comparisonOperator((value, min, max) => value >= min && value <= max),\n equalto: {\n validateString: function (value, refOrValue) {\n var $reference = $(refOrValue);\n if ($reference.length)\n return value === $reference.val();\n else\n return value === refOrValue;\n },\n priority: 256\n }\n }\n };\n\n var UI = {};\n\n var diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n };\n\n UI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', Utils__default._SubmitSelector, evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.$element.attr('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n };\n\n UI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = this.options.classHandler.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n\n return this._inputHolder();\n },\n\n _inputHolder: function() {\n // if simple element (input, texatrea, select...) it will perfectly host the classes and precede the error container\n if (!this.options.multiple || this.$element.is('select'))\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof this.options.errorsContainer) {\n if ($(this.options.errorsContainer).length)\n return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);\n else\n Utils__default.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof this.options.errorsContainer)\n $errorsContainer = this.options.errorsContainer.call(this, this);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n return this._inputHolder().after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(Utils__default.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this._validateIfNeeded();\n });\n else if (trigger = Utils__default.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._validateIfNeeded(event);\n });\n }\n },\n\n _validateIfNeeded: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (event && /key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n if (this.options.debounce) {\n window.clearTimeout(this._debounced);\n this._debounced = window.setTimeout(() => this.validate(), this.options.debounce);\n } else\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n };\n\n var Form = function (element, domOptions, options) {\n this.__class__ = 'Form';\n\n this.$element = $(element);\n this.domOptions = domOptions;\n this.options = options;\n this.parent = window.Parsley;\n\n this.fields = [];\n this.validationResult = null;\n };\n\n var Form__statusMapping = {pending: null, resolved: true, rejected: false};\n\n Form.prototype = {\n onSubmitValidate: function (event) {\n // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var $submitSource = this._$submitSource || this.$element.find(Utils__default._SubmitSelector).first();\n this._$submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if ($submitSource.is('[formnovalidate]'))\n return;\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit($submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._$submitSource = $(event.currentTarget);\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function ($submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if ($submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('<input class=\"parsley-synthetic-submit-button\" type=\"hidden\">').appendTo(this.$element);\n $synthetic.attr({\n name: $submitSource.attr('name'),\n value: $submitSource.attr('value')\n });\n }\n\n this.$element.trigger($.extend($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils__default.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return Form__statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = $.extend({}, event, {preventDefault: () => {\n Utils__default.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return Utils__default.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils__default.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return Form__statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return Utils__default.all(promises);\n },\n\n // Reset UI\n reset: function () {\n // Form case: emit a reset event for each field\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n\n // Form case: destroy all its fields and then destroy stored instance\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].destroy();\n\n this.$element.removeData('Parsley');\n this._trigger('destroy');\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `Field` and `FieldMultiple` children\n if (('Field' === fieldInstance.__class__ || 'FieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded)) {\n let uniqueId = fieldInstance.__class__ + '-' + fieldInstance.__id__;\n if ('undefined' === typeof this.fieldsMappedById[uniqueId]) {\n this.fieldsMappedById[uniqueId] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n }\n });\n\n $.each(Utils__default.difference(oldFields, this.fields), (_, field) => {\n field.reset();\n });\n });\n return this;\n },\n\n // Internal only.\n // Looping on a form's fields to do validation or similar\n // will trigger reactualizing options on all of them, which\n // in turn will reactualize the form's options.\n // To avoid calling actualizeOptions so many times on the form\n // for nothing, _withoutReactualizingFormOptions temporarily disables\n // the method actualizeOptions on this form while `fn` is called.\n _withoutReactualizingFormOptions: function (fn) {\n var oldActualizeOptions = this.actualizeOptions;\n this.actualizeOptions = function () { return this; };\n var result = fn();\n this.actualizeOptions = oldActualizeOptions;\n return result;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n // Returns true iff event is not interrupted and default not prevented.\n _trigger: function (eventName) {\n return this.trigger('form:' + eventName);\n }\n\n };\n\n var Constraint = function (parsleyField, name, requirements, priority, isDomConstraint) {\n var validatorSpec = window.Parsley._validatorRegistry.validators[name];\n var validator = new Validator(validatorSpec);\n\n $.extend(this, {\n validator: validator,\n name: name,\n requirements: requirements,\n priority: priority || parsleyField.options[name + 'Priority'] || validator.priority,\n isDomConstraint: true === isDomConstraint\n });\n this._parseRequirements(parsleyField.options);\n };\n\n var capitalize = function(str) {\n var cap = str[0].toUpperCase();\n return cap + str.slice(1);\n };\n\n Constraint.prototype = {\n validate: function(value, instance) {\n return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n };\n\n var Field = function (field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'Field';\n\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n };\n\n var parsley_field__statusMapping = {pending: null, resolved: true, rejected: false};\n\n Field.prototype = {\n // # Public API\n // Validate field and trigger some events for mainly `UI`\n // @returns `true`, an array of the validators that failed, or\n // `null` if validation is not finished. Prefer using whenValidate\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils__default.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `UI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refreshConstraints();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if ($.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils__default.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return parsley_field__statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refreshConstraints();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = Utils__default.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return Utils__default.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return Utils__default.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // Reset UI\n reset: function () {\n this._resetUI();\n return this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n this.$element.removeData('Parsley');\n this.$element.removeData('FieldMultiple');\n this._trigger('destroy');\n },\n\n // Actualize options that could have change since previous validation\n // Re-bind accordingly constraints (could be some new, removed or updated)\n refreshConstraints: function () {\n return this.actualizeOptions()._bindConstraints();\n },\n\n /**\n * Add a new constraint to a field\n *\n * @param {String} name\n * @param {Mixed} requirements optional\n * @param {Number} priority optional\n * @param {Boolean} isDomConstraint optional\n */\n addConstraint: function (name, requirements, priority, isDomConstraint) {\n\n if (window.Parsley._validatorRegistry.validators[name]) {\n var constraint = new Constraint(this, name, requirements, priority, isDomConstraint);\n\n // if constraint already exist, delete it and push new version\n if ('undefined' !== this.constraintsByName[constraint.name])\n this.removeConstraint(constraint.name);\n\n this.constraints.push(constraint);\n this.constraintsByName[constraint.name] = constraint;\n }\n\n return this;\n },\n\n // Remove a constraint\n removeConstraint: function (name) {\n for (var i = 0; i < this.constraints.length; i++)\n if (name === this.constraints[i].name) {\n this.constraints.splice(i, 1);\n break;\n }\n delete this.constraintsByName[name];\n return this;\n },\n\n // Update a constraint (Remove + re-add)\n updateConstraint: function (name, parameters, priority) {\n return this.removeConstraint(name)\n .addConstraint(name, parameters, priority);\n },\n\n // # Internals\n\n // Internal only.\n // Bind constraints from config + options + DOM\n _bindConstraints: function () {\n var constraints = [];\n var constraintsByName = {};\n\n // clean all existing DOM constraints to only keep javascript user constraints\n for (var i = 0; i < this.constraints.length; i++)\n if (false === this.constraints[i].isDomConstraint) {\n constraints.push(this.constraints[i]);\n constraintsByName[this.constraints[i].name] = this.constraints[i];\n }\n\n this.constraints = constraints;\n this.constraintsByName = constraintsByName;\n\n // then re-add Parsley DOM-API constraints\n for (var name in this.options)\n this.addConstraint(name, this.options[name], undefined, true);\n\n // finally, bind special HTML5 constraints\n return this._bindHtml5Constraints();\n },\n\n // Internal only.\n // Bind specific HTML5 constraints to be HTML5 compliant\n _bindHtml5Constraints: function () {\n // html5 required\n if (this.$element.attr('required'))\n this.addConstraint('required', true, undefined, true);\n\n // html5 pattern\n if ('string' === typeof this.$element.attr('pattern'))\n this.addConstraint('pattern', this.$element.attr('pattern'), undefined, true);\n\n // range\n if ('undefined' !== typeof this.$element.attr('min') && 'undefined' !== typeof this.$element.attr('max'))\n this.addConstraint('range', [this.$element.attr('min'), this.$element.attr('max')], undefined, true);\n\n // HTML5 min\n else if ('undefined' !== typeof this.$element.attr('min'))\n this.addConstraint('min', this.$element.attr('min'), undefined, true);\n\n // HTML5 max\n else if ('undefined' !== typeof this.$element.attr('max'))\n this.addConstraint('max', this.$element.attr('max'), undefined, true);\n\n\n // length\n if ('undefined' !== typeof this.$element.attr('minlength') && 'undefined' !== typeof this.$element.attr('maxlength'))\n this.addConstraint('length', [this.$element.attr('minlength'), this.$element.attr('maxlength')], undefined, true);\n\n // HTML5 minlength\n else if ('undefined' !== typeof this.$element.attr('minlength'))\n this.addConstraint('minlength', this.$element.attr('minlength'), undefined, true);\n\n // HTML5 maxlength\n else if ('undefined' !== typeof this.$element.attr('maxlength'))\n this.addConstraint('maxlength', this.$element.attr('maxlength'), undefined, true);\n\n\n // html5 types\n var type = this.$element.attr('type');\n\n if ('undefined' === typeof type)\n return this;\n\n // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n if ('number' === type) {\n return this.addConstraint('type', ['number', {\n step: this.$element.attr('step') || '1',\n base: this.$element.attr('min') || this.$element.attr('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range|date)$/i.test(type)) {\n return this.addConstraint('type', type, undefined, true);\n }\n return this;\n },\n\n // Internal only.\n // Field is required if have required constraint without `false` value\n _isRequired: function () {\n if ('undefined' === typeof this.constraintsByName.required)\n return false;\n\n return false !== this.constraintsByName.required.requirements;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n _trigger: function (eventName) {\n return this.trigger('field:' + eventName);\n },\n\n // Internal only\n // Handles whitespace in a value\n // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n _handleWhitespace: function (value) {\n if (true === this.options.trimValue)\n Utils__default.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n if ('squish' === this.options.whitespace)\n value = value.replace(/\\s{2,}/g, ' ');\n\n if (('trim' === this.options.whitespace) || ('squish' === this.options.whitespace) || (true === this.options.trimValue))\n value = Utils__default.trimString(value);\n\n return value;\n },\n\n _isDateInput: function() {\n var c = this.constraintsByName.type;\n return c && c.requirements === 'date';\n },\n\n // Internal only.\n // Returns the constraints, grouped by descending priority.\n // The result is thus an array of arrays of constraints.\n _getGroupedConstraints: function () {\n if (false === this.options.priorityEnabled)\n return [this.constraints];\n\n var groupedConstraints = [];\n var index = {};\n\n // Create array unique of priorities\n for (var i = 0; i < this.constraints.length; i++) {\n var p = this.constraints[i].priority;\n if (!index[p])\n groupedConstraints.push(index[p] = []);\n index[p].push(this.constraints[i]);\n }\n // Sort them by priority DESC\n groupedConstraints.sort(function (a, b) { return b[0].priority - a[0].priority; });\n\n return groupedConstraints;\n }\n\n };\n\n var parsley_field = Field;\n\n var Multiple = function () {\n this.__class__ = 'FieldMultiple';\n };\n\n Multiple.prototype = {\n // Add new `$element` sibling for multiple field\n addElement: function ($element) {\n this.$elements.push($element);\n\n return this;\n },\n\n // See `Field.refreshConstraints()`\n refreshConstraints: function () {\n var fieldConstraints;\n\n this.constraints = [];\n\n // Select multiple special treatment\n if (this.$element.is('select')) {\n this.actualizeOptions()._bindConstraints();\n\n return this;\n }\n\n // Gather all constraints for each input in the multiple group\n for (var i = 0; i < this.$elements.length; i++) {\n\n // Check if element have not been dynamically removed since last binding\n if (!$('html').has(this.$elements[i]).length) {\n this.$elements.splice(i, 1);\n continue;\n }\n\n fieldConstraints = this.$elements[i].data('FieldMultiple').refreshConstraints().constraints;\n\n for (var j = 0; j < fieldConstraints.length; j++)\n this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n }\n\n return this;\n },\n\n // See `Field.getValue()`\n getValue: function () {\n // Value could be overriden in DOM\n if ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.$element.is('input[type=radio]'))\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n\n // Select multiple case\n if (this.$element.is('select') && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n };\n\n var Factory = function (element, options, parsleyFormInstance) {\n this.$element = $(element);\n\n // If the element has already been bound, returns its saved Parsley instance\n var savedparsleyFormInstance = this.$element.data('Parsley');\n if (savedparsleyFormInstance) {\n\n // If the saved instance has been bound without a Form parent and there is one given in this call, add it\n if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n savedparsleyFormInstance.parent = parsleyFormInstance;\n savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n }\n\n if ('object' === typeof options) {\n $.extend(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && 'Form' !== parsleyFormInstance.__class__)\n throw new Error('Parent instance must be a Form instance');\n\n this.parent = parsleyFormInstance || window.Parsley;\n return this.init(options);\n };\n\n Factory.prototype = {\n init: function (options) {\n this.__class__ = 'Parsley';\n this.__version__ = '2.7.0';\n this.__id__ = Utils__default.generateID();\n\n // Pre-compute options\n this._resetOptions(options);\n\n // A Form instance is obviously a `<form>` element but also every node that is not an input and has the `data-parsley-validate` attribute\n if (this.$element.is('form') || (Utils__default.checkAttr(this.$element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)))\n return this.bind('parsleyForm');\n\n // Every other element is bound as a `Field` or `FieldMultiple`\n return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n },\n\n isMultiple: function () {\n return (this.$element.is('input[type=radio], input[type=checkbox]')) || (this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple'));\n },\n\n // Multiples fields are a real nightmare :(\n // Maybe some refactoring would be appreciated here...\n handleMultiple: function () {\n var name;\n var multiple;\n var parsleyMultipleInstance;\n\n // Handle multiple name\n if (this.options.multiple)\n ; // We already have our 'multiple' identifier\n else if ('undefined' !== typeof this.$element.attr('name') && this.$element.attr('name').length)\n this.options.multiple = name = this.$element.attr('name');\n else if ('undefined' !== typeof this.$element.attr('id') && this.$element.attr('id').length)\n this.options.multiple = this.$element.attr('id');\n\n // Special select multiple input\n if (this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple')) {\n this.options.multiple = this.options.multiple || this.__id__;\n return this.bind('parsleyFieldMultiple');\n\n // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n } else if (!this.options.multiple) {\n Utils__default.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n return this;\n }\n\n // Remove special chars\n this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, '');\n\n // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n if ('undefined' !== typeof name) {\n $('input[name=\"' + name + '\"]').each((i, input) => {\n if ($(input).is('input[type=radio], input[type=checkbox]'))\n $(input).attr(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('FieldMultiple')) {\n parsleyMultipleInstance.addElement(this.$element);\n }\n\n break;\n }\n }\n\n // Create a secret Field instance for every multiple field. It will be stored in `data('FieldMultiple')`\n // And will be useful later to access classic `Field` stuff while being in a `FieldMultiple` instance\n this.bind('parsleyField', true);\n\n return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n },\n\n // Return proper `Form`, `Field` or `FieldMultiple`\n bind: function (type, doNotStore) {\n var parsleyInstance;\n\n switch (type) {\n case 'parsleyForm':\n parsleyInstance = $.extend(\n new Form(this.$element, this.domOptions, this.options),\n new Base(),\n window.ParsleyExtend\n )._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(\n new parsley_field(this.$element, this.domOptions, this.options, this.parent),\n new Base(),\n window.ParsleyExtend\n );\n break;\n case 'parsleyFieldMultiple':\n parsleyInstance = $.extend(\n new parsley_field(this.$element, this.domOptions, this.options, this.parent),\n new Multiple(),\n new Base(),\n window.ParsleyExtend\n )._init();\n break;\n default:\n throw new Error(type + 'is not a supported Parsley type');\n }\n\n if (this.options.multiple)\n Utils__default.setAttr(this.$element, this.options.namespace, 'multiple', this.options.multiple);\n\n if ('undefined' !== typeof doNotStore) {\n this.$element.data('FieldMultiple', parsleyInstance);\n\n return parsleyInstance;\n }\n\n // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n this.$element.data('Parsley', parsleyInstance);\n\n // Tell the world we have a new Form or Field instance!\n parsleyInstance._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n };\n\n var vernums = $.fn.jquery.split('.');\n if (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n }\n if (!vernums.forEach) {\n Utils__default.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n }\n // Inherit `on`, `off` & `trigger` to Parsley:\n var Parsley = $.extend(new Base(), {\n $element: $(document),\n actualizeOptions: null,\n _resetOptions: null,\n Factory: Factory,\n version: '2.7.0'\n });\n\n // Supplement Field and Form with Base\n // This way, the constructors will have access to those methods\n $.extend(parsley_field.prototype, UI.Field, Base.prototype);\n $.extend(Form.prototype, UI.Form, Base.prototype);\n // Inherit actualizeOptions and _resetOptions:\n $.extend(Factory.prototype, Base.prototype);\n\n // ### jQuery API\n // `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n $.fn.parsley = $.fn.psly = function (options) {\n if (this.length > 1) {\n var instances = [];\n\n this.each(function () {\n instances.push($(this).parsley(options));\n });\n\n return instances;\n }\n\n // Return undefined if applied to non existing DOM element\n if (!$(this).length) {\n Utils__default.warn('You must bind Parsley on an existing element.');\n\n return;\n }\n\n return new Factory(this, options);\n };\n\n // ### Field and Form extension\n // Ensure the extension is now defined if it wasn't previously\n if ('undefined' === typeof window.ParsleyExtend)\n window.ParsleyExtend = {};\n\n // ### Parsley config\n // Inherit from ParsleyDefault, and copy over any existing values\n Parsley.options = $.extend(Utils__default.objectCreate(Defaults), window.ParsleyConfig);\n window.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n // ### Globals\n window.Parsley = window.psly = Parsley;\n Parsley.Utils = Utils__default;\n window.ParsleyUtils = {};\n $.each(Utils__default, (key, value) => {\n if ('function' === typeof value) {\n window.ParsleyUtils[key] = (...args) => {\n Utils__default.warnOnce('Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.');\n return Utils__default[key](...args);\n };\n }\n });\n\n // ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\n var registry = window.Parsley._validatorRegistry = new ValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\n window.ParsleyValidator = {};\n $.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator'.split(' '), function (i, method) {\n window.Parsley[method] = $.proxy(registry, method);\n window.ParsleyValidator[method] = function () {\n Utils__default.warnOnce(`Accessing the method '${method}' through Validator is deprecated. Simply call 'window.Parsley.${method}(...)'`);\n return window.Parsley[method](...arguments);\n };\n });\n\n // ### UI\n // Deprecated global object\n window.Parsley.UI = UI;\n window.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils__default.warnOnce(`Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n Utils__default.warnOnce(`Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n };\n $.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils__default.warnOnce(`Accessing UI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n });\n\n // ### PARSLEY auto-binding\n // Prevent it by setting `ParsleyConfig.autoBind` to `false`\n if (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n }\n\n var o = $({});\n var deprecated = function () {\n Utils__default.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n };\n\n // Returns an event handler that calls `fn` with the arguments it expects\n function adapt(fn, context) {\n // Store to allow unbinding\n if (!fn.parsleyAdaptedCallback) {\n fn.parsleyAdaptedCallback = function () {\n var args = Array.prototype.slice.call(arguments, 0);\n args.unshift(this);\n fn.apply(context || o, args);\n };\n }\n return fn.parsleyAdaptedCallback;\n }\n\n var eventPrefix = 'parsley:';\n // Converts 'parsley:form:validate' into 'form:validate'\n function eventName(name) {\n if (name.lastIndexOf(eventPrefix, 0) === 0)\n return name.substr(eventPrefix.length);\n return name;\n }\n\n // $.listen is deprecated. Use Parsley.on instead.\n $.listen = function (name, callback) {\n var context;\n deprecated();\n if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n context = arguments[1];\n callback = arguments[2];\n }\n\n if ('function' !== typeof callback)\n throw new Error('Wrong parameters');\n\n window.Parsley.on(eventName(name), adapt(callback, context));\n };\n\n $.listenTo = function (instance, name, fn) {\n deprecated();\n if (!(instance instanceof parsley_field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong parameters');\n\n instance.on(eventName(name), adapt(fn));\n };\n\n $.unsubscribe = function (name, fn) {\n deprecated();\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong arguments');\n window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n };\n\n $.unsubscribeTo = function (instance, name) {\n deprecated();\n if (!(instance instanceof parsley_field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n instance.off(eventName(name));\n };\n\n $.unsubscribeAll = function (name) {\n deprecated();\n window.Parsley.off(eventName(name));\n $('form,input,textarea,select').each(function () {\n var instance = $(this).data('Parsley');\n if (instance) {\n instance.off(eventName(name));\n }\n });\n };\n\n // $.emit is deprecated. Use jQuery events instead.\n $.emit = function (name, instance) {\n deprecated();\n var instanceGiven = (instance instanceof parsley_field) || (instance instanceof Form);\n var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n args.unshift(eventName(name));\n if (!instanceGiven) {\n instance = window.Parsley;\n }\n instance.trigger(...args);\n };\n\n var pubsub = {};\n\n $.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n });\n\n Parsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n });\n\n Parsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n });\n\n window.ParsleyExtend.addAsyncValidator = function () {\n Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n };\n\n // This is included with the Parsley library itself,\n // thus there is no use in adding it to your project.\n Parsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n });\n\n Parsley.setLocale('en');\n\n /**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune <github@marc-andre.ca>\n * @license MIT\n */\n\n function InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n $.extend(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n };\n\n var inputevent = new InputEvent();\n\n inputevent.install();\n\n var parsley = Parsley;\n\n return parsley;\n\n}));\n","import $ from 'jquery';\n\nvar globalID = 1;\nvar pastWarnings = {};\n\nvar Utils = {\n // Parsley DOM-API\n // returns object from dom attributes and values\n attr: function ($element, namespace, obj) {\n var i;\n var attribute;\n var attributes;\n var regex = new RegExp('^' + namespace, 'i');\n\n if ('undefined' === typeof obj)\n obj = {};\n else {\n // Clear all own properties. This won't affect prototype's values\n for (i in obj) {\n if (obj.hasOwnProperty(i))\n delete obj[i];\n }\n }\n\n if ('undefined' === typeof $element || 'undefined' === typeof $element[0])\n return obj;\n\n attributes = $element[0].attributes;\n for (i = attributes.length; i--; ) {\n attribute = attributes[i];\n\n if (attribute && attribute.specified && regex.test(attribute.name)) {\n obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n }\n }\n\n return obj;\n },\n\n checkAttr: function ($element, namespace, checkAttr) {\n return $element.is('[' + namespace + checkAttr + ']');\n },\n\n setAttr: function ($element, namespace, attr, value) {\n $element[0].setAttribute(this.dasherize(namespace + attr), String(value));\n },\n\n generateID: function () {\n return '' + globalID++;\n },\n\n /** Third party functions **/\n // Zepto deserialize function\n deserializeValue: function (value) {\n var num;\n\n try {\n return value ?\n value == \"true\" ||\n (value == \"false\" ? false :\n value == \"null\" ? null :\n !isNaN(num = Number(value)) ? num :\n /^[\\[\\{]/.test(value) ? $.parseJSON(value) :\n value)\n : value;\n } catch (e) { return value; }\n },\n\n // Zepto camelize function\n camelize: function (str) {\n return str.replace(/-+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n });\n },\n\n // Zepto dasherize function\n dasherize: function (str) {\n return str.replace(/::/g, '/')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n .replace(/_/g, '-')\n .toLowerCase();\n },\n\n warn: function () {\n if (window.console && 'function' === typeof window.console.warn)\n window.console.warn(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n parse: {\n date: function(string) {\n let parsed = string.match(/^(\\d{4,})-(\\d\\d)-(\\d\\d)$/);\n if (!parsed)\n return null;\n let [_, year, month, day] = parsed.map(x => parseInt(x, 10));\n let date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day)\n return null;\n return date;\n },\n string: function(string) {\n return string;\n },\n integer: function(string) {\n if (isNaN(string))\n return null;\n return parseInt(string, 10);\n },\n number: function(string) {\n if (isNaN(string))\n throw null;\n return parseFloat(string);\n },\n 'boolean': function _boolean(string) {\n return !(/^\\s*false\\s*$/i.test(string));\n },\n object: function(string) {\n return Utils.deserializeValue(string);\n },\n regexp: function(regexp) {\n var flags = '';\n\n // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n if (/^\\/.*\\/(?:[gimy]*)$/.test(regexp)) {\n // Replace the regexp literal string with the first match group: ([gimy]*)\n // If no flag is present, this will be a blank string\n flags = regexp.replace(/.*\\/([gimy]*)$/, '$1');\n // Again, replace the regexp literal string with the first match group:\n // everything excluding the opening and closing slashes and the flags\n regexp = regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n } else {\n // Anchor regexp:\n regexp = '^' + regexp + '$';\n }\n return new RegExp(regexp, flags);\n }\n },\n\n parseRequirement: function(requirementType, string) {\n var converter = this.parse[requirementType || 'string'];\n if (!converter)\n throw 'Unknown requirement specification: \"' + requirementType + '\"';\n let converted = converter(string);\n if (converted === null)\n throw `Requirement is not a ${requirementType}: \"${string}\"`;\n return converted;\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })(),\n\n _SubmitSelector: 'input[type=\"submit\"], button:submit'\n};\n\nexport default Utils;\n","// All these options could be overriden and specified directly in DOM using\n// `data-parsley-` default DOM-API\n// eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n// eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n\nvar Defaults = {\n // ### General\n\n // Default data-namespace for DOM API\n namespace: 'data-parsley-',\n\n // Supported inputs by default\n inputs: 'input, textarea, select',\n\n // Excluded inputs by default\n excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n\n // Stop validating field on highest priority failing constraint\n priorityEnabled: true,\n\n // ### Field only\n\n // identifier used to group together inputs (e.g. radio buttons...)\n multiple: null,\n\n // identifier (or array of identifiers) used to validate only a select group of inputs\n group: null,\n\n // ### UI\n // Enable\\Disable error messages\n uiEnabled: true,\n\n // Key events threshold before validation\n validationThreshold: 3,\n\n // Focused field on form validation error. 'first'|'last'|'none'\n focus: 'first',\n\n // event(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (Field) {},\n\n // Return the `$element` where errors will be appended\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n errorsContainer: function (Field) {},\n\n // ul elem that would receive errors' list\n errorsWrapper: '<ul class=\"parsley-errors-list\"></ul>',\n\n // li elem that would receive error message\n errorTemplate: '<li></li>'\n};\n\nexport default Defaults;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar Base = function () {\n this.__id__ = Utils.generateID();\n};\n\nBase.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n Utils.attr(this.$element, this.options.namespace, this.domOptions);\n if (this.parent && this.parent.actualizeOptions)\n this.parent.actualizeOptions();\n return this;\n },\n\n _resetOptions: function (initOptions) {\n this.domOptions = Utils.objectCreate(this.parent.options);\n this.options = Utils.objectCreate(this.domOptions);\n // Shallow copy of ownProperties of initOptions:\n for (var i in initOptions) {\n if (initOptions.hasOwnProperty(i))\n this.options[i] = initOptions[i];\n }\n this.actualizeOptions();\n },\n\n _listeners: null,\n\n // Register a callback for the given event name\n // Callback is called with context as the first argument and the `this`\n // The context is the current parsley instance, or window.Parsley if global\n // A return value of `false` will interrupt the calls\n on: function (name, fn) {\n this._listeners = this._listeners || {};\n var queue = this._listeners[name] = this._listeners[name] || [];\n queue.push(fn);\n\n return this;\n },\n\n // Deprecated. Use `on` instead\n subscribe: function(name, fn) {\n $.listenTo(this, name.toLowerCase(), fn);\n },\n\n // Unregister a callback (or all if none is given) for the given event name\n off: function (name, fn) {\n var queue = this._listeners && this._listeners[name];\n if (queue) {\n if (!fn) {\n delete this._listeners[name];\n } else {\n for (var i = queue.length; i--; )\n if (queue[i] === fn)\n queue.splice(i, 1);\n }\n }\n return this;\n },\n\n // Deprecated. Use `off`\n unsubscribe: function(name, fn) {\n $.unsubscribeTo(this, name.toLowerCase());\n },\n\n // Trigger an event of the given name\n // A return value of `false` interrupts the callback chain\n // Returns false if execution was interrupted\n trigger: function (name, target, extraArg) {\n target = target || this;\n var queue = this._listeners && this._listeners[name];\n var result;\n var parentResult;\n if (queue) {\n for (var i = queue.length; i--; ) {\n result = queue[i].call(target, target, extraArg);\n if (result === false) return result;\n }\n }\n if (this.parent) {\n return this.parent.trigger(name, target, extraArg);\n }\n return true;\n },\n\n asyncIsValid: function (group, force) {\n Utils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n this.parent.$element.find(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`)\n : this.$element;\n }\n};\n\nexport default Base;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar convertArrayRequirement = function(string, length) {\n var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n if (!m)\n throw 'Requirement is not an array: \"' + string + '\"';\n var values = m[1].split(',').map(Utils.trimString);\n if (values.length !== length)\n throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n return values;\n};\n\nvar convertExtraOptionRequirement = function(requirementSpec, string, extraOptionReader) {\n var main = null;\n var extra = {};\n for (var key in requirementSpec) {\n if (key) {\n var value = extraOptionReader(key);\n if ('string' === typeof value)\n value = Utils.parseRequirement(requirementSpec[key], value);\n extra[key] = value;\n } else {\n main = Utils.parseRequirement(requirementSpec[key], string);\n }\n }\n return [main, extra];\n};\n\n// A Validator needs to implement the methods `validate` and `parseRequirements`\n\nvar Validator = function(spec) {\n $.extend(true, this, spec);\n};\n\nValidator.prototype = {\n // Returns `true` iff the given `value` is valid according the given requirements.\n validate: function(value, requirementFirstArg) {\n if (this.fn) { // Legacy style validator\n\n if (arguments.length > 3) // If more args then value, requirement, instance...\n requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest\n return this.fn(value, requirementFirstArg);\n }\n\n if ($.isArray(value)) {\n if (!this.validateMultiple)\n throw 'Validator `' + this.name + '` does not handle multiple values';\n return this.validateMultiple(...arguments);\n } else {\n let instance = arguments[arguments.length - 1];\n if (this.validateDate && instance._isDateInput()) {\n arguments[0] = Utils.parse.date(arguments[0]);\n if (arguments[0] === null)\n return false;\n return this.validateDate(...arguments);\n }\n if (this.validateNumber) {\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return $.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if ($.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = Utils.parseRequirement(type[i], values[i]);\n return values;\n } else if ($.isPlainObject(type)) {\n return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n } else {\n return [Utils.parseRequirement(type, requirements)];\n }\n },\n // Defaults:\n requirementType: 'string',\n\n priority: 2\n\n};\n\nexport default Validator;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Defaults from './defaults';\nimport Validator from './validator';\n\nvar ValidatorRegistry = function (validators, catalog) {\n this.__class__ = 'ValidatorRegistry';\n\n // Default Parsley locale is en\n this.locale = 'en';\n\n this.init(validators || {}, catalog || {});\n};\n\nvar typeTesters = {\n email: /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n date: {\n test: value => Utils.parse.date(value) !== null\n },\n\n url: new RegExp(\n \"^\" +\n // protocol identifier\n \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\" +\n // IP address exclusion\n // private & local networks\n // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" + // ** mod: allow local networks\n // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n \"|\" +\n // host name\n \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\" +\n // domain name\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\" +\n // TLD identifier\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\" +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:/\\\\S*)?\" +\n \"$\", 'i'\n )\n};\ntypeTesters.range = typeTesters.number;\n\n// See http://stackoverflow.com/a/10454560/8279\nvar decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n};\n\n// parseArguments('number', ['1', '2']) => [1, 2]\nlet parseArguments = (type, args) => args.map(Utils.parse[type]);\n// operatorToValidator returns a validating function for an operator function, applied to the given type\nlet operatorToValidator = (type, operator) => {\n return (value, ...requirementsAndInput) => {\n requirementsAndInput.pop(); // Get rid of `input` argument\n return operator(value, ...parseArguments(type, requirementsAndInput));\n };\n};\n\nlet comparisonOperator = operator => ({\n validateDate: operatorToValidator('date', operator),\n validateNumber: operatorToValidator('number', operator),\n requirementType: operator.length <= 2 ? 'string' : ['string', 'string'], // Support operators with a 1 or 2 requirement(s)\n priority: 30\n});\n\nValidatorRegistry.prototype = {\n init: function (validators, catalog) {\n this.catalog = catalog;\n // Copy prototype's validators:\n this.validators = $.extend({}, this.validators);\n\n for (var name in validators)\n this.addValidator(name, validators[name].fn, validators[name].priority);\n\n window.Parsley.trigger('parsley:validator:init');\n },\n\n // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n setLocale: function (locale) {\n if ('undefined' === typeof this.catalog[locale])\n throw new Error(locale + ' is not available in the catalog');\n\n this.locale = locale;\n\n return this;\n },\n\n // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n addCatalog: function (locale, messages, set) {\n if ('object' === typeof messages)\n this.catalog[locale] = messages;\n\n if (true === set)\n return this.setLocale(locale);\n\n return this;\n },\n\n // Add a specific message for a given constraint in a given locale\n addMessage: function (locale, name, message) {\n if ('undefined' === typeof this.catalog[locale])\n this.catalog[locale] = {};\n\n this.catalog[locale][name] = message;\n\n return this;\n },\n\n // Add messages for a given locale\n addMessages: function (locale, nameMessageObject) {\n for (var name in nameMessageObject)\n this.addMessage(locale, name, nameMessageObject[name]);\n\n return this;\n },\n\n // Add a new validator\n //\n // addValidator('custom', {\n // requirementType: ['integer', 'integer'],\n // validateString: function(value, from, to) {},\n // priority: 22,\n // messages: {\n // en: \"Hey, that's no good\",\n // fr: \"Aye aye, pas bon du tout\",\n // }\n // })\n //\n // Old API was addValidator(name, function, priority)\n //\n addValidator: function (name, arg1, arg2) {\n if (this.validators[name])\n Utils.warn('Validator \"' + name + '\" is already defined.');\n else if (Defaults.hasOwnProperty(name)) {\n Utils.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n return;\n }\n return this._setValidator(...arguments);\n },\n\n updateValidator: function (name, arg1, arg2) {\n if (!this.validators[name]) {\n Utils.warn('Validator \"' + name + '\" is not already defined.');\n return this.addValidator(...arguments);\n }\n return this._setValidator(...arguments);\n },\n\n removeValidator: function (name) {\n if (!this.validators[name])\n Utils.warn('Validator \"' + name + '\" is not defined.');\n\n delete this.validators[name];\n\n return this;\n },\n\n _setValidator: function (name, validator, priority) {\n if ('object' !== typeof validator) {\n // Old style validator, with `fn` and `priority`\n validator = {\n fn: validator,\n priority: priority\n };\n }\n if (!validator.validate) {\n validator = new Validator(validator);\n }\n this.validators[name] = validator;\n\n for (var locale in validator.messages || {})\n this.addMessage(locale, name, validator.messages[locale]);\n\n return this;\n },\n\n getErrorMessage: function (constraint) {\n var message;\n\n // Type constraints are a bit different, we have to match their requirements too to find right error message\n if ('type' === constraint.name) {\n var typeMessages = this.catalog[this.locale][constraint.name] || {};\n message = typeMessages[constraint.requirements];\n } else\n message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n },\n\n // Kind of light `sprintf()` implementation\n formatMessage: function (string, parameters) {\n if ('object' === typeof parameters) {\n for (var i in parameters)\n string = this.formatMessage(string, parameters[i]);\n\n return string;\n }\n\n return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = 'any', base = 0} = {}) {\n var tester = typeTesters[type];\n if (!tester) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!tester.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: comparisonOperator((value, requirement) => value >= requirement),\n max: comparisonOperator((value, requirement) => value <= requirement),\n range: comparisonOperator((value, min, max) => value >= min && value <= max),\n equalto: {\n validateString: function (value, refOrValue) {\n var $reference = $(refOrValue);\n if ($reference.length)\n return value === $reference.val();\n else\n return value === refOrValue;\n },\n priority: 256\n }\n }\n};\n\nexport default ValidatorRegistry;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar UI = {};\n\nvar diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n};\n\nUI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', Utils._SubmitSelector, evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.$element.attr('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n};\n\nUI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = this.options.classHandler.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n\n return this._inputHolder();\n },\n\n _inputHolder: function() {\n // if simple element (input, texatrea, select...) it will perfectly host the classes and precede the error container\n if (!this.options.multiple || this.$element.is('select'))\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof this.options.errorsContainer) {\n if ($(this.options.errorsContainer).length)\n return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);\n else\n Utils.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof this.options.errorsContainer)\n $errorsContainer = this.options.errorsContainer.call(this, this);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n return this._inputHolder().after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(Utils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this._validateIfNeeded();\n });\n else if (trigger = Utils.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._validateIfNeeded(event);\n });\n }\n },\n\n _validateIfNeeded: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (event && /key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n if (this.options.debounce) {\n window.clearTimeout(this._debounced);\n this._debounced = window.setTimeout(() => this.validate(), this.options.debounce);\n } else\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n};\n\nexport default UI;\n","import $ from 'jquery';\nimport Base from './base';\nimport Utils from './utils';\n\nvar Form = function (element, domOptions, options) {\n this.__class__ = 'Form';\n\n this.$element = $(element);\n this.domOptions = domOptions;\n this.options = options;\n this.parent = window.Parsley;\n\n this.fields = [];\n this.validationResult = null;\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nForm.prototype = {\n onSubmitValidate: function (event) {\n // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var $submitSource = this._$submitSource || this.$element.find(Utils._SubmitSelector).first();\n this._$submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if ($submitSource.is('[formnovalidate]'))\n return;\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit($submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._$submitSource = $(event.currentTarget);\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function ($submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if ($submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('<input class=\"parsley-synthetic-submit-button\" type=\"hidden\">').appendTo(this.$element);\n $synthetic.attr({\n name: $submitSource.attr('name'),\n value: $submitSource.attr('value')\n });\n }\n\n this.$element.trigger($.extend($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = $.extend({}, event, {preventDefault: () => {\n Utils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return Utils.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return Utils.all(promises);\n },\n\n // Reset UI\n reset: function () {\n // Form case: emit a reset event for each field\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n\n // Form case: destroy all its fields and then destroy stored instance\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].destroy();\n\n this.$element.removeData('Parsley');\n this._trigger('destroy');\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `Field` and `FieldMultiple` children\n if (('Field' === fieldInstance.__class__ || 'FieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded)) {\n let uniqueId = fieldInstance.__class__ + '-' + fieldInstance.__id__;\n if ('undefined' === typeof this.fieldsMappedById[uniqueId]) {\n this.fieldsMappedById[uniqueId] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n }\n });\n\n $.each(Utils.difference(oldFields, this.fields), (_, field) => {\n field.reset();\n });\n });\n return this;\n },\n\n // Internal only.\n // Looping on a form's fields to do validation or similar\n // will trigger reactualizing options on all of them, which\n // in turn will reactualize the form's options.\n // To avoid calling actualizeOptions so many times on the form\n // for nothing, _withoutReactualizingFormOptions temporarily disables\n // the method actualizeOptions on this form while `fn` is called.\n _withoutReactualizingFormOptions: function (fn) {\n var oldActualizeOptions = this.actualizeOptions;\n this.actualizeOptions = function () { return this; };\n var result = fn();\n this.actualizeOptions = oldActualizeOptions;\n return result;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n // Returns true iff event is not interrupted and default not prevented.\n _trigger: function (eventName) {\n return this.trigger('form:' + eventName);\n }\n\n};\n\nexport default Form;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Validator from './validator';\n\nvar Constraint = function (parsleyField, name, requirements, priority, isDomConstraint) {\n var validatorSpec = window.Parsley._validatorRegistry.validators[name];\n var validator = new Validator(validatorSpec);\n\n $.extend(this, {\n validator: validator,\n name: name,\n requirements: requirements,\n priority: priority || parsleyField.options[name + 'Priority'] || validator.priority,\n isDomConstraint: true === isDomConstraint\n });\n this._parseRequirements(parsleyField.options);\n};\n\nvar capitalize = function(str) {\n var cap = str[0].toUpperCase();\n return cap + str.slice(1);\n};\n\nConstraint.prototype = {\n validate: function(value, instance) {\n return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n};\n\nexport default Constraint;\n\n","import $ from 'jquery';\nimport Constraint from './constraint';\nimport UI from './ui';\nimport Utils from './utils';\n\nvar Field = function (field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'Field';\n\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nField.prototype = {\n // # Public API\n // Validate field and trigger some events for mainly `UI`\n // @returns `true`, an array of the validators that failed, or\n // `null` if validation is not finished. Prefer using whenValidate\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `UI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refreshConstraints();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if ($.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refreshConstraints();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = Utils.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return Utils.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return Utils.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // Reset UI\n reset: function () {\n this._resetUI();\n return this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n this.$element.removeData('Parsley');\n this.$element.removeData('FieldMultiple');\n this._trigger('destroy');\n },\n\n // Actualize options that could have change since previous validation\n // Re-bind accordingly constraints (could be some new, removed or updated)\n refreshConstraints: function () {\n return this.actualizeOptions()._bindConstraints();\n },\n\n /**\n * Add a new constraint to a field\n *\n * @param {String} name\n * @param {Mixed} requirements optional\n * @param {Number} priority optional\n * @param {Boolean} isDomConstraint optional\n */\n addConstraint: function (name, requirements, priority, isDomConstraint) {\n\n if (window.Parsley._validatorRegistry.validators[name]) {\n var constraint = new Constraint(this, name, requirements, priority, isDomConstraint);\n\n // if constraint already exist, delete it and push new version\n if ('undefined' !== this.constraintsByName[constraint.name])\n this.removeConstraint(constraint.name);\n\n this.constraints.push(constraint);\n this.constraintsByName[constraint.name] = constraint;\n }\n\n return this;\n },\n\n // Remove a constraint\n removeConstraint: function (name) {\n for (var i = 0; i < this.constraints.length; i++)\n if (name === this.constraints[i].name) {\n this.constraints.splice(i, 1);\n break;\n }\n delete this.constraintsByName[name];\n return this;\n },\n\n // Update a constraint (Remove + re-add)\n updateConstraint: function (name, parameters, priority) {\n return this.removeConstraint(name)\n .addConstraint(name, parameters, priority);\n },\n\n // # Internals\n\n // Internal only.\n // Bind constraints from config + options + DOM\n _bindConstraints: function () {\n var constraints = [];\n var constraintsByName = {};\n\n // clean all existing DOM constraints to only keep javascript user constraints\n for (var i = 0; i < this.constraints.length; i++)\n if (false === this.constraints[i].isDomConstraint) {\n constraints.push(this.constraints[i]);\n constraintsByName[this.constraints[i].name] = this.constraints[i];\n }\n\n this.constraints = constraints;\n this.constraintsByName = constraintsByName;\n\n // then re-add Parsley DOM-API constraints\n for (var name in this.options)\n this.addConstraint(name, this.options[name], undefined, true);\n\n // finally, bind special HTML5 constraints\n return this._bindHtml5Constraints();\n },\n\n // Internal only.\n // Bind specific HTML5 constraints to be HTML5 compliant\n _bindHtml5Constraints: function () {\n // html5 required\n if (this.$element.attr('required'))\n this.addConstraint('required', true, undefined, true);\n\n // html5 pattern\n if ('string' === typeof this.$element.attr('pattern'))\n this.addConstraint('pattern', this.$element.attr('pattern'), undefined, true);\n\n // range\n if ('undefined' !== typeof this.$element.attr('min') && 'undefined' !== typeof this.$element.attr('max'))\n this.addConstraint('range', [this.$element.attr('min'), this.$element.attr('max')], undefined, true);\n\n // HTML5 min\n else if ('undefined' !== typeof this.$element.attr('min'))\n this.addConstraint('min', this.$element.attr('min'), undefined, true);\n\n // HTML5 max\n else if ('undefined' !== typeof this.$element.attr('max'))\n this.addConstraint('max', this.$element.attr('max'), undefined, true);\n\n\n // length\n if ('undefined' !== typeof this.$element.attr('minlength') && 'undefined' !== typeof this.$element.attr('maxlength'))\n this.addConstraint('length', [this.$element.attr('minlength'), this.$element.attr('maxlength')], undefined, true);\n\n // HTML5 minlength\n else if ('undefined' !== typeof this.$element.attr('minlength'))\n this.addConstraint('minlength', this.$element.attr('minlength'), undefined, true);\n\n // HTML5 maxlength\n else if ('undefined' !== typeof this.$element.attr('maxlength'))\n this.addConstraint('maxlength', this.$element.attr('maxlength'), undefined, true);\n\n\n // html5 types\n var type = this.$element.attr('type');\n\n if ('undefined' === typeof type)\n return this;\n\n // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n if ('number' === type) {\n return this.addConstraint('type', ['number', {\n step: this.$element.attr('step') || '1',\n base: this.$element.attr('min') || this.$element.attr('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range|date)$/i.test(type)) {\n return this.addConstraint('type', type, undefined, true);\n }\n return this;\n },\n\n // Internal only.\n // Field is required if have required constraint without `false` value\n _isRequired: function () {\n if ('undefined' === typeof this.constraintsByName.required)\n return false;\n\n return false !== this.constraintsByName.required.requirements;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n _trigger: function (eventName) {\n return this.trigger('field:' + eventName);\n },\n\n // Internal only\n // Handles whitespace in a value\n // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n _handleWhitespace: function (value) {\n if (true === this.options.trimValue)\n Utils.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n if ('squish' === this.options.whitespace)\n value = value.replace(/\\s{2,}/g, ' ');\n\n if (('trim' === this.options.whitespace) || ('squish' === this.options.whitespace) || (true === this.options.trimValue))\n value = Utils.trimString(value);\n\n return value;\n },\n\n _isDateInput: function() {\n var c = this.constraintsByName.type;\n return c && c.requirements === 'date';\n },\n\n // Internal only.\n // Returns the constraints, grouped by descending priority.\n // The result is thus an array of arrays of constraints.\n _getGroupedConstraints: function () {\n if (false === this.options.priorityEnabled)\n return [this.constraints];\n\n var groupedConstraints = [];\n var index = {};\n\n // Create array unique of priorities\n for (var i = 0; i < this.constraints.length; i++) {\n var p = this.constraints[i].priority;\n if (!index[p])\n groupedConstraints.push(index[p] = []);\n index[p].push(this.constraints[i]);\n }\n // Sort them by priority DESC\n groupedConstraints.sort(function (a, b) { return b[0].priority - a[0].priority; });\n\n return groupedConstraints;\n }\n\n};\n\nexport default Field;\n","import $ from 'jquery';\n\nvar Multiple = function () {\n this.__class__ = 'FieldMultiple';\n};\n\nMultiple.prototype = {\n // Add new `$element` sibling for multiple field\n addElement: function ($element) {\n this.$elements.push($element);\n\n return this;\n },\n\n // See `Field.refreshConstraints()`\n refreshConstraints: function () {\n var fieldConstraints;\n\n this.constraints = [];\n\n // Select multiple special treatment\n if (this.$element.is('select')) {\n this.actualizeOptions()._bindConstraints();\n\n return this;\n }\n\n // Gather all constraints for each input in the multiple group\n for (var i = 0; i < this.$elements.length; i++) {\n\n // Check if element have not been dynamically removed since last binding\n if (!$('html').has(this.$elements[i]).length) {\n this.$elements.splice(i, 1);\n continue;\n }\n\n fieldConstraints = this.$elements[i].data('FieldMultiple').refreshConstraints().constraints;\n\n for (var j = 0; j < fieldConstraints.length; j++)\n this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n }\n\n return this;\n },\n\n // See `Field.getValue()`\n getValue: function () {\n // Value could be overriden in DOM\n if ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.$element.is('input[type=radio]'))\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n\n // Select multiple case\n if (this.$element.is('select') && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n};\n\nexport default Multiple;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Base from './base';\nimport Form from './form';\nimport Field from './field';\nimport Multiple from './multiple';\n\nvar Factory = function (element, options, parsleyFormInstance) {\n this.$element = $(element);\n\n // If the element has already been bound, returns its saved Parsley instance\n var savedparsleyFormInstance = this.$element.data('Parsley');\n if (savedparsleyFormInstance) {\n\n // If the saved instance has been bound without a Form parent and there is one given in this call, add it\n if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n savedparsleyFormInstance.parent = parsleyFormInstance;\n savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n }\n\n if ('object' === typeof options) {\n $.extend(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && 'Form' !== parsleyFormInstance.__class__)\n throw new Error('Parent instance must be a Form instance');\n\n this.parent = parsleyFormInstance || window.Parsley;\n return this.init(options);\n};\n\nFactory.prototype = {\n init: function (options) {\n this.__class__ = 'Parsley';\n this.__version__ = '@@version';\n this.__id__ = Utils.generateID();\n\n // Pre-compute options\n this._resetOptions(options);\n\n // A Form instance is obviously a `<form>` element but also every node that is not an input and has the `data-parsley-validate` attribute\n if (this.$element.is('form') || (Utils.checkAttr(this.$element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)))\n return this.bind('parsleyForm');\n\n // Every other element is bound as a `Field` or `FieldMultiple`\n return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n },\n\n isMultiple: function () {\n return (this.$element.is('input[type=radio], input[type=checkbox]')) || (this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple'));\n },\n\n // Multiples fields are a real nightmare :(\n // Maybe some refactoring would be appreciated here...\n handleMultiple: function () {\n var name;\n var multiple;\n var parsleyMultipleInstance;\n\n // Handle multiple name\n if (this.options.multiple)\n ; // We already have our 'multiple' identifier\n else if ('undefined' !== typeof this.$element.attr('name') && this.$element.attr('name').length)\n this.options.multiple = name = this.$element.attr('name');\n else if ('undefined' !== typeof this.$element.attr('id') && this.$element.attr('id').length)\n this.options.multiple = this.$element.attr('id');\n\n // Special select multiple input\n if (this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple')) {\n this.options.multiple = this.options.multiple || this.__id__;\n return this.bind('parsleyFieldMultiple');\n\n // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n } else if (!this.options.multiple) {\n Utils.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n return this;\n }\n\n // Remove special chars\n this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, '');\n\n // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n if ('undefined' !== typeof name) {\n $('input[name=\"' + name + '\"]').each((i, input) => {\n if ($(input).is('input[type=radio], input[type=checkbox]'))\n $(input).attr(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('FieldMultiple')) {\n parsleyMultipleInstance.addElement(this.$element);\n }\n\n break;\n }\n }\n\n // Create a secret Field instance for every multiple field. It will be stored in `data('FieldMultiple')`\n // And will be useful later to access classic `Field` stuff while being in a `FieldMultiple` instance\n this.bind('parsleyField', true);\n\n return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n },\n\n // Return proper `Form`, `Field` or `FieldMultiple`\n bind: function (type, doNotStore) {\n var parsleyInstance;\n\n switch (type) {\n case 'parsleyForm':\n parsleyInstance = $.extend(\n new Form(this.$element, this.domOptions, this.options),\n new Base(),\n window.ParsleyExtend\n )._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(\n new Field(this.$element, this.domOptions, this.options, this.parent),\n new Base(),\n window.ParsleyExtend\n );\n break;\n case 'parsleyFieldMultiple':\n parsleyInstance = $.extend(\n new Field(this.$element, this.domOptions, this.options, this.parent),\n new Multiple(),\n new Base(),\n window.ParsleyExtend\n )._init();\n break;\n default:\n throw new Error(type + 'is not a supported Parsley type');\n }\n\n if (this.options.multiple)\n Utils.setAttr(this.$element, this.options.namespace, 'multiple', this.options.multiple);\n\n if ('undefined' !== typeof doNotStore) {\n this.$element.data('FieldMultiple', parsleyInstance);\n\n return parsleyInstance;\n }\n\n // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n this.$element.data('Parsley', parsleyInstance);\n\n // Tell the world we have a new Form or Field instance!\n parsleyInstance._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n};\n\nexport default Factory;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Defaults from './defaults';\nimport Base from './base';\nimport ValidatorRegistry from './validator_registry';\nimport UI from './ui';\nimport Form from './form';\nimport Field from './field';\nimport Multiple from './multiple';\nimport Factory from './factory';\n\nvar vernums = $.fn.jquery.split('.');\nif (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n}\nif (!vernums.forEach) {\n Utils.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n}\n// Inherit `on`, `off` & `trigger` to Parsley:\nvar Parsley = $.extend(new Base(), {\n $element: $(document),\n actualizeOptions: null,\n _resetOptions: null,\n Factory: Factory,\n version: '@@version'\n });\n\n// Supplement Field and Form with Base\n// This way, the constructors will have access to those methods\n$.extend(Field.prototype, UI.Field, Base.prototype);\n$.extend(Form.prototype, UI.Form, Base.prototype);\n// Inherit actualizeOptions and _resetOptions:\n$.extend(Factory.prototype, Base.prototype);\n\n// ### jQuery API\n// `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n$.fn.parsley = $.fn.psly = function (options) {\n if (this.length > 1) {\n var instances = [];\n\n this.each(function () {\n instances.push($(this).parsley(options));\n });\n\n return instances;\n }\n\n // Return undefined if applied to non existing DOM element\n if (!$(this).length) {\n Utils.warn('You must bind Parsley on an existing element.');\n\n return;\n }\n\n return new Factory(this, options);\n};\n\n// ### Field and Form extension\n// Ensure the extension is now defined if it wasn't previously\nif ('undefined' === typeof window.ParsleyExtend)\n window.ParsleyExtend = {};\n\n// ### Parsley config\n// Inherit from ParsleyDefault, and copy over any existing values\nParsley.options = $.extend(Utils.objectCreate(Defaults), window.ParsleyConfig);\nwindow.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n// ### Globals\nwindow.Parsley = window.psly = Parsley;\nParsley.Utils = Utils;\nwindow.ParsleyUtils = {};\n$.each(Utils, (key, value) => {\n if ('function' === typeof value) {\n window.ParsleyUtils[key] = (...args) => {\n Utils.warnOnce('Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.');\n return Utils[key](...args);\n };\n }\n});\n\n// ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\nvar registry = window.Parsley._validatorRegistry = new ValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\nwindow.ParsleyValidator = {};\n$.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator'.split(' '), function (i, method) {\n window.Parsley[method] = $.proxy(registry, method);\n window.ParsleyValidator[method] = function () {\n Utils.warnOnce(`Accessing the method '${method}' through Validator is deprecated. Simply call 'window.Parsley.${method}(...)'`);\n return window.Parsley[method](...arguments);\n };\n});\n\n// ### UI\n// Deprecated global object\nwindow.Parsley.UI = UI;\nwindow.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce(`Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n Utils.warnOnce(`Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n};\n$.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce(`Accessing UI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n});\n\n// ### PARSLEY auto-binding\n// Prevent it by setting `ParsleyConfig.autoBind` to `false`\nif (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n}\n\nexport default Parsley;\n","import $ from 'jquery';\nimport Field from './field';\nimport Form from './form';\nimport Utils from './utils';\n\nvar o = $({});\nvar deprecated = function () {\n Utils.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n};\n\n// Returns an event handler that calls `fn` with the arguments it expects\nfunction adapt(fn, context) {\n // Store to allow unbinding\n if (!fn.parsleyAdaptedCallback) {\n fn.parsleyAdaptedCallback = function () {\n var args = Array.prototype.slice.call(arguments, 0);\n args.unshift(this);\n fn.apply(context || o, args);\n };\n }\n return fn.parsleyAdaptedCallback;\n}\n\nvar eventPrefix = 'parsley:';\n// Converts 'parsley:form:validate' into 'form:validate'\nfunction eventName(name) {\n if (name.lastIndexOf(eventPrefix, 0) === 0)\n return name.substr(eventPrefix.length);\n return name;\n}\n\n// $.listen is deprecated. Use Parsley.on instead.\n$.listen = function (name, callback) {\n var context;\n deprecated();\n if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n context = arguments[1];\n callback = arguments[2];\n }\n\n if ('function' !== typeof callback)\n throw new Error('Wrong parameters');\n\n window.Parsley.on(eventName(name), adapt(callback, context));\n};\n\n$.listenTo = function (instance, name, fn) {\n deprecated();\n if (!(instance instanceof Field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong parameters');\n\n instance.on(eventName(name), adapt(fn));\n};\n\n$.unsubscribe = function (name, fn) {\n deprecated();\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong arguments');\n window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n};\n\n$.unsubscribeTo = function (instance, name) {\n deprecated();\n if (!(instance instanceof Field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n instance.off(eventName(name));\n};\n\n$.unsubscribeAll = function (name) {\n deprecated();\n window.Parsley.off(eventName(name));\n $('form,input,textarea,select').each(function () {\n var instance = $(this).data('Parsley');\n if (instance) {\n instance.off(eventName(name));\n }\n });\n};\n\n// $.emit is deprecated. Use jQuery events instead.\n$.emit = function (name, instance) {\n deprecated();\n var instanceGiven = (instance instanceof Field) || (instance instanceof Form);\n var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n args.unshift(eventName(name));\n if (!instanceGiven) {\n instance = window.Parsley;\n }\n instance.trigger(...args);\n};\n\nexport default {};\n","import $ from 'jquery';\n\nimport Parsley from './main';\n\n$.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n});\n\nParsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n});\n\nParsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n});\n\nwindow.ParsleyExtend.addAsyncValidator = function () {\n Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n};\n","// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\nimport Parsley from '../parsley/main';\n\nParsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n});\n\nParsley.setLocale('en');\n","/**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune <github@marc-andre.ca>\n * @license MIT\n */\n\nimport $ from 'jquery';\n\nfunction InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n $.extend(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n};\n\nexport default new InputEvent();\n","import $ from 'jquery';\nimport Parsley from './parsley/main';\nimport './parsley/pubsub';\nimport './parsley/remote';\nimport './i18n/en';\nimport inputevent from './vendor/inputevent';\n\ninputevent.install();\n\nexport default Parsley;\n"]}
1
+ {"version":3,"sources":["parsley.js","src/parsley/utils.js","src/parsley/defaults.js","src/parsley/base.js","src/parsley/validator.js","src/parsley/validator_registry.js","src/parsley/ui.js","src/parsley/form.js","src/parsley/constraint.js","src/parsley/field.js","src/parsley/multiple.js","src/parsley/factory.js","src/parsley/main.js","src/parsley/pubsub.js","src/parsley/remote.js","src/i18n/en.js","src/vendor/inputevent.js","src/parsley.js"],"names":[],"mappings":"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","file":"parsley.js","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :\n typeof define === 'function' && define.amd ? define(['jquery'], factory) :\n global.parsley = factory(global.$)\n}(this, function ($) { 'use strict';\n\n var globalID = 1;\n var pastWarnings = {};\n\n var Utils = {\n // Parsley DOM-API\n // returns object from dom attributes and values\n attr: function (element, namespace, obj) {\n var i;\n var attribute;\n var attributes;\n var regex = new RegExp('^' + namespace, 'i');\n\n if ('undefined' === typeof obj)\n obj = {};\n else {\n // Clear all own properties. This won't affect prototype's values\n for (i in obj) {\n if (obj.hasOwnProperty(i))\n delete obj[i];\n }\n }\n\n if (!element)\n return obj;\n\n attributes = element.attributes;\n for (i = attributes.length; i--; ) {\n attribute = attributes[i];\n\n if (attribute && attribute.specified && regex.test(attribute.name)) {\n obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n }\n }\n\n return obj;\n },\n\n checkAttr: function (element, namespace, checkAttr) {\n return element.hasAttribute(namespace + checkAttr);\n },\n\n setAttr: function (element, namespace, attr, value) {\n element.setAttribute(this.dasherize(namespace + attr), String(value));\n },\n\n getType: function(element) {\n return element.getAttribute('type') || 'text';\n },\n\n generateID: function () {\n return '' + globalID++;\n },\n\n /** Third party functions **/\n deserializeValue: function (value) {\n var num;\n\n try {\n return value ?\n value == \"true\" ||\n (value == \"false\" ? false :\n value == \"null\" ? null :\n !isNaN(num = Number(value)) ? num :\n /^[\\[\\{]/.test(value) ? JSON.parse(value) :\n value)\n : value;\n } catch (e) { return value; }\n },\n\n // Zepto camelize function\n camelize: function (str) {\n return str.replace(/-+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n });\n },\n\n // Zepto dasherize function\n dasherize: function (str) {\n return str.replace(/::/g, '/')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n .replace(/_/g, '-')\n .toLowerCase();\n },\n\n warn: function () {\n if (window.console && 'function' === typeof window.console.warn)\n window.console.warn(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n parse: {\n date: function(string) {\n let parsed = string.match(/^(\\d{4,})-(\\d\\d)-(\\d\\d)$/);\n if (!parsed)\n return null;\n let [_, year, month, day] = parsed.map(x => parseInt(x, 10));\n let date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day)\n return null;\n return date;\n },\n string: function(string) {\n return string;\n },\n integer: function(string) {\n if (isNaN(string))\n return null;\n return parseInt(string, 10);\n },\n number: function(string) {\n if (isNaN(string))\n throw null;\n return parseFloat(string);\n },\n 'boolean': function _boolean(string) {\n return !(/^\\s*false\\s*$/i.test(string));\n },\n object: function(string) {\n return Utils.deserializeValue(string);\n },\n regexp: function(regexp) {\n var flags = '';\n\n // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n if (/^\\/.*\\/(?:[gimy]*)$/.test(regexp)) {\n // Replace the regexp literal string with the first match group: ([gimy]*)\n // If no flag is present, this will be a blank string\n flags = regexp.replace(/.*\\/([gimy]*)$/, '$1');\n // Again, replace the regexp literal string with the first match group:\n // everything excluding the opening and closing slashes and the flags\n regexp = regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n } else {\n // Anchor regexp:\n regexp = '^' + regexp + '$';\n }\n return new RegExp(regexp, flags);\n }\n },\n\n parseRequirement: function(requirementType, string) {\n var converter = this.parse[requirementType || 'string'];\n if (!converter)\n throw 'Unknown requirement specification: \"' + requirementType + '\"';\n let converted = converter(string);\n if (converted === null)\n throw `Requirement is not a ${requirementType}: \"${string}\"`;\n return converted;\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })(),\n\n _SubmitSelector: 'input[type=\"submit\"], button:submit'\n };\n\n // All these options could be overriden and specified directly in DOM using\n // `data-parsley-` default DOM-API\n // eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n // eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n\n var Defaults = {\n // ### General\n\n // Default data-namespace for DOM API\n namespace: 'data-parsley-',\n\n // Supported inputs by default\n inputs: 'input, textarea, select',\n\n // Excluded inputs by default\n excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n\n // Stop validating field on highest priority failing constraint\n priorityEnabled: true,\n\n // ### Field only\n\n // identifier used to group together inputs (e.g. radio buttons...)\n multiple: null,\n\n // identifier (or array of identifiers) used to validate only a select group of inputs\n group: null,\n\n // ### UI\n // Enable\\Disable error messages\n uiEnabled: true,\n\n // Key events threshold before validation\n validationThreshold: 3,\n\n // Focused field on form validation error. 'first'|'last'|'none'\n focus: 'first',\n\n // event(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (Field) {},\n\n // Return the `$element` where errors will be appended\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n errorsContainer: function (Field) {},\n\n // ul elem that would receive errors' list\n errorsWrapper: '<ul class=\"parsley-errors-list\"></ul>',\n\n // li elem that would receive error message\n errorTemplate: '<li></li>'\n };\n\n var Base = function () {\n this.__id__ = Utils.generateID();\n };\n\n Base.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n Utils.attr(this.element, this.options.namespace, this.domOptions);\n if (this.parent && this.parent.actualizeOptions)\n this.parent.actualizeOptions();\n return this;\n },\n\n _resetOptions: function (initOptions) {\n this.domOptions = Utils.objectCreate(this.parent.options);\n this.options = Utils.objectCreate(this.domOptions);\n // Shallow copy of ownProperties of initOptions:\n for (var i in initOptions) {\n if (initOptions.hasOwnProperty(i))\n this.options[i] = initOptions[i];\n }\n this.actualizeOptions();\n },\n\n _listeners: null,\n\n // Register a callback for the given event name\n // Callback is called with context as the first argument and the `this`\n // The context is the current parsley instance, or window.Parsley if global\n // A return value of `false` will interrupt the calls\n on: function (name, fn) {\n this._listeners = this._listeners || {};\n var queue = this._listeners[name] = this._listeners[name] || [];\n queue.push(fn);\n\n return this;\n },\n\n // Deprecated. Use `on` instead\n subscribe: function(name, fn) {\n $.listenTo(this, name.toLowerCase(), fn);\n },\n\n // Unregister a callback (or all if none is given) for the given event name\n off: function (name, fn) {\n var queue = this._listeners && this._listeners[name];\n if (queue) {\n if (!fn) {\n delete this._listeners[name];\n } else {\n for (var i = queue.length; i--; )\n if (queue[i] === fn)\n queue.splice(i, 1);\n }\n }\n return this;\n },\n\n // Deprecated. Use `off`\n unsubscribe: function(name, fn) {\n $.unsubscribeTo(this, name.toLowerCase());\n },\n\n // Trigger an event of the given name\n // A return value of `false` interrupts the callback chain\n // Returns false if execution was interrupted\n trigger: function (name, target, extraArg) {\n target = target || this;\n var queue = this._listeners && this._listeners[name];\n var result;\n var parentResult;\n if (queue) {\n for (var i = queue.length; i--; ) {\n result = queue[i].call(target, target, extraArg);\n if (result === false) return result;\n }\n }\n if (this.parent) {\n return this.parent.trigger(name, target, extraArg);\n }\n return true;\n },\n\n asyncIsValid: function (group, force) {\n Utils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n $(this.parent.element.querySelectorAll(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`))\n : this.$element;\n }\n };\n\n var convertArrayRequirement = function(string, length) {\n var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n if (!m)\n throw 'Requirement is not an array: \"' + string + '\"';\n var values = m[1].split(',').map(Utils.trimString);\n if (values.length !== length)\n throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n return values;\n };\n\n var convertExtraOptionRequirement = function(requirementSpec, string, extraOptionReader) {\n var main = null;\n var extra = {};\n for (var key in requirementSpec) {\n if (key) {\n var value = extraOptionReader(key);\n if ('string' === typeof value)\n value = Utils.parseRequirement(requirementSpec[key], value);\n extra[key] = value;\n } else {\n main = Utils.parseRequirement(requirementSpec[key], string);\n }\n }\n return [main, extra];\n };\n\n // A Validator needs to implement the methods `validate` and `parseRequirements`\n\n var Validator = function(spec) {\n $.extend(true, this, spec);\n };\n\n Validator.prototype = {\n // Returns `true` iff the given `value` is valid according the given requirements.\n validate: function(value, requirementFirstArg) {\n if (this.fn) { // Legacy style validator\n\n if (arguments.length > 3) // If more args then value, requirement, instance...\n requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest\n return this.fn(value, requirementFirstArg);\n }\n\n if (Array.isArray(value)) {\n if (!this.validateMultiple)\n throw 'Validator `' + this.name + '` does not handle multiple values';\n return this.validateMultiple(...arguments);\n } else {\n let instance = arguments[arguments.length - 1];\n if (this.validateDate && instance._isDateInput()) {\n arguments[0] = Utils.parse.date(arguments[0]);\n if (arguments[0] === null)\n return false;\n return this.validateDate(...arguments);\n }\n if (this.validateNumber) {\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return Array.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if (Array.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = Utils.parseRequirement(type[i], values[i]);\n return values;\n } else if ($.isPlainObject(type)) {\n return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n } else {\n return [Utils.parseRequirement(type, requirements)];\n }\n },\n // Defaults:\n requirementType: 'string',\n\n priority: 2\n\n };\n\n var ValidatorRegistry = function (validators, catalog) {\n this.__class__ = 'ValidatorRegistry';\n\n // Default Parsley locale is en\n this.locale = 'en';\n\n this.init(validators || {}, catalog || {});\n };\n\n var typeTesters = {\n email: /^((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n date: {\n test: value => Utils.parse.date(value) !== null\n },\n\n url: new RegExp(\n \"^\" +\n // protocol identifier\n \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\" +\n // IP address exclusion\n // private & local networks\n // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" + // ** mod: allow local networks\n // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n \"|\" +\n // host name\n \"(?:(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)\" +\n // domain name\n \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)*\" +\n // TLD identifier\n \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff]{2,}))\" +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:/\\\\S*)?\" +\n \"$\"\n )\n };\n typeTesters.range = typeTesters.number;\n\n // See http://stackoverflow.com/a/10454560/8279\n var decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n };\n\n // parseArguments('number', ['1', '2']) => [1, 2]\n let ValidatorRegistry__parseArguments = (type, args) => args.map(Utils.parse[type]);\n // operatorToValidator returns a validating function for an operator function, applied to the given type\n let ValidatorRegistry__operatorToValidator = (type, operator) => {\n return (value, ...requirementsAndInput) => {\n requirementsAndInput.pop(); // Get rid of `input` argument\n return operator(value, ...ValidatorRegistry__parseArguments(type, requirementsAndInput));\n };\n };\n\n let ValidatorRegistry__comparisonOperator = operator => ({\n validateDate: ValidatorRegistry__operatorToValidator('date', operator),\n validateNumber: ValidatorRegistry__operatorToValidator('number', operator),\n requirementType: operator.length <= 2 ? 'string' : ['string', 'string'], // Support operators with a 1 or 2 requirement(s)\n priority: 30\n });\n\n ValidatorRegistry.prototype = {\n init: function (validators, catalog) {\n this.catalog = catalog;\n // Copy prototype's validators:\n this.validators = Object.assign({}, this.validators);\n\n for (var name in validators)\n this.addValidator(name, validators[name].fn, validators[name].priority);\n\n window.Parsley.trigger('parsley:validator:init');\n },\n\n // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n setLocale: function (locale) {\n if ('undefined' === typeof this.catalog[locale])\n throw new Error(locale + ' is not available in the catalog');\n\n this.locale = locale;\n\n return this;\n },\n\n // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n addCatalog: function (locale, messages, set) {\n if ('object' === typeof messages)\n this.catalog[locale] = messages;\n\n if (true === set)\n return this.setLocale(locale);\n\n return this;\n },\n\n // Add a specific message for a given constraint in a given locale\n addMessage: function (locale, name, message) {\n if ('undefined' === typeof this.catalog[locale])\n this.catalog[locale] = {};\n\n this.catalog[locale][name] = message;\n\n return this;\n },\n\n // Add messages for a given locale\n addMessages: function (locale, nameMessageObject) {\n for (var name in nameMessageObject)\n this.addMessage(locale, name, nameMessageObject[name]);\n\n return this;\n },\n\n // Add a new validator\n //\n // addValidator('custom', {\n // requirementType: ['integer', 'integer'],\n // validateString: function(value, from, to) {},\n // priority: 22,\n // messages: {\n // en: \"Hey, that's no good\",\n // fr: \"Aye aye, pas bon du tout\",\n // }\n // })\n //\n // Old API was addValidator(name, function, priority)\n //\n addValidator: function (name, arg1, arg2) {\n if (this.validators[name])\n Utils.warn('Validator \"' + name + '\" is already defined.');\n else if (Defaults.hasOwnProperty(name)) {\n Utils.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n return;\n }\n return this._setValidator(...arguments);\n },\n\n hasValidator: function (name) {\n return !!this.validators[name];\n },\n\n updateValidator: function (name, arg1, arg2) {\n if (!this.validators[name]) {\n Utils.warn('Validator \"' + name + '\" is not already defined.');\n return this.addValidator(...arguments);\n }\n return this._setValidator(...arguments);\n },\n\n removeValidator: function (name) {\n if (!this.validators[name])\n Utils.warn('Validator \"' + name + '\" is not defined.');\n\n delete this.validators[name];\n\n return this;\n },\n\n _setValidator: function (name, validator, priority) {\n if ('object' !== typeof validator) {\n // Old style validator, with `fn` and `priority`\n validator = {\n fn: validator,\n priority: priority\n };\n }\n if (!validator.validate) {\n validator = new Validator(validator);\n }\n this.validators[name] = validator;\n\n for (var locale in validator.messages || {})\n this.addMessage(locale, name, validator.messages[locale]);\n\n return this;\n },\n\n getErrorMessage: function (constraint) {\n var message;\n\n // Type constraints are a bit different, we have to match their requirements too to find right error message\n if ('type' === constraint.name) {\n var typeMessages = this.catalog[this.locale][constraint.name] || {};\n message = typeMessages[constraint.requirements];\n } else\n message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n },\n\n // Kind of light `sprintf()` implementation\n formatMessage: function (string, parameters) {\n if ('object' === typeof parameters) {\n for (var i in parameters)\n string = this.formatMessage(string, parameters[i]);\n\n return string;\n }\n\n return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = 'any', base = 0} = {}) {\n var tester = typeTesters[type];\n if (!tester) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!tester.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: ValidatorRegistry__comparisonOperator((value, requirement) => value >= requirement),\n max: ValidatorRegistry__comparisonOperator((value, requirement) => value <= requirement),\n range: ValidatorRegistry__comparisonOperator((value, min, max) => value >= min && value <= max),\n equalto: {\n validateString: function (value, refOrValue) {\n var $reference = $(refOrValue);\n if ($reference.length)\n return value === $reference.val();\n else\n return value === refOrValue;\n },\n priority: 256\n }\n }\n };\n\n var UI = {};\n\n var diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n };\n\n UI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', Utils._SubmitSelector, evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.element.setAttribute('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n };\n\n UI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorClassHandler\n .attr('aria-describedby', this._ui.errorsWrapperId);\n this._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorClassHandler\n .removeAttr('aria-describedby');\n this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.element.setAttribute(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // Class handled could also be determined by function given in Parsley options\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handlerFunction = this.options.classHandler;\n\n // It might also be the function name of a global function\n if ('string' === typeof this.options.classHandler && 'function' === typeof window[this.options.classHandler])\n $handlerFunction = window[this.options.classHandler];\n\n if ('function' === typeof $handlerFunction) {\n var $handler = $handlerFunction.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n } else if ('object' === typeof $handlerFunction && $handlerFunction instanceof jQuery && $handlerFunction.length) {\n return $handlerFunction;\n } else if ($handlerFunction) {\n Utils.warn('The class handler `' + $handlerFunction + '` does not exist in DOM nor as a global JS function');\n }\n\n return this._inputHolder();\n },\n\n _inputHolder: function() {\n // if simple element (input, texatrea, select...) it will perfectly host the classes and precede the error container\n if (!this.options.multiple || this.element.nodeName === 'SELECT')\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer = this.options.errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof $errorsContainer) {\n if ($($errorsContainer).length)\n return $($errorsContainer).append(this._ui.$errorsWrapper);\n else if ('function' === typeof window[$errorsContainer])\n $errorsContainer = window[$errorsContainer];\n else\n Utils.warn('The errors container `' + $errorsContainer + '` does not exist in DOM nor as a global JS function');\n }\n\n if ('function' === typeof $errorsContainer)\n $errorsContainer = $errorsContainer.call(this, this);\n\n if ('object' === typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n return this._inputHolder().after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(Utils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this._validateIfNeeded();\n });\n else if (trigger = Utils.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._validateIfNeeded(event);\n });\n }\n },\n\n _validateIfNeeded: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (event && /key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n if (this.options.debounce) {\n window.clearTimeout(this._debounced);\n this._debounced = window.setTimeout(() => this.validate(), this.options.debounce);\n } else\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n };\n\n var Form = function (element, domOptions, options) {\n this.__class__ = 'Form';\n\n this.element = element;\n this.$element = $(element);\n this.domOptions = domOptions;\n this.options = options;\n this.parent = window.Parsley;\n\n this.fields = [];\n this.validationResult = null;\n };\n\n var Form__statusMapping = {pending: null, resolved: true, rejected: false};\n\n Form.prototype = {\n onSubmitValidate: function (event) {\n // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var submitSource = this._submitSource || this.$element.find(Utils._SubmitSelector)[0];\n this._submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if (submitSource && null !== submitSource.getAttribute('formnovalidate'))\n return;\n\n window.Parsley._remoteCache = {};\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit(submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._submitSource = event.currentTarget;\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function (submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if (submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('<input class=\"parsley-synthetic-submit-button\" type=\"hidden\">').appendTo(this.$element);\n $synthetic.attr({\n name: submitSource.getAttribute('name'),\n value: submitSource.getAttribute('value')\n });\n }\n\n this.$element.trigger(Object.assign($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return Form__statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = Object.assign({}, event, {preventDefault: () => {\n Utils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return Utils.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return Form__statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return Utils.all(promises);\n },\n\n refresh: function() {\n this._refreshFields();\n return this;\n },\n\n // Reset UI\n reset: function () {\n // Form case: emit a reset event for each field\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n\n // Form case: destroy all its fields and then destroy stored instance\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].destroy();\n\n this.$element.removeData('Parsley');\n this._trigger('destroy');\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `Field` and `FieldMultiple` children\n if (('Field' === fieldInstance.__class__ || 'FieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded)) {\n let uniqueId = fieldInstance.__class__ + '-' + fieldInstance.__id__;\n if ('undefined' === typeof this.fieldsMappedById[uniqueId]) {\n this.fieldsMappedById[uniqueId] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n }\n });\n\n $.each(Utils.difference(oldFields, this.fields), (_, field) => {\n field.reset();\n });\n });\n return this;\n },\n\n // Internal only.\n // Looping on a form's fields to do validation or similar\n // will trigger reactualizing options on all of them, which\n // in turn will reactualize the form's options.\n // To avoid calling actualizeOptions so many times on the form\n // for nothing, _withoutReactualizingFormOptions temporarily disables\n // the method actualizeOptions on this form while `fn` is called.\n _withoutReactualizingFormOptions: function (fn) {\n var oldActualizeOptions = this.actualizeOptions;\n this.actualizeOptions = function () { return this; };\n var result = fn();\n this.actualizeOptions = oldActualizeOptions;\n return result;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n // Returns true iff event is not interrupted and default not prevented.\n _trigger: function (eventName) {\n return this.trigger('form:' + eventName);\n }\n\n };\n\n const Constraint = function(parsleyField, name, requirements, priority, isDomConstraint) {\n const validatorSpec = window.Parsley._validatorRegistry.validators[name];\n const validator = new Validator(validatorSpec);\n priority = priority || parsleyField.options[name + 'Priority'] || validator.priority;\n isDomConstraint = (true === isDomConstraint);\n\n Object.assign(this, {\n validator,\n name,\n requirements,\n priority,\n isDomConstraint\n });\n this._parseRequirements(parsleyField.options);\n };\n\n const capitalize = function(str) {\n const cap = str[0].toUpperCase();\n return cap + str.slice(1);\n };\n\n Constraint.prototype = {\n validate: function(value, instance) {\n return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n };\n\n var Field = function (field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'Field';\n\n this.element = field;\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n };\n\n var parsley_field__statusMapping = {pending: null, resolved: true, rejected: false};\n\n Field.prototype = {\n // # Public API\n // Validate field and trigger some events for mainly `UI`\n // @returns `true`, an array of the validators that failed, or\n // `null` if validation is not finished. Prefer using whenValidate\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `UI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refresh();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if (Array.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return parsley_field__statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refresh();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = Utils.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return Utils.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return Utils.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // Reset UI\n reset: function () {\n this._resetUI();\n return this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n this.$element.removeData('Parsley');\n this.$element.removeData('FieldMultiple');\n this._trigger('destroy');\n },\n\n // Actualize options and rebind constraints\n refresh: function () {\n this._refreshConstraints();\n return this;\n },\n\n _refreshConstraints: function () {\n return this.actualizeOptions()._bindConstraints();\n },\n\n refreshConstraints: function() {\n Utils.warnOnce(\"Parsley's refreshConstraints is deprecated. Please use refresh\");\n return this.refresh();\n },\n\n /**\n * Add a new constraint to a field\n *\n * @param {String} name\n * @param {Mixed} requirements optional\n * @param {Number} priority optional\n * @param {Boolean} isDomConstraint optional\n */\n addConstraint: function (name, requirements, priority, isDomConstraint) {\n\n if (window.Parsley._validatorRegistry.validators[name]) {\n var constraint = new Constraint(this, name, requirements, priority, isDomConstraint);\n\n // if constraint already exist, delete it and push new version\n if ('undefined' !== this.constraintsByName[constraint.name])\n this.removeConstraint(constraint.name);\n\n this.constraints.push(constraint);\n this.constraintsByName[constraint.name] = constraint;\n }\n\n return this;\n },\n\n // Remove a constraint\n removeConstraint: function (name) {\n for (var i = 0; i < this.constraints.length; i++)\n if (name === this.constraints[i].name) {\n this.constraints.splice(i, 1);\n break;\n }\n delete this.constraintsByName[name];\n return this;\n },\n\n // Update a constraint (Remove + re-add)\n updateConstraint: function (name, parameters, priority) {\n return this.removeConstraint(name)\n .addConstraint(name, parameters, priority);\n },\n\n // # Internals\n\n // Internal only.\n // Bind constraints from config + options + DOM\n _bindConstraints: function () {\n var constraints = [];\n var constraintsByName = {};\n\n // clean all existing DOM constraints to only keep javascript user constraints\n for (var i = 0; i < this.constraints.length; i++)\n if (false === this.constraints[i].isDomConstraint) {\n constraints.push(this.constraints[i]);\n constraintsByName[this.constraints[i].name] = this.constraints[i];\n }\n\n this.constraints = constraints;\n this.constraintsByName = constraintsByName;\n\n // then re-add Parsley DOM-API constraints\n for (var name in this.options)\n this.addConstraint(name, this.options[name], undefined, true);\n\n // finally, bind special HTML5 constraints\n return this._bindHtml5Constraints();\n },\n\n // Internal only.\n // Bind specific HTML5 constraints to be HTML5 compliant\n _bindHtml5Constraints: function () {\n // html5 required\n if (null !== this.element.getAttribute('required'))\n this.addConstraint('required', true, undefined, true);\n\n // html5 pattern\n if (null !== this.element.getAttribute('pattern'))\n this.addConstraint('pattern', this.element.getAttribute('pattern'), undefined, true);\n\n // range\n let min = this.element.getAttribute('min');\n let max = this.element.getAttribute('max');\n if (null !== min && null !== max)\n this.addConstraint('range', [min, max], undefined, true);\n\n // HTML5 min\n else if (null !== min)\n this.addConstraint('min', min, undefined, true);\n\n // HTML5 max\n else if (null !== max)\n this.addConstraint('max', max, undefined, true);\n\n\n // length\n if (null !== this.element.getAttribute('minlength') && null !== this.element.getAttribute('maxlength'))\n this.addConstraint('length', [this.element.getAttribute('minlength'), this.element.getAttribute('maxlength')], undefined, true);\n\n // HTML5 minlength\n else if (null !== this.element.getAttribute('minlength'))\n this.addConstraint('minlength', this.element.getAttribute('minlength'), undefined, true);\n\n // HTML5 maxlength\n else if (null !== this.element.getAttribute('maxlength'))\n this.addConstraint('maxlength', this.element.getAttribute('maxlength'), undefined, true);\n\n\n // html5 types\n var type = Utils.getType(this.element);\n\n // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n if ('number' === type) {\n return this.addConstraint('type', ['number', {\n step: this.element.getAttribute('step') || '1',\n base: min || this.element.getAttribute('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range|date)$/i.test(type)) {\n return this.addConstraint('type', type, undefined, true);\n }\n return this;\n },\n\n // Internal only.\n // Field is required if have required constraint without `false` value\n _isRequired: function () {\n if ('undefined' === typeof this.constraintsByName.required)\n return false;\n\n return false !== this.constraintsByName.required.requirements;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n _trigger: function (eventName) {\n return this.trigger('field:' + eventName);\n },\n\n // Internal only\n // Handles whitespace in a value\n // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n _handleWhitespace: function (value) {\n if (true === this.options.trimValue)\n Utils.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n if ('squish' === this.options.whitespace)\n value = value.replace(/\\s{2,}/g, ' ');\n\n if (('trim' === this.options.whitespace) || ('squish' === this.options.whitespace) || (true === this.options.trimValue))\n value = Utils.trimString(value);\n\n return value;\n },\n\n _isDateInput: function() {\n var c = this.constraintsByName.type;\n return c && c.requirements === 'date';\n },\n\n // Internal only.\n // Returns the constraints, grouped by descending priority.\n // The result is thus an array of arrays of constraints.\n _getGroupedConstraints: function () {\n if (false === this.options.priorityEnabled)\n return [this.constraints];\n\n var groupedConstraints = [];\n var index = {};\n\n // Create array unique of priorities\n for (var i = 0; i < this.constraints.length; i++) {\n var p = this.constraints[i].priority;\n if (!index[p])\n groupedConstraints.push(index[p] = []);\n index[p].push(this.constraints[i]);\n }\n // Sort them by priority DESC\n groupedConstraints.sort(function (a, b) { return b[0].priority - a[0].priority; });\n\n return groupedConstraints;\n }\n\n };\n\n var parsley_field = Field;\n\n var Multiple = function () {\n this.__class__ = 'FieldMultiple';\n };\n\n Multiple.prototype = {\n // Add new `$element` sibling for multiple field\n addElement: function ($element) {\n this.$elements.push($element);\n\n return this;\n },\n\n // See `Field._refreshConstraints()`\n _refreshConstraints: function () {\n var fieldConstraints;\n\n this.constraints = [];\n\n // Select multiple special treatment\n if (this.element.nodeName === 'SELECT') {\n this.actualizeOptions()._bindConstraints();\n\n return this;\n }\n\n // Gather all constraints for each input in the multiple group\n for (var i = 0; i < this.$elements.length; i++) {\n\n // Check if element have not been dynamically removed since last binding\n if (!$('html').has(this.$elements[i]).length) {\n this.$elements.splice(i, 1);\n continue;\n }\n\n fieldConstraints = this.$elements[i].data('FieldMultiple')._refreshConstraints().constraints;\n\n for (var j = 0; j < fieldConstraints.length; j++)\n this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n }\n\n return this;\n },\n\n // See `Field.getValue()`\n getValue: function () {\n // Value could be overriden in DOM\n if ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.element.nodeName === 'INPUT') {\n var type = Utils.getType(this.element);\n if (type === 'radio')\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (type === 'checkbox') {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n }\n\n // Select multiple case\n if (this.element.nodeName === 'SELECT' && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n };\n\n var Factory = function (element, options, parsleyFormInstance) {\n this.element = element;\n this.$element = $(element);\n\n // If the element has already been bound, returns its saved Parsley instance\n var savedparsleyFormInstance = this.$element.data('Parsley');\n if (savedparsleyFormInstance) {\n\n // If the saved instance has been bound without a Form parent and there is one given in this call, add it\n if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n savedparsleyFormInstance.parent = parsleyFormInstance;\n savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n }\n\n if ('object' === typeof options) {\n Object.assign(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && 'Form' !== parsleyFormInstance.__class__)\n throw new Error('Parent instance must be a Form instance');\n\n this.parent = parsleyFormInstance || window.Parsley;\n return this.init(options);\n };\n\n Factory.prototype = {\n init: function (options) {\n this.__class__ = 'Parsley';\n this.__version__ = '2.8.1';\n this.__id__ = Utils.generateID();\n\n // Pre-compute options\n this._resetOptions(options);\n\n // A Form instance is obviously a `<form>` element but also every node that is not an input and has the `data-parsley-validate` attribute\n if (this.element.nodeName === 'FORM' || (Utils.checkAttr(this.element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)))\n return this.bind('parsleyForm');\n\n // Every other element is bound as a `Field` or `FieldMultiple`\n return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n },\n\n isMultiple: function () {\n var type = Utils.getType(this.element);\n return ((type === 'radio' || type === 'checkbox') ||\n (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')));\n },\n\n // Multiples fields are a real nightmare :(\n // Maybe some refactoring would be appreciated here...\n handleMultiple: function () {\n var name;\n var multiple;\n var parsleyMultipleInstance;\n\n // Handle multiple name\n this.options.multiple = this.options.multiple ||\n (name = this.element.getAttribute('name')) ||\n this.element.getAttribute('id');\n\n // Special select multiple input\n if (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')) {\n this.options.multiple = this.options.multiple || this.__id__;\n return this.bind('parsleyFieldMultiple');\n\n // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n } else if (!this.options.multiple) {\n Utils.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n return this;\n }\n\n // Remove special chars\n this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, '');\n\n // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n if (name) {\n $('input[name=\"' + name + '\"]').each((i, input) => {\n var type = Utils.getType(input);\n if ((type === 'radio' || type === 'checkbox'))\n input.setAttribute(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('FieldMultiple')) {\n parsleyMultipleInstance.addElement(this.$element);\n }\n\n break;\n }\n }\n\n // Create a secret Field instance for every multiple field. It will be stored in `data('FieldMultiple')`\n // And will be useful later to access classic `Field` stuff while being in a `FieldMultiple` instance\n this.bind('parsleyField', true);\n\n return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n },\n\n // Return proper `Form`, `Field` or `FieldMultiple`\n bind: function (type, doNotStore) {\n var parsleyInstance;\n\n switch (type) {\n case 'parsleyForm':\n parsleyInstance = $.extend(\n new Form(this.element, this.domOptions, this.options),\n new Base(),\n window.ParsleyExtend\n )._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(\n new parsley_field(this.element, this.domOptions, this.options, this.parent),\n new Base(),\n window.ParsleyExtend\n );\n break;\n case 'parsleyFieldMultiple':\n parsleyInstance = $.extend(\n new parsley_field(this.element, this.domOptions, this.options, this.parent),\n new Multiple(),\n new Base(),\n window.ParsleyExtend\n )._init();\n break;\n default:\n throw new Error(type + 'is not a supported Parsley type');\n }\n\n if (this.options.multiple)\n Utils.setAttr(this.element, this.options.namespace, 'multiple', this.options.multiple);\n\n if ('undefined' !== typeof doNotStore) {\n this.$element.data('FieldMultiple', parsleyInstance);\n\n return parsleyInstance;\n }\n\n // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n this.$element.data('Parsley', parsleyInstance);\n\n // Tell the world we have a new Form or Field instance!\n parsleyInstance._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n };\n\n var vernums = $.fn.jquery.split('.');\n if (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n }\n if (!vernums.forEach) {\n Utils.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n }\n // Inherit `on`, `off` & `trigger` to Parsley:\n var Parsley = Object.assign(new Base(), {\n element: document,\n $element: $(document),\n actualizeOptions: null,\n _resetOptions: null,\n Factory: Factory,\n version: '2.8.1'\n });\n\n // Supplement Field and Form with Base\n // This way, the constructors will have access to those methods\n Object.assign(parsley_field.prototype, UI.Field, Base.prototype);\n Object.assign(Form.prototype, UI.Form, Base.prototype);\n // Inherit actualizeOptions and _resetOptions:\n Object.assign(Factory.prototype, Base.prototype);\n\n // ### jQuery API\n // `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n $.fn.parsley = $.fn.psly = function (options) {\n if (this.length > 1) {\n var instances = [];\n\n this.each(function () {\n instances.push($(this).parsley(options));\n });\n\n return instances;\n }\n\n // Return undefined if applied to non existing DOM element\n if (this.length == 0) {\n return;\n }\n\n return new Factory(this[0], options);\n };\n\n // ### Field and Form extension\n // Ensure the extension is now defined if it wasn't previously\n if ('undefined' === typeof window.ParsleyExtend)\n window.ParsleyExtend = {};\n\n // ### Parsley config\n // Inherit from ParsleyDefault, and copy over any existing values\n Parsley.options = Object.assign(Utils.objectCreate(Defaults), window.ParsleyConfig);\n window.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n // ### Globals\n window.Parsley = window.psly = Parsley;\n Parsley.Utils = Utils;\n window.ParsleyUtils = {};\n $.each(Utils, (key, value) => {\n if ('function' === typeof value) {\n window.ParsleyUtils[key] = (...args) => {\n Utils.warnOnce('Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.');\n return Utils[key](...args);\n };\n }\n });\n\n // ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\n var registry = window.Parsley._validatorRegistry = new ValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\n window.ParsleyValidator = {};\n $.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator hasValidator'.split(' '), function (i, method) {\n window.Parsley[method] = (...args) => registry[method](...args);\n window.ParsleyValidator[method] = function () {\n Utils.warnOnce(`Accessing the method '${method}' through Validator is deprecated. Simply call 'window.Parsley.${method}(...)'`);\n return window.Parsley[method](...arguments);\n };\n });\n\n // ### UI\n // Deprecated global object\n window.Parsley.UI = UI;\n window.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce(`Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n Utils.warnOnce(`Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n };\n $.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce(`Accessing UI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n });\n\n // ### PARSLEY auto-binding\n // Prevent it by setting `ParsleyConfig.autoBind` to `false`\n if (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n }\n\n var o = $({});\n var deprecated = function () {\n Utils.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n };\n\n // Returns an event handler that calls `fn` with the arguments it expects\n function adapt(fn, context) {\n // Store to allow unbinding\n if (!fn.parsleyAdaptedCallback) {\n fn.parsleyAdaptedCallback = function () {\n var args = Array.prototype.slice.call(arguments, 0);\n args.unshift(this);\n fn.apply(context || o, args);\n };\n }\n return fn.parsleyAdaptedCallback;\n }\n\n var eventPrefix = 'parsley:';\n // Converts 'parsley:form:validate' into 'form:validate'\n function eventName(name) {\n if (name.lastIndexOf(eventPrefix, 0) === 0)\n return name.substr(eventPrefix.length);\n return name;\n }\n\n // $.listen is deprecated. Use Parsley.on instead.\n $.listen = function (name, callback) {\n var context;\n deprecated();\n if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n context = arguments[1];\n callback = arguments[2];\n }\n\n if ('function' !== typeof callback)\n throw new Error('Wrong parameters');\n\n window.Parsley.on(eventName(name), adapt(callback, context));\n };\n\n $.listenTo = function (instance, name, fn) {\n deprecated();\n if (!(instance instanceof parsley_field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong parameters');\n\n instance.on(eventName(name), adapt(fn));\n };\n\n $.unsubscribe = function (name, fn) {\n deprecated();\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong arguments');\n window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n };\n\n $.unsubscribeTo = function (instance, name) {\n deprecated();\n if (!(instance instanceof parsley_field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n instance.off(eventName(name));\n };\n\n $.unsubscribeAll = function (name) {\n deprecated();\n window.Parsley.off(eventName(name));\n $('form,input,textarea,select').each(function () {\n var instance = $(this).data('Parsley');\n if (instance) {\n instance.off(eventName(name));\n }\n });\n };\n\n // $.emit is deprecated. Use jQuery events instead.\n $.emit = function (name, instance) {\n deprecated();\n var instanceGiven = (instance instanceof parsley_field) || (instance instanceof Form);\n var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n args.unshift(eventName(name));\n if (!instanceGiven) {\n instance = window.Parsley;\n }\n instance.trigger(...args);\n };\n\n var pubsub = {};\n\n $.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n });\n\n Parsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.element.getAttribute('name') || instance.element.getAttribute('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n });\n\n Parsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n });\n\n Base.prototype.addAsyncValidator = function () {\n Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n };\n\n // This is included with the Parsley library itself,\n // thus there is no use in adding it to your project.\n Parsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n });\n\n Parsley.setLocale('en');\n\n /**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune <github@marc-andre.ca>\n * @license MIT\n */\n\n function InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n Object.assign(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n };\n\n var inputevent = new InputEvent();\n\n inputevent.install();\n\n var parsley = Parsley;\n\n return parsley;\n\n}));\n","import $ from 'jquery';\n\nvar globalID = 1;\nvar pastWarnings = {};\n\nvar Utils = {\n // Parsley DOM-API\n // returns object from dom attributes and values\n attr: function (element, namespace, obj) {\n var i;\n var attribute;\n var attributes;\n var regex = new RegExp('^' + namespace, 'i');\n\n if ('undefined' === typeof obj)\n obj = {};\n else {\n // Clear all own properties. This won't affect prototype's values\n for (i in obj) {\n if (obj.hasOwnProperty(i))\n delete obj[i];\n }\n }\n\n if (!element)\n return obj;\n\n attributes = element.attributes;\n for (i = attributes.length; i--; ) {\n attribute = attributes[i];\n\n if (attribute && attribute.specified && regex.test(attribute.name)) {\n obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n }\n }\n\n return obj;\n },\n\n checkAttr: function (element, namespace, checkAttr) {\n return element.hasAttribute(namespace + checkAttr);\n },\n\n setAttr: function (element, namespace, attr, value) {\n element.setAttribute(this.dasherize(namespace + attr), String(value));\n },\n\n getType: function(element) {\n return element.getAttribute('type') || 'text';\n },\n\n generateID: function () {\n return '' + globalID++;\n },\n\n /** Third party functions **/\n deserializeValue: function (value) {\n var num;\n\n try {\n return value ?\n value == \"true\" ||\n (value == \"false\" ? false :\n value == \"null\" ? null :\n !isNaN(num = Number(value)) ? num :\n /^[\\[\\{]/.test(value) ? JSON.parse(value) :\n value)\n : value;\n } catch (e) { return value; }\n },\n\n // Zepto camelize function\n camelize: function (str) {\n return str.replace(/-+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n });\n },\n\n // Zepto dasherize function\n dasherize: function (str) {\n return str.replace(/::/g, '/')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n .replace(/_/g, '-')\n .toLowerCase();\n },\n\n warn: function () {\n if (window.console && 'function' === typeof window.console.warn)\n window.console.warn(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n parse: {\n date: function(string) {\n let parsed = string.match(/^(\\d{4,})-(\\d\\d)-(\\d\\d)$/);\n if (!parsed)\n return null;\n let [_, year, month, day] = parsed.map(x => parseInt(x, 10));\n let date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day)\n return null;\n return date;\n },\n string: function(string) {\n return string;\n },\n integer: function(string) {\n if (isNaN(string))\n return null;\n return parseInt(string, 10);\n },\n number: function(string) {\n if (isNaN(string))\n throw null;\n return parseFloat(string);\n },\n 'boolean': function _boolean(string) {\n return !(/^\\s*false\\s*$/i.test(string));\n },\n object: function(string) {\n return Utils.deserializeValue(string);\n },\n regexp: function(regexp) {\n var flags = '';\n\n // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n if (/^\\/.*\\/(?:[gimy]*)$/.test(regexp)) {\n // Replace the regexp literal string with the first match group: ([gimy]*)\n // If no flag is present, this will be a blank string\n flags = regexp.replace(/.*\\/([gimy]*)$/, '$1');\n // Again, replace the regexp literal string with the first match group:\n // everything excluding the opening and closing slashes and the flags\n regexp = regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n } else {\n // Anchor regexp:\n regexp = '^' + regexp + '$';\n }\n return new RegExp(regexp, flags);\n }\n },\n\n parseRequirement: function(requirementType, string) {\n var converter = this.parse[requirementType || 'string'];\n if (!converter)\n throw 'Unknown requirement specification: \"' + requirementType + '\"';\n let converted = converter(string);\n if (converted === null)\n throw `Requirement is not a ${requirementType}: \"${string}\"`;\n return converted;\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })(),\n\n _SubmitSelector: 'input[type=\"submit\"], button:submit'\n};\n\nexport default Utils;\n","// All these options could be overriden and specified directly in DOM using\n// `data-parsley-` default DOM-API\n// eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n// eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n\nvar Defaults = {\n // ### General\n\n // Default data-namespace for DOM API\n namespace: 'data-parsley-',\n\n // Supported inputs by default\n inputs: 'input, textarea, select',\n\n // Excluded inputs by default\n excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n\n // Stop validating field on highest priority failing constraint\n priorityEnabled: true,\n\n // ### Field only\n\n // identifier used to group together inputs (e.g. radio buttons...)\n multiple: null,\n\n // identifier (or array of identifiers) used to validate only a select group of inputs\n group: null,\n\n // ### UI\n // Enable\\Disable error messages\n uiEnabled: true,\n\n // Key events threshold before validation\n validationThreshold: 3,\n\n // Focused field on form validation error. 'first'|'last'|'none'\n focus: 'first',\n\n // event(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (Field) {},\n\n // Return the `$element` where errors will be appended\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n errorsContainer: function (Field) {},\n\n // ul elem that would receive errors' list\n errorsWrapper: '<ul class=\"parsley-errors-list\"></ul>',\n\n // li elem that would receive error message\n errorTemplate: '<li></li>'\n};\n\nexport default Defaults;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar Base = function () {\n this.__id__ = Utils.generateID();\n};\n\nBase.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n Utils.attr(this.element, this.options.namespace, this.domOptions);\n if (this.parent && this.parent.actualizeOptions)\n this.parent.actualizeOptions();\n return this;\n },\n\n _resetOptions: function (initOptions) {\n this.domOptions = Utils.objectCreate(this.parent.options);\n this.options = Utils.objectCreate(this.domOptions);\n // Shallow copy of ownProperties of initOptions:\n for (var i in initOptions) {\n if (initOptions.hasOwnProperty(i))\n this.options[i] = initOptions[i];\n }\n this.actualizeOptions();\n },\n\n _listeners: null,\n\n // Register a callback for the given event name\n // Callback is called with context as the first argument and the `this`\n // The context is the current parsley instance, or window.Parsley if global\n // A return value of `false` will interrupt the calls\n on: function (name, fn) {\n this._listeners = this._listeners || {};\n var queue = this._listeners[name] = this._listeners[name] || [];\n queue.push(fn);\n\n return this;\n },\n\n // Deprecated. Use `on` instead\n subscribe: function(name, fn) {\n $.listenTo(this, name.toLowerCase(), fn);\n },\n\n // Unregister a callback (or all if none is given) for the given event name\n off: function (name, fn) {\n var queue = this._listeners && this._listeners[name];\n if (queue) {\n if (!fn) {\n delete this._listeners[name];\n } else {\n for (var i = queue.length; i--; )\n if (queue[i] === fn)\n queue.splice(i, 1);\n }\n }\n return this;\n },\n\n // Deprecated. Use `off`\n unsubscribe: function(name, fn) {\n $.unsubscribeTo(this, name.toLowerCase());\n },\n\n // Trigger an event of the given name\n // A return value of `false` interrupts the callback chain\n // Returns false if execution was interrupted\n trigger: function (name, target, extraArg) {\n target = target || this;\n var queue = this._listeners && this._listeners[name];\n var result;\n var parentResult;\n if (queue) {\n for (var i = queue.length; i--; ) {\n result = queue[i].call(target, target, extraArg);\n if (result === false) return result;\n }\n }\n if (this.parent) {\n return this.parent.trigger(name, target, extraArg);\n }\n return true;\n },\n\n asyncIsValid: function (group, force) {\n Utils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n $(this.parent.element.querySelectorAll(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`))\n : this.$element;\n }\n};\n\nexport default Base;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar convertArrayRequirement = function(string, length) {\n var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n if (!m)\n throw 'Requirement is not an array: \"' + string + '\"';\n var values = m[1].split(',').map(Utils.trimString);\n if (values.length !== length)\n throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n return values;\n};\n\nvar convertExtraOptionRequirement = function(requirementSpec, string, extraOptionReader) {\n var main = null;\n var extra = {};\n for (var key in requirementSpec) {\n if (key) {\n var value = extraOptionReader(key);\n if ('string' === typeof value)\n value = Utils.parseRequirement(requirementSpec[key], value);\n extra[key] = value;\n } else {\n main = Utils.parseRequirement(requirementSpec[key], string);\n }\n }\n return [main, extra];\n};\n\n// A Validator needs to implement the methods `validate` and `parseRequirements`\n\nvar Validator = function(spec) {\n $.extend(true, this, spec);\n};\n\nValidator.prototype = {\n // Returns `true` iff the given `value` is valid according the given requirements.\n validate: function(value, requirementFirstArg) {\n if (this.fn) { // Legacy style validator\n\n if (arguments.length > 3) // If more args then value, requirement, instance...\n requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest\n return this.fn(value, requirementFirstArg);\n }\n\n if (Array.isArray(value)) {\n if (!this.validateMultiple)\n throw 'Validator `' + this.name + '` does not handle multiple values';\n return this.validateMultiple(...arguments);\n } else {\n let instance = arguments[arguments.length - 1];\n if (this.validateDate && instance._isDateInput()) {\n arguments[0] = Utils.parse.date(arguments[0]);\n if (arguments[0] === null)\n return false;\n return this.validateDate(...arguments);\n }\n if (this.validateNumber) {\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return Array.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if (Array.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = Utils.parseRequirement(type[i], values[i]);\n return values;\n } else if ($.isPlainObject(type)) {\n return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n } else {\n return [Utils.parseRequirement(type, requirements)];\n }\n },\n // Defaults:\n requirementType: 'string',\n\n priority: 2\n\n};\n\nexport default Validator;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Defaults from './defaults';\nimport Validator from './validator';\n\nvar ValidatorRegistry = function (validators, catalog) {\n this.__class__ = 'ValidatorRegistry';\n\n // Default Parsley locale is en\n this.locale = 'en';\n\n this.init(validators || {}, catalog || {});\n};\n\nvar typeTesters = {\n email: /^((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n date: {\n test: value => Utils.parse.date(value) !== null\n },\n\n url: new RegExp(\n \"^\" +\n // protocol identifier\n \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\" +\n // IP address exclusion\n // private & local networks\n // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" + // ** mod: allow local networks\n // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n \"|\" +\n // host name\n \"(?:(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)\" +\n // domain name\n \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)*\" +\n // TLD identifier\n \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff]{2,}))\" +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:/\\\\S*)?\" +\n \"$\"\n )\n};\ntypeTesters.range = typeTesters.number;\n\n// See http://stackoverflow.com/a/10454560/8279\nvar decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n};\n\n// parseArguments('number', ['1', '2']) => [1, 2]\nlet parseArguments = (type, args) => args.map(Utils.parse[type]);\n// operatorToValidator returns a validating function for an operator function, applied to the given type\nlet operatorToValidator = (type, operator) => {\n return (value, ...requirementsAndInput) => {\n requirementsAndInput.pop(); // Get rid of `input` argument\n return operator(value, ...parseArguments(type, requirementsAndInput));\n };\n};\n\nlet comparisonOperator = operator => ({\n validateDate: operatorToValidator('date', operator),\n validateNumber: operatorToValidator('number', operator),\n requirementType: operator.length <= 2 ? 'string' : ['string', 'string'], // Support operators with a 1 or 2 requirement(s)\n priority: 30\n});\n\nValidatorRegistry.prototype = {\n init: function (validators, catalog) {\n this.catalog = catalog;\n // Copy prototype's validators:\n this.validators = Object.assign({}, this.validators);\n\n for (var name in validators)\n this.addValidator(name, validators[name].fn, validators[name].priority);\n\n window.Parsley.trigger('parsley:validator:init');\n },\n\n // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n setLocale: function (locale) {\n if ('undefined' === typeof this.catalog[locale])\n throw new Error(locale + ' is not available in the catalog');\n\n this.locale = locale;\n\n return this;\n },\n\n // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n addCatalog: function (locale, messages, set) {\n if ('object' === typeof messages)\n this.catalog[locale] = messages;\n\n if (true === set)\n return this.setLocale(locale);\n\n return this;\n },\n\n // Add a specific message for a given constraint in a given locale\n addMessage: function (locale, name, message) {\n if ('undefined' === typeof this.catalog[locale])\n this.catalog[locale] = {};\n\n this.catalog[locale][name] = message;\n\n return this;\n },\n\n // Add messages for a given locale\n addMessages: function (locale, nameMessageObject) {\n for (var name in nameMessageObject)\n this.addMessage(locale, name, nameMessageObject[name]);\n\n return this;\n },\n\n // Add a new validator\n //\n // addValidator('custom', {\n // requirementType: ['integer', 'integer'],\n // validateString: function(value, from, to) {},\n // priority: 22,\n // messages: {\n // en: \"Hey, that's no good\",\n // fr: \"Aye aye, pas bon du tout\",\n // }\n // })\n //\n // Old API was addValidator(name, function, priority)\n //\n addValidator: function (name, arg1, arg2) {\n if (this.validators[name])\n Utils.warn('Validator \"' + name + '\" is already defined.');\n else if (Defaults.hasOwnProperty(name)) {\n Utils.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n return;\n }\n return this._setValidator(...arguments);\n },\n\n hasValidator: function (name) {\n return !!this.validators[name];\n },\n\n updateValidator: function (name, arg1, arg2) {\n if (!this.validators[name]) {\n Utils.warn('Validator \"' + name + '\" is not already defined.');\n return this.addValidator(...arguments);\n }\n return this._setValidator(...arguments);\n },\n\n removeValidator: function (name) {\n if (!this.validators[name])\n Utils.warn('Validator \"' + name + '\" is not defined.');\n\n delete this.validators[name];\n\n return this;\n },\n\n _setValidator: function (name, validator, priority) {\n if ('object' !== typeof validator) {\n // Old style validator, with `fn` and `priority`\n validator = {\n fn: validator,\n priority: priority\n };\n }\n if (!validator.validate) {\n validator = new Validator(validator);\n }\n this.validators[name] = validator;\n\n for (var locale in validator.messages || {})\n this.addMessage(locale, name, validator.messages[locale]);\n\n return this;\n },\n\n getErrorMessage: function (constraint) {\n var message;\n\n // Type constraints are a bit different, we have to match their requirements too to find right error message\n if ('type' === constraint.name) {\n var typeMessages = this.catalog[this.locale][constraint.name] || {};\n message = typeMessages[constraint.requirements];\n } else\n message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n },\n\n // Kind of light `sprintf()` implementation\n formatMessage: function (string, parameters) {\n if ('object' === typeof parameters) {\n for (var i in parameters)\n string = this.formatMessage(string, parameters[i]);\n\n return string;\n }\n\n return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = 'any', base = 0} = {}) {\n var tester = typeTesters[type];\n if (!tester) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!tester.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: comparisonOperator((value, requirement) => value >= requirement),\n max: comparisonOperator((value, requirement) => value <= requirement),\n range: comparisonOperator((value, min, max) => value >= min && value <= max),\n equalto: {\n validateString: function (value, refOrValue) {\n var $reference = $(refOrValue);\n if ($reference.length)\n return value === $reference.val();\n else\n return value === refOrValue;\n },\n priority: 256\n }\n }\n};\n\nexport default ValidatorRegistry;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar UI = {};\n\nvar diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n};\n\nUI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', Utils._SubmitSelector, evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.element.setAttribute('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n};\n\nUI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorClassHandler\n .attr('aria-describedby', this._ui.errorsWrapperId);\n this._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorClassHandler\n .removeAttr('aria-describedby');\n this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.element.setAttribute(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // Class handled could also be determined by function given in Parsley options\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handlerFunction = this.options.classHandler;\n\n // It might also be the function name of a global function\n if ('string' === typeof this.options.classHandler && 'function' === typeof window[this.options.classHandler])\n $handlerFunction = window[this.options.classHandler];\n\n if ('function' === typeof $handlerFunction) {\n var $handler = $handlerFunction.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n } else if ('object' === typeof $handlerFunction && $handlerFunction instanceof jQuery && $handlerFunction.length) {\n return $handlerFunction;\n } else if ($handlerFunction) {\n Utils.warn('The class handler `' + $handlerFunction + '` does not exist in DOM nor as a global JS function');\n }\n\n return this._inputHolder();\n },\n\n _inputHolder: function() {\n // if simple element (input, texatrea, select...) it will perfectly host the classes and precede the error container\n if (!this.options.multiple || this.element.nodeName === 'SELECT')\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer = this.options.errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof $errorsContainer) {\n if ($($errorsContainer).length)\n return $($errorsContainer).append(this._ui.$errorsWrapper);\n else if ('function' === typeof window[$errorsContainer])\n $errorsContainer = window[$errorsContainer];\n else\n Utils.warn('The errors container `' + $errorsContainer + '` does not exist in DOM nor as a global JS function');\n }\n\n if ('function' === typeof $errorsContainer)\n $errorsContainer = $errorsContainer.call(this, this);\n\n if ('object' === typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n return this._inputHolder().after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(Utils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this._validateIfNeeded();\n });\n else if (trigger = Utils.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._validateIfNeeded(event);\n });\n }\n },\n\n _validateIfNeeded: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (event && /key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n if (this.options.debounce) {\n window.clearTimeout(this._debounced);\n this._debounced = window.setTimeout(() => this.validate(), this.options.debounce);\n } else\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n};\n\nexport default UI;\n","import $ from 'jquery';\nimport Base from './base';\nimport Utils from './utils';\n\nvar Form = function (element, domOptions, options) {\n this.__class__ = 'Form';\n\n this.element = element;\n this.$element = $(element);\n this.domOptions = domOptions;\n this.options = options;\n this.parent = window.Parsley;\n\n this.fields = [];\n this.validationResult = null;\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nForm.prototype = {\n onSubmitValidate: function (event) {\n // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var submitSource = this._submitSource || this.$element.find(Utils._SubmitSelector)[0];\n this._submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if (submitSource && null !== submitSource.getAttribute('formnovalidate'))\n return;\n\n window.Parsley._remoteCache = {};\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit(submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._submitSource = event.currentTarget;\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function (submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if (submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('<input class=\"parsley-synthetic-submit-button\" type=\"hidden\">').appendTo(this.$element);\n $synthetic.attr({\n name: submitSource.getAttribute('name'),\n value: submitSource.getAttribute('value')\n });\n }\n\n this.$element.trigger(Object.assign($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = Object.assign({}, event, {preventDefault: () => {\n Utils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return Utils.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return Utils.all(promises);\n },\n\n refresh: function() {\n this._refreshFields();\n return this;\n },\n\n // Reset UI\n reset: function () {\n // Form case: emit a reset event for each field\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n\n // Form case: destroy all its fields and then destroy stored instance\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].destroy();\n\n this.$element.removeData('Parsley');\n this._trigger('destroy');\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `Field` and `FieldMultiple` children\n if (('Field' === fieldInstance.__class__ || 'FieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded)) {\n let uniqueId = fieldInstance.__class__ + '-' + fieldInstance.__id__;\n if ('undefined' === typeof this.fieldsMappedById[uniqueId]) {\n this.fieldsMappedById[uniqueId] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n }\n });\n\n $.each(Utils.difference(oldFields, this.fields), (_, field) => {\n field.reset();\n });\n });\n return this;\n },\n\n // Internal only.\n // Looping on a form's fields to do validation or similar\n // will trigger reactualizing options on all of them, which\n // in turn will reactualize the form's options.\n // To avoid calling actualizeOptions so many times on the form\n // for nothing, _withoutReactualizingFormOptions temporarily disables\n // the method actualizeOptions on this form while `fn` is called.\n _withoutReactualizingFormOptions: function (fn) {\n var oldActualizeOptions = this.actualizeOptions;\n this.actualizeOptions = function () { return this; };\n var result = fn();\n this.actualizeOptions = oldActualizeOptions;\n return result;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n // Returns true iff event is not interrupted and default not prevented.\n _trigger: function (eventName) {\n return this.trigger('form:' + eventName);\n }\n\n};\n\nexport default Form;\n","import Utils from './utils';\nimport Validator from './validator';\n\nconst Constraint = function(parsleyField, name, requirements, priority, isDomConstraint) {\n const validatorSpec = window.Parsley._validatorRegistry.validators[name];\n const validator = new Validator(validatorSpec);\n priority = priority || parsleyField.options[name + 'Priority'] || validator.priority;\n isDomConstraint = (true === isDomConstraint);\n\n Object.assign(this, {\n validator,\n name,\n requirements,\n priority,\n isDomConstraint\n });\n this._parseRequirements(parsleyField.options);\n};\n\nconst capitalize = function(str) {\n const cap = str[0].toUpperCase();\n return cap + str.slice(1);\n};\n\nConstraint.prototype = {\n validate: function(value, instance) {\n return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n};\n\nexport default Constraint;\n","import $ from 'jquery';\nimport Constraint from './constraint';\nimport UI from './ui';\nimport Utils from './utils';\n\nvar Field = function (field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'Field';\n\n this.element = field;\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nField.prototype = {\n // # Public API\n // Validate field and trigger some events for mainly `UI`\n // @returns `true`, an array of the validators that failed, or\n // `null` if validation is not finished. Prefer using whenValidate\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `UI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refresh();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if (Array.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refresh();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = Utils.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return Utils.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return Utils.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // Reset UI\n reset: function () {\n this._resetUI();\n return this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n this.$element.removeData('Parsley');\n this.$element.removeData('FieldMultiple');\n this._trigger('destroy');\n },\n\n // Actualize options and rebind constraints\n refresh: function () {\n this._refreshConstraints();\n return this;\n },\n\n _refreshConstraints: function () {\n return this.actualizeOptions()._bindConstraints();\n },\n\n refreshConstraints: function() {\n Utils.warnOnce(\"Parsley's refreshConstraints is deprecated. Please use refresh\");\n return this.refresh();\n },\n\n /**\n * Add a new constraint to a field\n *\n * @param {String} name\n * @param {Mixed} requirements optional\n * @param {Number} priority optional\n * @param {Boolean} isDomConstraint optional\n */\n addConstraint: function (name, requirements, priority, isDomConstraint) {\n\n if (window.Parsley._validatorRegistry.validators[name]) {\n var constraint = new Constraint(this, name, requirements, priority, isDomConstraint);\n\n // if constraint already exist, delete it and push new version\n if ('undefined' !== this.constraintsByName[constraint.name])\n this.removeConstraint(constraint.name);\n\n this.constraints.push(constraint);\n this.constraintsByName[constraint.name] = constraint;\n }\n\n return this;\n },\n\n // Remove a constraint\n removeConstraint: function (name) {\n for (var i = 0; i < this.constraints.length; i++)\n if (name === this.constraints[i].name) {\n this.constraints.splice(i, 1);\n break;\n }\n delete this.constraintsByName[name];\n return this;\n },\n\n // Update a constraint (Remove + re-add)\n updateConstraint: function (name, parameters, priority) {\n return this.removeConstraint(name)\n .addConstraint(name, parameters, priority);\n },\n\n // # Internals\n\n // Internal only.\n // Bind constraints from config + options + DOM\n _bindConstraints: function () {\n var constraints = [];\n var constraintsByName = {};\n\n // clean all existing DOM constraints to only keep javascript user constraints\n for (var i = 0; i < this.constraints.length; i++)\n if (false === this.constraints[i].isDomConstraint) {\n constraints.push(this.constraints[i]);\n constraintsByName[this.constraints[i].name] = this.constraints[i];\n }\n\n this.constraints = constraints;\n this.constraintsByName = constraintsByName;\n\n // then re-add Parsley DOM-API constraints\n for (var name in this.options)\n this.addConstraint(name, this.options[name], undefined, true);\n\n // finally, bind special HTML5 constraints\n return this._bindHtml5Constraints();\n },\n\n // Internal only.\n // Bind specific HTML5 constraints to be HTML5 compliant\n _bindHtml5Constraints: function () {\n // html5 required\n if (null !== this.element.getAttribute('required'))\n this.addConstraint('required', true, undefined, true);\n\n // html5 pattern\n if (null !== this.element.getAttribute('pattern'))\n this.addConstraint('pattern', this.element.getAttribute('pattern'), undefined, true);\n\n // range\n let min = this.element.getAttribute('min');\n let max = this.element.getAttribute('max');\n if (null !== min && null !== max)\n this.addConstraint('range', [min, max], undefined, true);\n\n // HTML5 min\n else if (null !== min)\n this.addConstraint('min', min, undefined, true);\n\n // HTML5 max\n else if (null !== max)\n this.addConstraint('max', max, undefined, true);\n\n\n // length\n if (null !== this.element.getAttribute('minlength') && null !== this.element.getAttribute('maxlength'))\n this.addConstraint('length', [this.element.getAttribute('minlength'), this.element.getAttribute('maxlength')], undefined, true);\n\n // HTML5 minlength\n else if (null !== this.element.getAttribute('minlength'))\n this.addConstraint('minlength', this.element.getAttribute('minlength'), undefined, true);\n\n // HTML5 maxlength\n else if (null !== this.element.getAttribute('maxlength'))\n this.addConstraint('maxlength', this.element.getAttribute('maxlength'), undefined, true);\n\n\n // html5 types\n var type = Utils.getType(this.element);\n\n // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n if ('number' === type) {\n return this.addConstraint('type', ['number', {\n step: this.element.getAttribute('step') || '1',\n base: min || this.element.getAttribute('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range|date)$/i.test(type)) {\n return this.addConstraint('type', type, undefined, true);\n }\n return this;\n },\n\n // Internal only.\n // Field is required if have required constraint without `false` value\n _isRequired: function () {\n if ('undefined' === typeof this.constraintsByName.required)\n return false;\n\n return false !== this.constraintsByName.required.requirements;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n _trigger: function (eventName) {\n return this.trigger('field:' + eventName);\n },\n\n // Internal only\n // Handles whitespace in a value\n // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n _handleWhitespace: function (value) {\n if (true === this.options.trimValue)\n Utils.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n if ('squish' === this.options.whitespace)\n value = value.replace(/\\s{2,}/g, ' ');\n\n if (('trim' === this.options.whitespace) || ('squish' === this.options.whitespace) || (true === this.options.trimValue))\n value = Utils.trimString(value);\n\n return value;\n },\n\n _isDateInput: function() {\n var c = this.constraintsByName.type;\n return c && c.requirements === 'date';\n },\n\n // Internal only.\n // Returns the constraints, grouped by descending priority.\n // The result is thus an array of arrays of constraints.\n _getGroupedConstraints: function () {\n if (false === this.options.priorityEnabled)\n return [this.constraints];\n\n var groupedConstraints = [];\n var index = {};\n\n // Create array unique of priorities\n for (var i = 0; i < this.constraints.length; i++) {\n var p = this.constraints[i].priority;\n if (!index[p])\n groupedConstraints.push(index[p] = []);\n index[p].push(this.constraints[i]);\n }\n // Sort them by priority DESC\n groupedConstraints.sort(function (a, b) { return b[0].priority - a[0].priority; });\n\n return groupedConstraints;\n }\n\n};\n\nexport default Field;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar Multiple = function () {\n this.__class__ = 'FieldMultiple';\n};\n\nMultiple.prototype = {\n // Add new `$element` sibling for multiple field\n addElement: function ($element) {\n this.$elements.push($element);\n\n return this;\n },\n\n // See `Field._refreshConstraints()`\n _refreshConstraints: function () {\n var fieldConstraints;\n\n this.constraints = [];\n\n // Select multiple special treatment\n if (this.element.nodeName === 'SELECT') {\n this.actualizeOptions()._bindConstraints();\n\n return this;\n }\n\n // Gather all constraints for each input in the multiple group\n for (var i = 0; i < this.$elements.length; i++) {\n\n // Check if element have not been dynamically removed since last binding\n if (!$('html').has(this.$elements[i]).length) {\n this.$elements.splice(i, 1);\n continue;\n }\n\n fieldConstraints = this.$elements[i].data('FieldMultiple')._refreshConstraints().constraints;\n\n for (var j = 0; j < fieldConstraints.length; j++)\n this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n }\n\n return this;\n },\n\n // See `Field.getValue()`\n getValue: function () {\n // Value could be overriden in DOM\n if ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.element.nodeName === 'INPUT') {\n var type = Utils.getType(this.element);\n if (type === 'radio')\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (type === 'checkbox') {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n }\n\n // Select multiple case\n if (this.element.nodeName === 'SELECT' && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n};\n\nexport default Multiple;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Base from './base';\nimport Form from './form';\nimport Field from './field';\nimport Multiple from './multiple';\n\nvar Factory = function (element, options, parsleyFormInstance) {\n this.element = element;\n this.$element = $(element);\n\n // If the element has already been bound, returns its saved Parsley instance\n var savedparsleyFormInstance = this.$element.data('Parsley');\n if (savedparsleyFormInstance) {\n\n // If the saved instance has been bound without a Form parent and there is one given in this call, add it\n if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n savedparsleyFormInstance.parent = parsleyFormInstance;\n savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n }\n\n if ('object' === typeof options) {\n Object.assign(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && 'Form' !== parsleyFormInstance.__class__)\n throw new Error('Parent instance must be a Form instance');\n\n this.parent = parsleyFormInstance || window.Parsley;\n return this.init(options);\n};\n\nFactory.prototype = {\n init: function (options) {\n this.__class__ = 'Parsley';\n this.__version__ = '@@version';\n this.__id__ = Utils.generateID();\n\n // Pre-compute options\n this._resetOptions(options);\n\n // A Form instance is obviously a `<form>` element but also every node that is not an input and has the `data-parsley-validate` attribute\n if (this.element.nodeName === 'FORM' || (Utils.checkAttr(this.element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)))\n return this.bind('parsleyForm');\n\n // Every other element is bound as a `Field` or `FieldMultiple`\n return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n },\n\n isMultiple: function () {\n var type = Utils.getType(this.element);\n return ((type === 'radio' || type === 'checkbox') ||\n (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')));\n },\n\n // Multiples fields are a real nightmare :(\n // Maybe some refactoring would be appreciated here...\n handleMultiple: function () {\n var name;\n var multiple;\n var parsleyMultipleInstance;\n\n // Handle multiple name\n this.options.multiple = this.options.multiple ||\n (name = this.element.getAttribute('name')) ||\n this.element.getAttribute('id');\n\n // Special select multiple input\n if (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')) {\n this.options.multiple = this.options.multiple || this.__id__;\n return this.bind('parsleyFieldMultiple');\n\n // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n } else if (!this.options.multiple) {\n Utils.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n return this;\n }\n\n // Remove special chars\n this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, '');\n\n // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n if (name) {\n $('input[name=\"' + name + '\"]').each((i, input) => {\n var type = Utils.getType(input);\n if ((type === 'radio' || type === 'checkbox'))\n input.setAttribute(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('FieldMultiple')) {\n parsleyMultipleInstance.addElement(this.$element);\n }\n\n break;\n }\n }\n\n // Create a secret Field instance for every multiple field. It will be stored in `data('FieldMultiple')`\n // And will be useful later to access classic `Field` stuff while being in a `FieldMultiple` instance\n this.bind('parsleyField', true);\n\n return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n },\n\n // Return proper `Form`, `Field` or `FieldMultiple`\n bind: function (type, doNotStore) {\n var parsleyInstance;\n\n switch (type) {\n case 'parsleyForm':\n parsleyInstance = $.extend(\n new Form(this.element, this.domOptions, this.options),\n new Base(),\n window.ParsleyExtend\n )._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(\n new Field(this.element, this.domOptions, this.options, this.parent),\n new Base(),\n window.ParsleyExtend\n );\n break;\n case 'parsleyFieldMultiple':\n parsleyInstance = $.extend(\n new Field(this.element, this.domOptions, this.options, this.parent),\n new Multiple(),\n new Base(),\n window.ParsleyExtend\n )._init();\n break;\n default:\n throw new Error(type + 'is not a supported Parsley type');\n }\n\n if (this.options.multiple)\n Utils.setAttr(this.element, this.options.namespace, 'multiple', this.options.multiple);\n\n if ('undefined' !== typeof doNotStore) {\n this.$element.data('FieldMultiple', parsleyInstance);\n\n return parsleyInstance;\n }\n\n // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n this.$element.data('Parsley', parsleyInstance);\n\n // Tell the world we have a new Form or Field instance!\n parsleyInstance._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n};\n\nexport default Factory;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Defaults from './defaults';\nimport Base from './base';\nimport ValidatorRegistry from './validator_registry';\nimport UI from './ui';\nimport Form from './form';\nimport Field from './field';\nimport Multiple from './multiple';\nimport Factory from './factory';\n\nvar vernums = $.fn.jquery.split('.');\nif (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n}\nif (!vernums.forEach) {\n Utils.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n}\n// Inherit `on`, `off` & `trigger` to Parsley:\nvar Parsley = Object.assign(new Base(), {\n element: document,\n $element: $(document),\n actualizeOptions: null,\n _resetOptions: null,\n Factory: Factory,\n version: '@@version'\n });\n\n// Supplement Field and Form with Base\n// This way, the constructors will have access to those methods\nObject.assign(Field.prototype, UI.Field, Base.prototype);\nObject.assign(Form.prototype, UI.Form, Base.prototype);\n// Inherit actualizeOptions and _resetOptions:\nObject.assign(Factory.prototype, Base.prototype);\n\n// ### jQuery API\n// `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n$.fn.parsley = $.fn.psly = function (options) {\n if (this.length > 1) {\n var instances = [];\n\n this.each(function () {\n instances.push($(this).parsley(options));\n });\n\n return instances;\n }\n\n // Return undefined if applied to non existing DOM element\n if (this.length == 0) {\n return;\n }\n\n return new Factory(this[0], options);\n};\n\n// ### Field and Form extension\n// Ensure the extension is now defined if it wasn't previously\nif ('undefined' === typeof window.ParsleyExtend)\n window.ParsleyExtend = {};\n\n// ### Parsley config\n// Inherit from ParsleyDefault, and copy over any existing values\nParsley.options = Object.assign(Utils.objectCreate(Defaults), window.ParsleyConfig);\nwindow.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n// ### Globals\nwindow.Parsley = window.psly = Parsley;\nParsley.Utils = Utils;\nwindow.ParsleyUtils = {};\n$.each(Utils, (key, value) => {\n if ('function' === typeof value) {\n window.ParsleyUtils[key] = (...args) => {\n Utils.warnOnce('Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.');\n return Utils[key](...args);\n };\n }\n});\n\n// ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\nvar registry = window.Parsley._validatorRegistry = new ValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\nwindow.ParsleyValidator = {};\n$.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator hasValidator'.split(' '), function (i, method) {\n window.Parsley[method] = (...args) => registry[method](...args);\n window.ParsleyValidator[method] = function () {\n Utils.warnOnce(`Accessing the method '${method}' through Validator is deprecated. Simply call 'window.Parsley.${method}(...)'`);\n return window.Parsley[method](...arguments);\n };\n});\n\n// ### UI\n// Deprecated global object\nwindow.Parsley.UI = UI;\nwindow.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce(`Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n Utils.warnOnce(`Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n};\n$.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce(`Accessing UI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n});\n\n// ### PARSLEY auto-binding\n// Prevent it by setting `ParsleyConfig.autoBind` to `false`\nif (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n}\n\nexport default Parsley;\n","import $ from 'jquery';\nimport Field from './field';\nimport Form from './form';\nimport Utils from './utils';\n\nvar o = $({});\nvar deprecated = function () {\n Utils.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n};\n\n// Returns an event handler that calls `fn` with the arguments it expects\nfunction adapt(fn, context) {\n // Store to allow unbinding\n if (!fn.parsleyAdaptedCallback) {\n fn.parsleyAdaptedCallback = function () {\n var args = Array.prototype.slice.call(arguments, 0);\n args.unshift(this);\n fn.apply(context || o, args);\n };\n }\n return fn.parsleyAdaptedCallback;\n}\n\nvar eventPrefix = 'parsley:';\n// Converts 'parsley:form:validate' into 'form:validate'\nfunction eventName(name) {\n if (name.lastIndexOf(eventPrefix, 0) === 0)\n return name.substr(eventPrefix.length);\n return name;\n}\n\n// $.listen is deprecated. Use Parsley.on instead.\n$.listen = function (name, callback) {\n var context;\n deprecated();\n if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n context = arguments[1];\n callback = arguments[2];\n }\n\n if ('function' !== typeof callback)\n throw new Error('Wrong parameters');\n\n window.Parsley.on(eventName(name), adapt(callback, context));\n};\n\n$.listenTo = function (instance, name, fn) {\n deprecated();\n if (!(instance instanceof Field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong parameters');\n\n instance.on(eventName(name), adapt(fn));\n};\n\n$.unsubscribe = function (name, fn) {\n deprecated();\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong arguments');\n window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n};\n\n$.unsubscribeTo = function (instance, name) {\n deprecated();\n if (!(instance instanceof Field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n instance.off(eventName(name));\n};\n\n$.unsubscribeAll = function (name) {\n deprecated();\n window.Parsley.off(eventName(name));\n $('form,input,textarea,select').each(function () {\n var instance = $(this).data('Parsley');\n if (instance) {\n instance.off(eventName(name));\n }\n });\n};\n\n// $.emit is deprecated. Use jQuery events instead.\n$.emit = function (name, instance) {\n deprecated();\n var instanceGiven = (instance instanceof Field) || (instance instanceof Form);\n var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n args.unshift(eventName(name));\n if (!instanceGiven) {\n instance = window.Parsley;\n }\n instance.trigger(...args);\n};\n\nexport default {};\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Base from './base';\n\nimport Parsley from './main';\n\n$.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n});\n\nParsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.element.getAttribute('name') || instance.element.getAttribute('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n});\n\nParsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n});\n\nBase.prototype.addAsyncValidator = function () {\n Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n};\n","// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\nimport Parsley from '../parsley/main';\n\nParsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n});\n\nParsley.setLocale('en');\n","/**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune <github@marc-andre.ca>\n * @license MIT\n */\n\nimport $ from 'jquery';\n\nfunction InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n Object.assign(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n};\n\nexport default new InputEvent();\n","import $ from 'jquery';\nimport Parsley from './parsley/main';\nimport './parsley/pubsub';\nimport './parsley/remote';\nimport './i18n/en';\nimport inputevent from './vendor/inputevent';\n\ninputevent.install();\n\nexport default Parsley;\n"]}
@@ -1,18 +1,18 @@
1
1
  /*!
2
2
  * Parsley.js
3
- * Version 2.7.0 - built Wed, Mar 1st 2017, 3:53 pm
3
+ * Version 2.8.1 - built Sat, Feb 3rd 2018, 2:27 pm
4
4
  * http://parsleyjs.org
5
5
  * Guillaume Potier - <guillaume@wisembly.com>
6
6
  * Marc-Andre Lafortune - <petroselinum@marc-andre.ca>
7
7
  * MIT Licensed
8
8
  */
9
- function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,i=Array(e.length);t<e.length;t++)i[t]=e[t];return i}return Array.from(e)}var _slice=Array.prototype.slice,_slicedToArray=function(){function e(e,t){var i=[],n=!0,r=!1,s=void 0;try{for(var a,o=e[Symbol.iterator]();!(n=(a=o.next()).done)&&(i.push(a.value),!t||i.length!==t);n=!0);}catch(l){r=!0,s=l}finally{try{!n&&o["return"]&&o["return"]()}finally{if(r)throw s}}return i}return function(t,i){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,i);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],t):e.parsley=t(e.jQuery)}(this,function(e){"use strict";function t(e,t){return e.parsleyAdaptedCallback||(e.parsleyAdaptedCallback=function(){var i=Array.prototype.slice.call(arguments,0);i.unshift(this),e.apply(t||D,i)}),e.parsleyAdaptedCallback}function i(e){return 0===e.lastIndexOf(I,0)?e.substr(I.length):e}/**
9
+ function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,i=Array(e.length);t<e.length;t++)i[t]=e[t];return i}return Array.from(e)}var _slice=Array.prototype.slice,_slicedToArray=function(){function e(e,t){var i=[],n=!0,r=!1,s=void 0;try{for(var a,o=e[Symbol.iterator]();!(n=(a=o.next()).done)&&(i.push(a.value),!t||i.length!==t);n=!0);}catch(l){r=!0,s=l}finally{try{!n&&o["return"]&&o["return"]()}finally{if(r)throw s}}return i}return function(t,i){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,i);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),_extends=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var i=arguments[t];for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n])}return e};!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],t):e.parsley=t(e.jQuery)}(this,function(e){"use strict";function t(e,t){return e.parsleyAdaptedCallback||(e.parsleyAdaptedCallback=function(){var i=Array.prototype.slice.call(arguments,0);i.unshift(this),e.apply(t||M,i)}),e.parsleyAdaptedCallback}function i(e){return 0===e.lastIndexOf(D,0)?e.substr(D.length):e}/**
10
10
  * inputevent - Alleviate browser bugs for input events
11
11
  * https://github.com/marcandre/inputevent
12
12
  * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)
13
13
  * @author Marc-Andre Lafortune <github@marc-andre.ca>
14
14
  * @license MIT
15
15
  */
16
- function n(){var t=this,i=window||global;e.extend(this,{isNativeEvent:function(e){return e.originalEvent&&e.originalEvent.isTrusted!==!1},fakeInputEvent:function(i){t.isNativeEvent(i)&&e(i.target).trigger("input")},misbehaves:function(i){t.isNativeEvent(i)&&(t.behavesOk(i),e(document).on("change.inputevent",i.data.selector,t.fakeInputEvent),t.fakeInputEvent(i))},behavesOk:function(i){t.isNativeEvent(i)&&e(document).off("input.inputevent",i.data.selector,t.behavesOk).off("change.inputevent",i.data.selector,t.misbehaves)},install:function(){if(!i.inputEventPatched){i.inputEventPatched="0.0.3";for(var n=["select",'input[type="checkbox"]','input[type="radio"]','input[type="file"]'],r=0;r<n.length;r++){var s=n[r];e(document).on("input.inputevent",s,{selector:s},t.behavesOk).on("change.inputevent",s,{selector:s},t.misbehaves)}}},uninstall:function(){delete i.inputEventPatched,e(document).off(".inputevent")}})}var r=1,s={},a={attr:function(e,t,i){var n,r,s,a=new RegExp("^"+t,"i");if("undefined"==typeof i)i={};else for(n in i)i.hasOwnProperty(n)&&delete i[n];if("undefined"==typeof e||"undefined"==typeof e[0])return i;for(s=e[0].attributes,n=s.length;n--;)r=s[n],r&&r.specified&&a.test(r.name)&&(i[this.camelize(r.name.slice(t.length))]=this.deserializeValue(r.value));return i},checkAttr:function(e,t,i){return e.is("["+t+i+"]")},setAttr:function(e,t,i,n){e[0].setAttribute(this.dasherize(t+i),String(n))},generateID:function(){return""+r++},deserializeValue:function(t){var i;try{return t?"true"==t||"false"!=t&&("null"==t?null:isNaN(i=Number(t))?/^[\[\{]/.test(t)?e.parseJSON(t):t:i):t}catch(n){return t}},camelize:function(e){return e.replace(/-+(.)?/g,function(e,t){return t?t.toUpperCase():""})},dasherize:function(e){return e.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()},warn:function(){var e;window.console&&"function"==typeof window.console.warn&&(e=window.console).warn.apply(e,arguments)},warnOnce:function(e){s[e]||(s[e]=!0,this.warn.apply(this,arguments))},_resetWarnings:function(){s={}},trimString:function(e){return e.replace(/^\s+|\s+$/g,"")},parse:{date:function z(e){var t=e.match(/^(\d{4,})-(\d\d)-(\d\d)$/);if(!t)return null;var i=t.map(function(e){return parseInt(e,10)}),n=_slicedToArray(i,4),r=(n[0],n[1]),s=n[2],a=n[3],z=new Date(r,s-1,a);return z.getFullYear()!==r||z.getMonth()+1!==s||z.getDate()!==a?null:z},string:function(e){return e},integer:function(e){return isNaN(e)?null:parseInt(e,10)},number:function(e){if(isNaN(e))throw null;return parseFloat(e)},"boolean":function(e){return!/^\s*false\s*$/i.test(e)},object:function(e){return a.deserializeValue(e)},regexp:function(e){var t="";return/^\/.*\/(?:[gimy]*)$/.test(e)?(t=e.replace(/.*\/([gimy]*)$/,"$1"),e=e.replace(new RegExp("^/(.*?)/"+t+"$"),"$1")):e="^"+e+"$",new RegExp(e,t)}},parseRequirement:function(e,t){var i=this.parse[e||"string"];if(!i)throw'Unknown requirement specification: "'+e+'"';var n=i(t);if(null===n)throw"Requirement is not a "+e+': "'+t+'"';return n},namespaceEvents:function(t,i){return t=this.trimString(t||"").split(/\s+/),t[0]?e.map(t,function(e){return e+"."+i}).join(" "):""},difference:function(t,i){var n=[];return e.each(t,function(e,t){i.indexOf(t)==-1&&n.push(t)}),n},all:function(t){return e.when.apply(e,_toConsumableArray(t).concat([42,42]))},objectCreate:Object.create||function(){var e=function(){};return function(t){if(arguments.length>1)throw Error("Second argument not supported");if("object"!=typeof t)throw TypeError("Argument must be an object");e.prototype=t;var i=new e;return e.prototype=null,i}}(),_SubmitSelector:'input[type="submit"], button:submit'},o=a,l={namespace:"data-parsley-",inputs:"input, textarea, select",excluded:"input[type=button], input[type=submit], input[type=reset], input[type=hidden]",priorityEnabled:!0,multiple:null,group:null,uiEnabled:!0,validationThreshold:3,focus:"first",trigger:!1,triggerAfterFailure:"input",errorClass:"parsley-error",successClass:"parsley-success",classHandler:function(e){},errorsContainer:function(e){},errorsWrapper:'<ul class="parsley-errors-list"></ul>',errorTemplate:"<li></li>"},u=function(){this.__id__=o.generateID()};u.prototype={asyncSupport:!0,_pipeAccordingToValidationResult:function(){var t=this,i=function(){var i=e.Deferred();return!0!==t.validationResult&&i.reject(),i.resolve().promise()};return[i,i]},actualizeOptions:function(){return o.attr(this.$element,this.options.namespace,this.domOptions),this.parent&&this.parent.actualizeOptions&&this.parent.actualizeOptions(),this},_resetOptions:function(e){this.domOptions=o.objectCreate(this.parent.options),this.options=o.objectCreate(this.domOptions);for(var t in e)e.hasOwnProperty(t)&&(this.options[t]=e[t]);this.actualizeOptions()},_listeners:null,on:function(e,t){this._listeners=this._listeners||{};var i=this._listeners[e]=this._listeners[e]||[];return i.push(t),this},subscribe:function(t,i){e.listenTo(this,t.toLowerCase(),i)},off:function(e,t){var i=this._listeners&&this._listeners[e];if(i)if(t)for(var n=i.length;n--;)i[n]===t&&i.splice(n,1);else delete this._listeners[e];return this},unsubscribe:function(t,i){e.unsubscribeTo(this,t.toLowerCase())},trigger:function(e,t,i){t=t||this;var n,r=this._listeners&&this._listeners[e];if(r)for(var s=r.length;s--;)if(n=r[s].call(t,t,i),n===!1)return n;return!this.parent||this.parent.trigger(e,t,i)},asyncIsValid:function(e,t){return o.warnOnce("asyncIsValid is deprecated; please use whenValid instead"),this.whenValid({group:e,force:t})},_findRelated:function(){return this.options.multiple?this.parent.$element.find("["+this.options.namespace+'multiple="'+this.options.multiple+'"]'):this.$element}};var d=function(e,t){var i=e.match(/^\s*\[(.*)\]\s*$/);if(!i)throw'Requirement is not an array: "'+e+'"';var n=i[1].split(",").map(o.trimString);if(n.length!==t)throw"Requirement has "+n.length+" values when "+t+" are needed";return n},h=function(e,t,i){var n=null,r={};for(var s in e)if(s){var a=i(s);"string"==typeof a&&(a=o.parseRequirement(e[s],a)),r[s]=a}else n=o.parseRequirement(e[s],t);return[n,r]},p=function(t){e.extend(!0,this,t)};p.prototype={validate:function(t,i){if(this.fn)return arguments.length>3&&(i=[].slice.call(arguments,1,-1)),this.fn(t,i);if(e.isArray(t)){if(!this.validateMultiple)throw"Validator `"+this.name+"` does not handle multiple values";return this.validateMultiple.apply(this,arguments)}var n=arguments[arguments.length-1];if(this.validateDate&&n._isDateInput())return arguments[0]=o.parse.date(arguments[0]),null!==arguments[0]&&this.validateDate.apply(this,arguments);if(this.validateNumber)return!isNaN(t)&&(arguments[0]=parseFloat(arguments[0]),this.validateNumber.apply(this,arguments));if(this.validateString)return this.validateString.apply(this,arguments);throw"Validator `"+this.name+"` only handles multiple values"},parseRequirements:function(t,i){if("string"!=typeof t)return e.isArray(t)?t:[t];var n=this.requirementType;if(e.isArray(n)){for(var r=d(t,n.length),s=0;s<r.length;s++)r[s]=o.parseRequirement(n[s],r[s]);return r}return e.isPlainObject(n)?h(n,t,i):[o.parseRequirement(n,t)]},requirementType:"string",priority:2};var c=function(e,t){this.__class__="ValidatorRegistry",this.locale="en",this.init(e||{},t||{})},f={email:/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,number:/^-?(\d*\.)?\d+(e[-+]?\d+)?$/i,integer:/^-?\d+$/,digits:/^\d+$/,alphanum:/^\w+$/i,date:{test:function(e){return null!==o.parse.date(e)}},url:new RegExp("^(?:(?:https?|ftp)://)?(?:\\S+(?::\\S*)?@)?(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))(?::\\d{2,5})?(?:/\\S*)?$","i")};f.range=f.number;var m=function(e){var t=(""+e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0},g=function(e,t){return t.map(o.parse[e])},v=function(e,t){return function(i){for(var n=arguments.length,r=Array(n>1?n-1:0),s=1;s<n;s++)r[s-1]=arguments[s];return r.pop(),t.apply(void 0,[i].concat(_toConsumableArray(g(e,r))))}},y=function(e){return{validateDate:v("date",e),validateNumber:v("number",e),requirementType:e.length<=2?"string":["string","string"],priority:30}};c.prototype={init:function(t,i){this.catalog=i,this.validators=e.extend({},this.validators);for(var n in t)this.addValidator(n,t[n].fn,t[n].priority);window.Parsley.trigger("parsley:validator:init")},setLocale:function(e){if("undefined"==typeof this.catalog[e])throw new Error(e+" is not available in the catalog");return this.locale=e,this},addCatalog:function(e,t,i){return"object"==typeof t&&(this.catalog[e]=t),!0===i?this.setLocale(e):this},addMessage:function(e,t,i){return"undefined"==typeof this.catalog[e]&&(this.catalog[e]={}),this.catalog[e][t]=i,this},addMessages:function(e,t){for(var i in t)this.addMessage(e,i,t[i]);return this},addValidator:function(e,t,i){if(this.validators[e])o.warn('Validator "'+e+'" is already defined.');else if(l.hasOwnProperty(e))return void o.warn('"'+e+'" is a restricted keyword and is not a valid validator name.');return this._setValidator.apply(this,arguments)},updateValidator:function(e,t,i){return this.validators[e]?this._setValidator.apply(this,arguments):(o.warn('Validator "'+e+'" is not already defined.'),this.addValidator.apply(this,arguments))},removeValidator:function(e){return this.validators[e]||o.warn('Validator "'+e+'" is not defined.'),delete this.validators[e],this},_setValidator:function(e,t,i){"object"!=typeof t&&(t={fn:t,priority:i}),t.validate||(t=new p(t)),this.validators[e]=t;for(var n in t.messages||{})this.addMessage(n,e,t.messages[n]);return this},getErrorMessage:function(e){var t;if("type"===e.name){var i=this.catalog[this.locale][e.name]||{};t=i[e.requirements]}else t=this.formatMessage(this.catalog[this.locale][e.name],e.requirements);return t||this.catalog[this.locale].defaultMessage||this.catalog.en.defaultMessage},formatMessage:function(e,t){if("object"==typeof t){for(var i in t)e=this.formatMessage(e,t[i]);return e}return"string"==typeof e?e.replace(/%s/i,t):""},validators:{notblank:{validateString:function(e){return/\S/.test(e)},priority:2},required:{validateMultiple:function(e){return e.length>0},validateString:function(e){return/\S/.test(e)},priority:512},type:{validateString:function(e,t){var i=arguments.length<=2||void 0===arguments[2]?{}:arguments[2],n=i.step,r=void 0===n?"any":n,s=i.base,a=void 0===s?0:s,o=f[t];if(!o)throw new Error("validator type `"+t+"` is not supported");if(!o.test(e))return!1;if("number"===t&&!/^any$/i.test(r||"")){var l=Number(e),u=Math.max(m(r),m(a));if(m(l)>u)return!1;var d=function(e){return Math.round(e*Math.pow(10,u))};if((d(l)-d(a))%d(r)!=0)return!1}return!0},requirementType:{"":"string",step:"string",base:"number"},priority:256},pattern:{validateString:function(e,t){return t.test(e)},requirementType:"regexp",priority:64},minlength:{validateString:function(e,t){return e.length>=t},requirementType:"integer",priority:30},maxlength:{validateString:function(e,t){return e.length<=t},requirementType:"integer",priority:30},length:{validateString:function(e,t,i){return e.length>=t&&e.length<=i},requirementType:["integer","integer"],priority:30},mincheck:{validateMultiple:function(e,t){return e.length>=t},requirementType:"integer",priority:30},maxcheck:{validateMultiple:function(e,t){return e.length<=t},requirementType:"integer",priority:30},check:{validateMultiple:function(e,t,i){return e.length>=t&&e.length<=i},requirementType:["integer","integer"],priority:30},min:y(function(e,t){return e>=t}),max:y(function(e,t){return e<=t}),range:y(function(e,t,i){return e>=t&&e<=i}),equalto:{validateString:function(t,i){var n=e(i);return n.length?t===n.val():t===i},priority:256}}};var _={},w=function S(e,t,i){for(var n=[],r=[],s=0;s<e.length;s++){for(var a=!1,o=0;o<t.length;o++)if(e[s].assert.name===t[o].assert.name){a=!0;break}a?r.push(e[s]):n.push(e[s])}return{kept:r,added:n,removed:i?[]:S(t,e,!0).added}};_.Form={_actualizeTriggers:function(){var e=this;this.$element.on("submit.Parsley",function(t){e.onSubmitValidate(t)}),this.$element.on("click.Parsley",o._SubmitSelector,function(t){e.onSubmitButton(t)}),!1!==this.options.uiEnabled&&this.$element.attr("novalidate","")},focus:function(){if(this._focusedField=null,!0===this.validationResult||"none"===this.options.focus)return null;for(var e=0;e<this.fields.length;e++){var t=this.fields[e];if(!0!==t.validationResult&&t.validationResult.length>0&&"undefined"==typeof t.options.noFocus&&(this._focusedField=t.$element,"first"===this.options.focus))break}return null===this._focusedField?null:this._focusedField.focus()},_destroyUI:function(){this.$element.off(".Parsley")}},_.Field={_reflowUI:function(){if(this._buildUI(),this._ui){var e=w(this.validationResult,this._ui.lastValidationResult);this._ui.lastValidationResult=this.validationResult,this._manageStatusClass(),this._manageErrorsMessages(e),this._actualizeTriggers(),!e.kept.length&&!e.added.length||this._failedOnce||(this._failedOnce=!0,this._actualizeTriggers())}},getErrorsMessages:function(){if(!0===this.validationResult)return[];for(var e=[],t=0;t<this.validationResult.length;t++)e.push(this.validationResult[t].errorMessage||this._getErrorMessage(this.validationResult[t].assert));return e},addError:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],i=t.message,n=t.assert,r=t.updateClass,s=void 0===r||r;this._buildUI(),this._addError(e,{message:i,assert:n}),s&&this._errorClass()},updateError:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],i=t.message,n=t.assert,r=t.updateClass,s=void 0===r||r;this._buildUI(),this._updateError(e,{message:i,assert:n}),s&&this._errorClass()},removeError:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],i=t.updateClass,n=void 0===i||i;this._buildUI(),this._removeError(e),n&&this._manageStatusClass()},_manageStatusClass:function(){this.hasConstraints()&&this.needsValidation()&&!0===this.validationResult?this._successClass():this.validationResult.length>0?this._errorClass():this._resetClass()},_manageErrorsMessages:function(t){if("undefined"==typeof this.options.errorsMessagesDisabled){if("undefined"!=typeof this.options.errorMessage)return t.added.length||t.kept.length?(this._insertErrorWrapper(),0===this._ui.$errorsWrapper.find(".parsley-custom-error-message").length&&this._ui.$errorsWrapper.append(e(this.options.errorTemplate).addClass("parsley-custom-error-message")),this._ui.$errorsWrapper.addClass("filled").find(".parsley-custom-error-message").html(this.options.errorMessage)):this._ui.$errorsWrapper.removeClass("filled").find(".parsley-custom-error-message").remove();for(var i=0;i<t.removed.length;i++)this._removeError(t.removed[i].assert.name);for(i=0;i<t.added.length;i++)this._addError(t.added[i].assert.name,{message:t.added[i].errorMessage,assert:t.added[i].assert});for(i=0;i<t.kept.length;i++)this._updateError(t.kept[i].assert.name,{message:t.kept[i].errorMessage,assert:t.kept[i].assert})}},_addError:function(t,i){var n=i.message,r=i.assert;this._insertErrorWrapper(),this._ui.$errorsWrapper.addClass("filled").append(e(this.options.errorTemplate).addClass("parsley-"+t).html(n||this._getErrorMessage(r)))},_updateError:function(e,t){var i=t.message,n=t.assert;this._ui.$errorsWrapper.addClass("filled").find(".parsley-"+e).html(i||this._getErrorMessage(n))},_removeError:function(e){this._ui.$errorsWrapper.removeClass("filled").find(".parsley-"+e).remove()},_getErrorMessage:function(e){var t=e.name+"Message";return"undefined"!=typeof this.options[t]?window.Parsley.formatMessage(this.options[t],e.requirements):window.Parsley.getErrorMessage(e)},_buildUI:function(){if(!this._ui&&!1!==this.options.uiEnabled){var t={};this.$element.attr(this.options.namespace+"id",this.__id__),t.$errorClassHandler=this._manageClassHandler(),t.errorsWrapperId="parsley-id-"+(this.options.multiple?"multiple-"+this.options.multiple:this.__id__),t.$errorsWrapper=e(this.options.errorsWrapper).attr("id",t.errorsWrapperId),t.lastValidationResult=[],t.validationInformationVisible=!1,this._ui=t}},_manageClassHandler:function(){if("string"==typeof this.options.classHandler&&e(this.options.classHandler).length)return e(this.options.classHandler);var t=this.options.classHandler.call(this,this);return"undefined"!=typeof t&&t.length?t:this._inputHolder()},_inputHolder:function(){return!this.options.multiple||this.$element.is("select")?this.$element:this.$element.parent()},_insertErrorWrapper:function(){var t;if(0!==this._ui.$errorsWrapper.parent().length)return this._ui.$errorsWrapper.parent();if("string"==typeof this.options.errorsContainer){if(e(this.options.errorsContainer).length)return e(this.options.errorsContainer).append(this._ui.$errorsWrapper);o.warn("The errors container `"+this.options.errorsContainer+"` does not exist in DOM")}else"function"==typeof this.options.errorsContainer&&(t=this.options.errorsContainer.call(this,this));return"undefined"!=typeof t&&t.length?t.append(this._ui.$errorsWrapper):this._inputHolder().after(this._ui.$errorsWrapper)},_actualizeTriggers:function(){var e,t=this,i=this._findRelated();i.off(".Parsley"),this._failedOnce?i.on(o.namespaceEvents(this.options.triggerAfterFailure,"Parsley"),function(){t._validateIfNeeded()}):(e=o.namespaceEvents(this.options.trigger,"Parsley"))&&i.on(e,function(e){t._validateIfNeeded(e)})},_validateIfNeeded:function(e){var t=this;e&&/key|input/.test(e.type)&&(!this._ui||!this._ui.validationInformationVisible)&&this.getValue().length<=this.options.validationThreshold||(this.options.debounce?(window.clearTimeout(this._debounced),this._debounced=window.setTimeout(function(){return t.validate()},this.options.debounce)):this.validate())},_resetUI:function(){this._failedOnce=!1,this._actualizeTriggers(),"undefined"!=typeof this._ui&&(this._ui.$errorsWrapper.removeClass("filled").children().remove(),this._resetClass(),this._ui.lastValidationResult=[],this._ui.validationInformationVisible=!1)},_destroyUI:function(){this._resetUI(),"undefined"!=typeof this._ui&&this._ui.$errorsWrapper.remove(),delete this._ui},_successClass:function(){this._ui.validationInformationVisible=!0,this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass)},_errorClass:function(){this._ui.validationInformationVisible=!0,this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass)},_resetClass:function(){this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass)}};var b=function(t,i,n){this.__class__="Form",this.$element=e(t),this.domOptions=i,this.options=n,this.parent=window.Parsley,this.fields=[],this.validationResult=null},F={pending:null,resolved:!0,rejected:!1};b.prototype={onSubmitValidate:function(e){var t=this;if(!0!==e.parsley){var i=this._$submitSource||this.$element.find(o._SubmitSelector).first();if(this._$submitSource=null,this.$element.find(".parsley-synthetic-submit-button").prop("disabled",!0),!i.is("[formnovalidate]")){var n=this.whenValidate({event:e});"resolved"===n.state()&&!1!==this._trigger("submit")||(e.stopImmediatePropagation(),e.preventDefault(),"pending"===n.state()&&n.done(function(){t._submit(i)}))}}},onSubmitButton:function(t){this._$submitSource=e(t.currentTarget)},_submit:function(t){if(!1!==this._trigger("submit")){if(t){var i=this.$element.find(".parsley-synthetic-submit-button").prop("disabled",!1);0===i.length&&(i=e('<input class="parsley-synthetic-submit-button" type="hidden">').appendTo(this.$element)),i.attr({name:t.attr("name"),value:t.attr("value")})}this.$element.trigger(e.extend(e.Event("submit"),{parsley:!0}))}},validate:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){o.warnOnce("Calling validate on a parsley form without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1],s=i[2];t={group:n,force:r,event:s}}return F[this.whenValidate(t).state()]},whenValidate:function(){var t,i=this,n=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],r=n.group,s=n.force,a=n.event;this.submitEvent=a,a&&(this.submitEvent=e.extend({},a,{preventDefault:function(){o.warnOnce("Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`"),i.validationResult=!1}})),this.validationResult=!0,this._trigger("validate"),this._refreshFields();var l=this._withoutReactualizingFormOptions(function(){return e.map(i.fields,function(e){return e.whenValidate({force:s,group:r})})});return(t=o.all(l).done(function(){i._trigger("success")}).fail(function(){i.validationResult=!1,i.focus(),i._trigger("error")}).always(function(){i._trigger("validated")})).pipe.apply(t,_toConsumableArray(this._pipeAccordingToValidationResult()))},isValid:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){o.warnOnce("Calling isValid on a parsley form without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1];t={group:n,force:r}}return F[this.whenValid(t).state()]},whenValid:function(){var t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.group,r=i.force;this._refreshFields();var s=this._withoutReactualizingFormOptions(function(){return e.map(t.fields,function(e){return e.whenValid({group:n,force:r})})});return o.all(s)},reset:function(){for(var e=0;e<this.fields.length;e++)this.fields[e].reset();this._trigger("reset")},destroy:function(){this._destroyUI();for(var e=0;e<this.fields.length;e++)this.fields[e].destroy();this.$element.removeData("Parsley"),this._trigger("destroy")},_refreshFields:function(){return this.actualizeOptions()._bindFields()},_bindFields:function(){var t=this,i=this.fields;return this.fields=[],this.fieldsMappedById={},this._withoutReactualizingFormOptions(function(){t.$element.find(t.options.inputs).not(t.options.excluded).each(function(e,i){var n=new window.Parsley.Factory(i,{},t);if(("Field"===n.__class__||"FieldMultiple"===n.__class__)&&!0!==n.options.excluded){var r=n.__class__+"-"+n.__id__;"undefined"==typeof t.fieldsMappedById[r]&&(t.fieldsMappedById[r]=n,t.fields.push(n))}}),e.each(o.difference(i,t.fields),function(e,t){t.reset()})}),this},_withoutReactualizingFormOptions:function(e){var t=this.actualizeOptions;this.actualizeOptions=function(){return this};var i=e();return this.actualizeOptions=t,i},_trigger:function(e){return this.trigger("form:"+e)}};var C=function(t,i,n,r,s){var a=window.Parsley._validatorRegistry.validators[i],o=new p(a);e.extend(this,{validator:o,name:i,requirements:n,priority:r||t.options[i+"Priority"]||o.priority,isDomConstraint:!0===s}),this._parseRequirements(t.options)},$=function(e){var t=e[0].toUpperCase();return t+e.slice(1)};C.prototype={validate:function(e,t){var i;return(i=this.validator).validate.apply(i,[e].concat(_toConsumableArray(this.requirementList),[t]))},_parseRequirements:function(e){var t=this;this.requirementList=this.validator.parseRequirements(this.requirements,function(i){return e[t.name+$(i)]})}};var x=function(t,i,n,r){this.__class__="Field",this.$element=e(t),"undefined"!=typeof r&&(this.parent=r),this.options=n,this.domOptions=i,this.constraints=[],this.constraintsByName={},this.validationResult=!0,this._bindConstraints()},E={pending:null,resolved:!0,rejected:!1};x.prototype={validate:function(t){arguments.length>=1&&!e.isPlainObject(t)&&(o.warnOnce("Calling validate on a parsley field without passing arguments as an object is deprecated."),t={options:t});var i=this.whenValidate(t);if(!i)return!0;switch(i.state()){case"pending":return null;case"resolved":return!0;case"rejected":return this.validationResult}},whenValidate:function(){var e,t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.force,r=i.group;if(this.refreshConstraints(),!r||this._isInGroup(r))return this.value=this.getValue(),this._trigger("validate"),(e=this.whenValid({force:n,value:this.value,_refreshed:!0}).always(function(){t._reflowUI()}).done(function(){t._trigger("success")}).fail(function(){t._trigger("error")}).always(function(){t._trigger("validated")})).pipe.apply(e,_toConsumableArray(this._pipeAccordingToValidationResult()))},hasConstraints:function(){return 0!==this.constraints.length},needsValidation:function(e){return"undefined"==typeof e&&(e=this.getValue()),!(!e.length&&!this._isRequired()&&"undefined"==typeof this.options.validateIfEmpty)},_isInGroup:function(t){return e.isArray(this.options.group)?-1!==e.inArray(t,this.options.group):this.options.group===t},isValid:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){o.warnOnce("Calling isValid on a parsley field without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1];t={force:n,value:r}}var s=this.whenValid(t);return!s||E[s.state()]},whenValid:function(){var t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.force,r=void 0!==n&&n,s=i.value,a=i.group,l=i._refreshed;if(l||this.refreshConstraints(),!a||this._isInGroup(a)){if(this.validationResult=!0,!this.hasConstraints())return e.when();if("undefined"!=typeof s&&null!==s||(s=this.getValue()),!this.needsValidation(s)&&!0!==r)return e.when();var u=this._getGroupedConstraints(),d=[];return e.each(u,function(i,n){var r=o.all(e.map(n,function(e){return t._validateConstraint(s,e)}));if(d.push(r),"rejected"===r.state())return!1}),o.all(d)}},_validateConstraint:function(t,i){var n=this,r=i.validate(t,this);return!1===r&&(r=e.Deferred().reject()),o.all([r]).fail(function(e){n.validationResult instanceof Array||(n.validationResult=[]),n.validationResult.push({assert:i,errorMessage:"string"==typeof e&&e})})},getValue:function(){var e;return e="function"==typeof this.options.value?this.options.value(this):"undefined"!=typeof this.options.value?this.options.value:this.$element.val(),"undefined"==typeof e||null===e?"":this._handleWhitespace(e)},reset:function(){return this._resetUI(),this._trigger("reset")},destroy:function(){this._destroyUI(),this.$element.removeData("Parsley"),this.$element.removeData("FieldMultiple"),this._trigger("destroy")},refreshConstraints:function(){return this.actualizeOptions()._bindConstraints()},addConstraint:function(e,t,i,n){if(window.Parsley._validatorRegistry.validators[e]){var r=new C(this,e,t,i,n);"undefined"!==this.constraintsByName[r.name]&&this.removeConstraint(r.name),this.constraints.push(r),this.constraintsByName[r.name]=r}return this},removeConstraint:function(e){for(var t=0;t<this.constraints.length;t++)if(e===this.constraints[t].name){this.constraints.splice(t,1);break}return delete this.constraintsByName[e],this},updateConstraint:function(e,t,i){return this.removeConstraint(e).addConstraint(e,t,i)},_bindConstraints:function(){for(var e=[],t={},i=0;i<this.constraints.length;i++)!1===this.constraints[i].isDomConstraint&&(e.push(this.constraints[i]),t[this.constraints[i].name]=this.constraints[i]);this.constraints=e,this.constraintsByName=t;for(var n in this.options)this.addConstraint(n,this.options[n],void 0,!0);return this._bindHtml5Constraints()},_bindHtml5Constraints:function(){this.$element.attr("required")&&this.addConstraint("required",!0,void 0,!0),"string"==typeof this.$element.attr("pattern")&&this.addConstraint("pattern",this.$element.attr("pattern"),void 0,!0),"undefined"!=typeof this.$element.attr("min")&&"undefined"!=typeof this.$element.attr("max")?this.addConstraint("range",[this.$element.attr("min"),this.$element.attr("max")],void 0,!0):"undefined"!=typeof this.$element.attr("min")?this.addConstraint("min",this.$element.attr("min"),void 0,!0):"undefined"!=typeof this.$element.attr("max")&&this.addConstraint("max",this.$element.attr("max"),void 0,!0),"undefined"!=typeof this.$element.attr("minlength")&&"undefined"!=typeof this.$element.attr("maxlength")?this.addConstraint("length",[this.$element.attr("minlength"),this.$element.attr("maxlength")],void 0,!0):"undefined"!=typeof this.$element.attr("minlength")?this.addConstraint("minlength",this.$element.attr("minlength"),void 0,!0):"undefined"!=typeof this.$element.attr("maxlength")&&this.addConstraint("maxlength",this.$element.attr("maxlength"),void 0,!0);var e=this.$element.attr("type");return"undefined"==typeof e?this:"number"===e?this.addConstraint("type",["number",{step:this.$element.attr("step")||"1",base:this.$element.attr("min")||this.$element.attr("value")}],void 0,!0):/^(email|url|range|date)$/i.test(e)?this.addConstraint("type",e,void 0,!0):this},_isRequired:function(){return"undefined"!=typeof this.constraintsByName.required&&!1!==this.constraintsByName.required.requirements},_trigger:function(e){return this.trigger("field:"+e)},_handleWhitespace:function(e){return!0===this.options.trimValue&&o.warnOnce('data-parsley-trim-value="true" is deprecated, please use data-parsley-whitespace="trim"'),"squish"===this.options.whitespace&&(e=e.replace(/\s{2,}/g," ")),"trim"!==this.options.whitespace&&"squish"!==this.options.whitespace&&!0!==this.options.trimValue||(e=o.trimString(e)),e},_isDateInput:function(){var e=this.constraintsByName.type;return e&&"date"===e.requirements},_getGroupedConstraints:function(){if(!1===this.options.priorityEnabled)return[this.constraints];for(var e=[],t={},i=0;i<this.constraints.length;i++){var n=this.constraints[i].priority;t[n]||e.push(t[n]=[]),t[n].push(this.constraints[i])}return e.sort(function(e,t){return t[0].priority-e[0].priority}),e}};var V=x,P=function(){this.__class__="FieldMultiple"};P.prototype={addElement:function(e){return this.$elements.push(e),this},refreshConstraints:function(){var t;if(this.constraints=[],this.$element.is("select"))return this.actualizeOptions()._bindConstraints(),this;for(var i=0;i<this.$elements.length;i++)if(e("html").has(this.$elements[i]).length){t=this.$elements[i].data("FieldMultiple").refreshConstraints().constraints;for(var n=0;n<t.length;n++)this.addConstraint(t[n].name,t[n].requirements,t[n].priority,t[n].isDomConstraint)}else this.$elements.splice(i,1);return this},getValue:function(){if("function"==typeof this.options.value)return this.options.value(this);if("undefined"!=typeof this.options.value)return this.options.value;if(this.$element.is("input[type=radio]"))return this._findRelated().filter(":checked").val()||"";if(this.$element.is("input[type=checkbox]")){var t=[];return this._findRelated().filter(":checked").each(function(){t.push(e(this).val())}),t}return this.$element.is("select")&&null===this.$element.val()?[]:this.$element.val()},_init:function(){return this.$elements=[this.$element],this}};var A=function(t,i,n){this.$element=e(t);var r=this.$element.data("Parsley");if(r)return"undefined"!=typeof n&&r.parent===window.Parsley&&(r.parent=n,r._resetOptions(r.options)),"object"==typeof i&&e.extend(r.options,i),r;if(!this.$element.length)throw new Error("You must bind Parsley on an existing element.");if("undefined"!=typeof n&&"Form"!==n.__class__)throw new Error("Parent instance must be a Form instance");return this.parent=n||window.Parsley,
17
- this.init(i)};A.prototype={init:function(e){return this.__class__="Parsley",this.__version__="2.7.0",this.__id__=o.generateID(),this._resetOptions(e),this.$element.is("form")||o.checkAttr(this.$element,this.options.namespace,"validate")&&!this.$element.is(this.options.inputs)?this.bind("parsleyForm"):this.isMultiple()?this.handleMultiple():this.bind("parsleyField")},isMultiple:function(){return this.$element.is("input[type=radio], input[type=checkbox]")||this.$element.is("select")&&"undefined"!=typeof this.$element.attr("multiple")},handleMultiple:function(){var t,i,n=this;if(this.options.multiple||("undefined"!=typeof this.$element.attr("name")&&this.$element.attr("name").length?this.options.multiple=t=this.$element.attr("name"):"undefined"!=typeof this.$element.attr("id")&&this.$element.attr("id").length&&(this.options.multiple=this.$element.attr("id"))),this.$element.is("select")&&"undefined"!=typeof this.$element.attr("multiple"))return this.options.multiple=this.options.multiple||this.__id__,this.bind("parsleyFieldMultiple");if(!this.options.multiple)return o.warn("To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.",this.$element),this;this.options.multiple=this.options.multiple.replace(/(:|\.|\[|\]|\{|\}|\$)/g,""),"undefined"!=typeof t&&e('input[name="'+t+'"]').each(function(t,i){e(i).is("input[type=radio], input[type=checkbox]")&&e(i).attr(n.options.namespace+"multiple",n.options.multiple)});for(var r=this._findRelated(),s=0;s<r.length;s++)if(i=e(r.get(s)).data("Parsley"),"undefined"!=typeof i){this.$element.data("FieldMultiple")||i.addElement(this.$element);break}return this.bind("parsleyField",!0),i||this.bind("parsleyFieldMultiple")},bind:function(t,i){var n;switch(t){case"parsleyForm":n=e.extend(new b(this.$element,this.domOptions,this.options),new u,window.ParsleyExtend)._bindFields();break;case"parsleyField":n=e.extend(new V(this.$element,this.domOptions,this.options,this.parent),new u,window.ParsleyExtend);break;case"parsleyFieldMultiple":n=e.extend(new V(this.$element,this.domOptions,this.options,this.parent),new P,new u,window.ParsleyExtend)._init();break;default:throw new Error(t+"is not a supported Parsley type")}return this.options.multiple&&o.setAttr(this.$element,this.options.namespace,"multiple",this.options.multiple),"undefined"!=typeof i?(this.$element.data("FieldMultiple",n),n):(this.$element.data("Parsley",n),n._actualizeTriggers(),n._trigger("init"),n)}};var M=e.fn.jquery.split(".");if(parseInt(M[0])<=1&&parseInt(M[1])<8)throw"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.";M.forEach||o.warn("Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim");var O=e.extend(new u,{$element:e(document),actualizeOptions:null,_resetOptions:null,Factory:A,version:"2.7.0"});e.extend(V.prototype,_.Field,u.prototype),e.extend(b.prototype,_.Form,u.prototype),e.extend(A.prototype,u.prototype),e.fn.parsley=e.fn.psly=function(t){if(this.length>1){var i=[];return this.each(function(){i.push(e(this).parsley(t))}),i}return e(this).length?new A(this,t):void o.warn("You must bind Parsley on an existing element.")},"undefined"==typeof window.ParsleyExtend&&(window.ParsleyExtend={}),O.options=e.extend(o.objectCreate(l),window.ParsleyConfig),window.ParsleyConfig=O.options,window.Parsley=window.psly=O,O.Utils=o,window.ParsleyUtils={},e.each(o,function(e,t){"function"==typeof t&&(window.ParsleyUtils[e]=function(){return o.warnOnce("Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead."),o[e].apply(o,arguments)})});var R=window.Parsley._validatorRegistry=new c(window.ParsleyConfig.validators,window.ParsleyConfig.i18n);window.ParsleyValidator={},e.each("setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator".split(" "),function(t,i){window.Parsley[i]=e.proxy(R,i),window.ParsleyValidator[i]=function(){var e;return o.warnOnce("Accessing the method '"+i+"' through Validator is deprecated. Simply call 'window.Parsley."+i+"(...)'"),(e=window.Parsley)[i].apply(e,arguments)}}),window.Parsley.UI=_,window.ParsleyUI={removeError:function(e,t,i){var n=!0!==i;return o.warnOnce("Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method."),e.removeError(t,{updateClass:n})},getErrorsMessages:function(e){return o.warnOnce("Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly."),e.getErrorsMessages()}},e.each("addError updateError".split(" "),function(e,t){window.ParsleyUI[t]=function(e,i,n,r,s){var a=!0!==s;return o.warnOnce("Accessing UI is deprecated. Call '"+t+"' on the instance directly. Please comment in issue 1073 as to your need to call this method."),e[t](i,{message:n,assert:r,updateClass:a})}}),!1!==window.ParsleyConfig.autoBind&&e(function(){e("[data-parsley-validate]").length&&e("[data-parsley-validate]").parsley()});var D=e({}),T=function(){o.warnOnce("Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley")},I="parsley:";e.listen=function(e,n){var r;if(T(),"object"==typeof arguments[1]&&"function"==typeof arguments[2]&&(r=arguments[1],n=arguments[2]),"function"!=typeof n)throw new Error("Wrong parameters");window.Parsley.on(i(e),t(n,r))},e.listenTo=function(e,n,r){if(T(),!(e instanceof V||e instanceof b))throw new Error("Must give Parsley instance");if("string"!=typeof n||"function"!=typeof r)throw new Error("Wrong parameters");e.on(i(n),t(r))},e.unsubscribe=function(e,t){if(T(),"string"!=typeof e||"function"!=typeof t)throw new Error("Wrong arguments");window.Parsley.off(i(e),t.parsleyAdaptedCallback)},e.unsubscribeTo=function(e,t){if(T(),!(e instanceof V||e instanceof b))throw new Error("Must give Parsley instance");e.off(i(t))},e.unsubscribeAll=function(t){T(),window.Parsley.off(i(t)),e("form,input,textarea,select").each(function(){var n=e(this).data("Parsley");n&&n.off(i(t))})},e.emit=function(e,t){var n;T();var r=t instanceof V||t instanceof b,s=Array.prototype.slice.call(arguments,r?2:1);s.unshift(i(e)),r||(t=window.Parsley),(n=t).trigger.apply(n,_toConsumableArray(s))};e.extend(!0,O,{asyncValidators:{"default":{fn:function(e){return e.status>=200&&e.status<300},url:!1},reverse:{fn:function(e){return e.status<200||e.status>=300},url:!1}},addAsyncValidator:function(e,t,i,n){return O.asyncValidators[e]={fn:t,url:i||!1,options:n||{}},this}}),O.addValidator("remote",{requirementType:{"":"string",validator:"string",reverse:"boolean",options:"object"},validateString:function(t,i,n,r){var s,a,o={},l=n.validator||(!0===n.reverse?"reverse":"default");if("undefined"==typeof O.asyncValidators[l])throw new Error("Calling an undefined async validator: `"+l+"`");i=O.asyncValidators[l].url||i,i.indexOf("{value}")>-1?i=i.replace("{value}",encodeURIComponent(t)):o[r.$element.attr("name")||r.$element.attr("id")]=t;var u=e.extend(!0,n.options||{},O.asyncValidators[l].options);s=e.extend(!0,{},{url:i,data:o,type:"GET"},u),r.trigger("field:ajaxoptions",r,s),a=e.param(s),"undefined"==typeof O._remoteCache&&(O._remoteCache={});var d=O._remoteCache[a]=O._remoteCache[a]||e.ajax(s),h=function(){var t=O.asyncValidators[l].fn.call(r,d,i,n);return t||(t=e.Deferred().reject()),e.when(t)};return d.then(h,h)},priority:-1}),O.on("form:submit",function(){O._remoteCache={}}),window.ParsleyExtend.addAsyncValidator=function(){return Utils.warnOnce("Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`"),O.addAsyncValidator.apply(O,arguments)},O.addMessages("en",{defaultMessage:"This value seems to be invalid.",type:{email:"This value should be a valid email.",url:"This value should be a valid url.",number:"This value should be a valid number.",integer:"This value should be a valid integer.",digits:"This value should be digits.",alphanum:"This value should be alphanumeric."},notblank:"This value should not be blank.",required:"This value is required.",pattern:"This value seems to be invalid.",min:"This value should be greater than or equal to %s.",max:"This value should be lower than or equal to %s.",range:"This value should be between %s and %s.",minlength:"This value is too short. It should have %s characters or more.",maxlength:"This value is too long. It should have %s characters or fewer.",length:"This value length is invalid. It should be between %s and %s characters long.",mincheck:"You must select at least %s choices.",maxcheck:"You must select %s choices or fewer.",check:"You must select between %s and %s choices.",equalto:"This value should be the same."}),O.setLocale("en");var q=new n;q.install();var k=O;return k});
16
+ function n(){var t=this,i=window||global;_extends(this,{isNativeEvent:function(e){return e.originalEvent&&e.originalEvent.isTrusted!==!1},fakeInputEvent:function(i){t.isNativeEvent(i)&&e(i.target).trigger("input")},misbehaves:function(i){t.isNativeEvent(i)&&(t.behavesOk(i),e(document).on("change.inputevent",i.data.selector,t.fakeInputEvent),t.fakeInputEvent(i))},behavesOk:function(i){t.isNativeEvent(i)&&e(document).off("input.inputevent",i.data.selector,t.behavesOk).off("change.inputevent",i.data.selector,t.misbehaves)},install:function(){if(!i.inputEventPatched){i.inputEventPatched="0.0.3";for(var n=["select",'input[type="checkbox"]','input[type="radio"]','input[type="file"]'],r=0;r<n.length;r++){var s=n[r];e(document).on("input.inputevent",s,{selector:s},t.behavesOk).on("change.inputevent",s,{selector:s},t.misbehaves)}}},uninstall:function(){delete i.inputEventPatched,e(document).off(".inputevent")}})}var r=1,s={},a={attr:function(e,t,i){var n,r,s,a=new RegExp("^"+t,"i");if("undefined"==typeof i)i={};else for(n in i)i.hasOwnProperty(n)&&delete i[n];if(!e)return i;for(s=e.attributes,n=s.length;n--;)r=s[n],r&&r.specified&&a.test(r.name)&&(i[this.camelize(r.name.slice(t.length))]=this.deserializeValue(r.value));return i},checkAttr:function(e,t,i){return e.hasAttribute(t+i)},setAttr:function(e,t,i,n){e.setAttribute(this.dasherize(t+i),String(n))},getType:function(e){return e.getAttribute("type")||"text"},generateID:function(){return""+r++},deserializeValue:function(e){var t;try{return e?"true"==e||"false"!=e&&("null"==e?null:isNaN(t=Number(e))?/^[\[\{]/.test(e)?JSON.parse(e):e:t):e}catch(i){return e}},camelize:function(e){return e.replace(/-+(.)?/g,function(e,t){return t?t.toUpperCase():""})},dasherize:function(e){return e.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()},warn:function(){var e;window.console&&"function"==typeof window.console.warn&&(e=window.console).warn.apply(e,arguments)},warnOnce:function(e){s[e]||(s[e]=!0,this.warn.apply(this,arguments))},_resetWarnings:function(){s={}},trimString:function(e){return e.replace(/^\s+|\s+$/g,"")},parse:{date:function S(e){var t=e.match(/^(\d{4,})-(\d\d)-(\d\d)$/);if(!t)return null;var i=t.map(function(e){return parseInt(e,10)}),n=_slicedToArray(i,4),r=(n[0],n[1]),s=n[2],a=n[3],S=new Date(r,s-1,a);return S.getFullYear()!==r||S.getMonth()+1!==s||S.getDate()!==a?null:S},string:function(e){return e},integer:function(e){return isNaN(e)?null:parseInt(e,10)},number:function(e){if(isNaN(e))throw null;return parseFloat(e)},"boolean":function(e){return!/^\s*false\s*$/i.test(e)},object:function(e){return a.deserializeValue(e)},regexp:function(e){var t="";return/^\/.*\/(?:[gimy]*)$/.test(e)?(t=e.replace(/.*\/([gimy]*)$/,"$1"),e=e.replace(new RegExp("^/(.*?)/"+t+"$"),"$1")):e="^"+e+"$",new RegExp(e,t)}},parseRequirement:function(e,t){var i=this.parse[e||"string"];if(!i)throw'Unknown requirement specification: "'+e+'"';var n=i(t);if(null===n)throw"Requirement is not a "+e+': "'+t+'"';return n},namespaceEvents:function(t,i){return t=this.trimString(t||"").split(/\s+/),t[0]?e.map(t,function(e){return e+"."+i}).join(" "):""},difference:function(t,i){var n=[];return e.each(t,function(e,t){i.indexOf(t)==-1&&n.push(t)}),n},all:function(t){return e.when.apply(e,_toConsumableArray(t).concat([42,42]))},objectCreate:Object.create||function(){var e=function(){};return function(t){if(arguments.length>1)throw Error("Second argument not supported");if("object"!=typeof t)throw TypeError("Argument must be an object");e.prototype=t;var i=new e;return e.prototype=null,i}}(),_SubmitSelector:'input[type="submit"], button:submit'},o={namespace:"data-parsley-",inputs:"input, textarea, select",excluded:"input[type=button], input[type=submit], input[type=reset], input[type=hidden]",priorityEnabled:!0,multiple:null,group:null,uiEnabled:!0,validationThreshold:3,focus:"first",trigger:!1,triggerAfterFailure:"input",errorClass:"parsley-error",successClass:"parsley-success",classHandler:function(e){},errorsContainer:function(e){},errorsWrapper:'<ul class="parsley-errors-list"></ul>',errorTemplate:"<li></li>"},l=function(){this.__id__=a.generateID()};l.prototype={asyncSupport:!0,_pipeAccordingToValidationResult:function(){var t=this,i=function(){var i=e.Deferred();return!0!==t.validationResult&&i.reject(),i.resolve().promise()};return[i,i]},actualizeOptions:function(){return a.attr(this.element,this.options.namespace,this.domOptions),this.parent&&this.parent.actualizeOptions&&this.parent.actualizeOptions(),this},_resetOptions:function(e){this.domOptions=a.objectCreate(this.parent.options),this.options=a.objectCreate(this.domOptions);for(var t in e)e.hasOwnProperty(t)&&(this.options[t]=e[t]);this.actualizeOptions()},_listeners:null,on:function(e,t){this._listeners=this._listeners||{};var i=this._listeners[e]=this._listeners[e]||[];return i.push(t),this},subscribe:function(t,i){e.listenTo(this,t.toLowerCase(),i)},off:function(e,t){var i=this._listeners&&this._listeners[e];if(i)if(t)for(var n=i.length;n--;)i[n]===t&&i.splice(n,1);else delete this._listeners[e];return this},unsubscribe:function(t,i){e.unsubscribeTo(this,t.toLowerCase())},trigger:function(e,t,i){t=t||this;var n,r=this._listeners&&this._listeners[e];if(r)for(var s=r.length;s--;)if(n=r[s].call(t,t,i),n===!1)return n;return!this.parent||this.parent.trigger(e,t,i)},asyncIsValid:function(e,t){return a.warnOnce("asyncIsValid is deprecated; please use whenValid instead"),this.whenValid({group:e,force:t})},_findRelated:function(){return this.options.multiple?e(this.parent.element.querySelectorAll("["+this.options.namespace+'multiple="'+this.options.multiple+'"]')):this.$element}};var u=function(e,t){var i=e.match(/^\s*\[(.*)\]\s*$/);if(!i)throw'Requirement is not an array: "'+e+'"';var n=i[1].split(",").map(a.trimString);if(n.length!==t)throw"Requirement has "+n.length+" values when "+t+" are needed";return n},d=function(e,t,i){var n=null,r={};for(var s in e)if(s){var o=i(s);"string"==typeof o&&(o=a.parseRequirement(e[s],o)),r[s]=o}else n=a.parseRequirement(e[s],t);return[n,r]},h=function(t){e.extend(!0,this,t)};h.prototype={validate:function(e,t){if(this.fn)return arguments.length>3&&(t=[].slice.call(arguments,1,-1)),this.fn(e,t);if(Array.isArray(e)){if(!this.validateMultiple)throw"Validator `"+this.name+"` does not handle multiple values";return this.validateMultiple.apply(this,arguments)}var i=arguments[arguments.length-1];if(this.validateDate&&i._isDateInput())return arguments[0]=a.parse.date(arguments[0]),null!==arguments[0]&&this.validateDate.apply(this,arguments);if(this.validateNumber)return!isNaN(e)&&(arguments[0]=parseFloat(arguments[0]),this.validateNumber.apply(this,arguments));if(this.validateString)return this.validateString.apply(this,arguments);throw"Validator `"+this.name+"` only handles multiple values"},parseRequirements:function(t,i){if("string"!=typeof t)return Array.isArray(t)?t:[t];var n=this.requirementType;if(Array.isArray(n)){for(var r=u(t,n.length),s=0;s<r.length;s++)r[s]=a.parseRequirement(n[s],r[s]);return r}return e.isPlainObject(n)?d(n,t,i):[a.parseRequirement(n,t)]},requirementType:"string",priority:2};var p=function(e,t){this.__class__="ValidatorRegistry",this.locale="en",this.init(e||{},t||{})},c={email:/^((([a-zA-Z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-zA-Z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/,number:/^-?(\d*\.)?\d+(e[-+]?\d+)?$/i,integer:/^-?\d+$/,digits:/^\d+$/,alphanum:/^\w+$/i,date:{test:function(e){return null!==a.parse.date(e)}},url:new RegExp("^(?:(?:https?|ftp)://)?(?:\\S+(?::\\S*)?@)?(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-zA-Z\\u00a1-\\uffff0-9]-*)*[a-zA-Z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-zA-Z\\u00a1-\\uffff0-9]-*)*[a-zA-Z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-zA-Z\\u00a1-\\uffff]{2,})))(?::\\d{2,5})?(?:/\\S*)?$")};c.range=c.number;var f=function(e){var t=(""+e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0},m=function(e,t){return t.map(a.parse[e])},g=function(e,t){return function(i){for(var n=arguments.length,r=Array(n>1?n-1:0),s=1;s<n;s++)r[s-1]=arguments[s];return r.pop(),t.apply(void 0,[i].concat(_toConsumableArray(m(e,r))))}},v=function(e){return{validateDate:g("date",e),validateNumber:g("number",e),requirementType:e.length<=2?"string":["string","string"],priority:30}};p.prototype={init:function(e,t){this.catalog=t,this.validators=_extends({},this.validators);for(var i in e)this.addValidator(i,e[i].fn,e[i].priority);window.Parsley.trigger("parsley:validator:init")},setLocale:function(e){if("undefined"==typeof this.catalog[e])throw new Error(e+" is not available in the catalog");return this.locale=e,this},addCatalog:function(e,t,i){return"object"==typeof t&&(this.catalog[e]=t),!0===i?this.setLocale(e):this},addMessage:function(e,t,i){return"undefined"==typeof this.catalog[e]&&(this.catalog[e]={}),this.catalog[e][t]=i,this},addMessages:function(e,t){for(var i in t)this.addMessage(e,i,t[i]);return this},addValidator:function(e,t,i){if(this.validators[e])a.warn('Validator "'+e+'" is already defined.');else if(o.hasOwnProperty(e))return void a.warn('"'+e+'" is a restricted keyword and is not a valid validator name.');return this._setValidator.apply(this,arguments)},hasValidator:function(e){return!!this.validators[e]},updateValidator:function(e,t,i){return this.validators[e]?this._setValidator.apply(this,arguments):(a.warn('Validator "'+e+'" is not already defined.'),this.addValidator.apply(this,arguments))},removeValidator:function(e){return this.validators[e]||a.warn('Validator "'+e+'" is not defined.'),delete this.validators[e],this},_setValidator:function(e,t,i){"object"!=typeof t&&(t={fn:t,priority:i}),t.validate||(t=new h(t)),this.validators[e]=t;for(var n in t.messages||{})this.addMessage(n,e,t.messages[n]);return this},getErrorMessage:function(e){var t;if("type"===e.name){var i=this.catalog[this.locale][e.name]||{};t=i[e.requirements]}else t=this.formatMessage(this.catalog[this.locale][e.name],e.requirements);return t||this.catalog[this.locale].defaultMessage||this.catalog.en.defaultMessage},formatMessage:function(e,t){if("object"==typeof t){for(var i in t)e=this.formatMessage(e,t[i]);return e}return"string"==typeof e?e.replace(/%s/i,t):""},validators:{notblank:{validateString:function(e){return/\S/.test(e)},priority:2},required:{validateMultiple:function(e){return e.length>0},validateString:function(e){return/\S/.test(e)},priority:512},type:{validateString:function(e,t){var i=arguments.length<=2||void 0===arguments[2]?{}:arguments[2],n=i.step,r=void 0===n?"any":n,s=i.base,a=void 0===s?0:s,o=c[t];if(!o)throw new Error("validator type `"+t+"` is not supported");if(!o.test(e))return!1;if("number"===t&&!/^any$/i.test(r||"")){var l=Number(e),u=Math.max(f(r),f(a));if(f(l)>u)return!1;var d=function(e){return Math.round(e*Math.pow(10,u))};if((d(l)-d(a))%d(r)!=0)return!1}return!0},requirementType:{"":"string",step:"string",base:"number"},priority:256},pattern:{validateString:function(e,t){return t.test(e)},requirementType:"regexp",priority:64},minlength:{validateString:function(e,t){return e.length>=t},requirementType:"integer",priority:30},maxlength:{validateString:function(e,t){return e.length<=t},requirementType:"integer",priority:30},length:{validateString:function(e,t,i){return e.length>=t&&e.length<=i},requirementType:["integer","integer"],priority:30},mincheck:{validateMultiple:function(e,t){return e.length>=t},requirementType:"integer",priority:30},maxcheck:{validateMultiple:function(e,t){return e.length<=t},requirementType:"integer",priority:30},check:{validateMultiple:function(e,t,i){return e.length>=t&&e.length<=i},requirementType:["integer","integer"],priority:30},min:v(function(e,t){return e>=t}),max:v(function(e,t){return e<=t}),range:v(function(e,t,i){return e>=t&&e<=i}),equalto:{validateString:function(t,i){var n=e(i);return n.length?t===n.val():t===i},priority:256}}};var y={},_=function k(e,t,i){for(var n=[],r=[],s=0;s<e.length;s++){for(var a=!1,o=0;o<t.length;o++)if(e[s].assert.name===t[o].assert.name){a=!0;break}a?r.push(e[s]):n.push(e[s])}return{kept:r,added:n,removed:i?[]:k(t,e,!0).added}};y.Form={_actualizeTriggers:function(){var e=this;this.$element.on("submit.Parsley",function(t){e.onSubmitValidate(t)}),this.$element.on("click.Parsley",a._SubmitSelector,function(t){e.onSubmitButton(t)}),!1!==this.options.uiEnabled&&this.element.setAttribute("novalidate","")},focus:function(){if(this._focusedField=null,!0===this.validationResult||"none"===this.options.focus)return null;for(var e=0;e<this.fields.length;e++){var t=this.fields[e];if(!0!==t.validationResult&&t.validationResult.length>0&&"undefined"==typeof t.options.noFocus&&(this._focusedField=t.$element,"first"===this.options.focus))break}return null===this._focusedField?null:this._focusedField.focus()},_destroyUI:function(){this.$element.off(".Parsley")}},y.Field={_reflowUI:function(){if(this._buildUI(),this._ui){var e=_(this.validationResult,this._ui.lastValidationResult);this._ui.lastValidationResult=this.validationResult,this._manageStatusClass(),this._manageErrorsMessages(e),this._actualizeTriggers(),!e.kept.length&&!e.added.length||this._failedOnce||(this._failedOnce=!0,this._actualizeTriggers())}},getErrorsMessages:function(){if(!0===this.validationResult)return[];for(var e=[],t=0;t<this.validationResult.length;t++)e.push(this.validationResult[t].errorMessage||this._getErrorMessage(this.validationResult[t].assert));return e},addError:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],i=t.message,n=t.assert,r=t.updateClass,s=void 0===r||r;this._buildUI(),this._addError(e,{message:i,assert:n}),s&&this._errorClass()},updateError:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],i=t.message,n=t.assert,r=t.updateClass,s=void 0===r||r;this._buildUI(),this._updateError(e,{message:i,assert:n}),s&&this._errorClass()},removeError:function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],i=t.updateClass,n=void 0===i||i;this._buildUI(),this._removeError(e),n&&this._manageStatusClass()},_manageStatusClass:function(){this.hasConstraints()&&this.needsValidation()&&!0===this.validationResult?this._successClass():this.validationResult.length>0?this._errorClass():this._resetClass()},_manageErrorsMessages:function(t){if("undefined"==typeof this.options.errorsMessagesDisabled){if("undefined"!=typeof this.options.errorMessage)return t.added.length||t.kept.length?(this._insertErrorWrapper(),0===this._ui.$errorsWrapper.find(".parsley-custom-error-message").length&&this._ui.$errorsWrapper.append(e(this.options.errorTemplate).addClass("parsley-custom-error-message")),this._ui.$errorsWrapper.addClass("filled").find(".parsley-custom-error-message").html(this.options.errorMessage)):this._ui.$errorsWrapper.removeClass("filled").find(".parsley-custom-error-message").remove();for(var i=0;i<t.removed.length;i++)this._removeError(t.removed[i].assert.name);for(i=0;i<t.added.length;i++)this._addError(t.added[i].assert.name,{message:t.added[i].errorMessage,assert:t.added[i].assert});for(i=0;i<t.kept.length;i++)this._updateError(t.kept[i].assert.name,{message:t.kept[i].errorMessage,assert:t.kept[i].assert})}},_addError:function(t,i){var n=i.message,r=i.assert;this._insertErrorWrapper(),this._ui.$errorClassHandler.attr("aria-describedby",this._ui.errorsWrapperId),this._ui.$errorsWrapper.addClass("filled").append(e(this.options.errorTemplate).addClass("parsley-"+t).html(n||this._getErrorMessage(r)))},_updateError:function(e,t){var i=t.message,n=t.assert;this._ui.$errorsWrapper.addClass("filled").find(".parsley-"+e).html(i||this._getErrorMessage(n))},_removeError:function(e){this._ui.$errorClassHandler.removeAttr("aria-describedby"),this._ui.$errorsWrapper.removeClass("filled").find(".parsley-"+e).remove()},_getErrorMessage:function(e){var t=e.name+"Message";return"undefined"!=typeof this.options[t]?window.Parsley.formatMessage(this.options[t],e.requirements):window.Parsley.getErrorMessage(e)},_buildUI:function(){if(!this._ui&&!1!==this.options.uiEnabled){var t={};this.element.setAttribute(this.options.namespace+"id",this.__id__),t.$errorClassHandler=this._manageClassHandler(),t.errorsWrapperId="parsley-id-"+(this.options.multiple?"multiple-"+this.options.multiple:this.__id__),t.$errorsWrapper=e(this.options.errorsWrapper).attr("id",t.errorsWrapperId),t.lastValidationResult=[],t.validationInformationVisible=!1,this._ui=t}},_manageClassHandler:function(){if("string"==typeof this.options.classHandler&&e(this.options.classHandler).length)return e(this.options.classHandler);var t=this.options.classHandler;if("string"==typeof this.options.classHandler&&"function"==typeof window[this.options.classHandler]&&(t=window[this.options.classHandler]),"function"==typeof t){var i=t.call(this,this);if("undefined"!=typeof i&&i.length)return i}else{if("object"==typeof t&&t instanceof jQuery&&t.length)return t;t&&a.warn("The class handler `"+t+"` does not exist in DOM nor as a global JS function")}return this._inputHolder()},_inputHolder:function(){return this.options.multiple&&"SELECT"!==this.element.nodeName?this.$element.parent():this.$element},_insertErrorWrapper:function(){var t=this.options.errorsContainer;if(0!==this._ui.$errorsWrapper.parent().length)return this._ui.$errorsWrapper.parent();if("string"==typeof t){if(e(t).length)return e(t).append(this._ui.$errorsWrapper);"function"==typeof window[t]?t=window[t]:a.warn("The errors container `"+t+"` does not exist in DOM nor as a global JS function")}return"function"==typeof t&&(t=t.call(this,this)),"object"==typeof t&&t.length?t.append(this._ui.$errorsWrapper):this._inputHolder().after(this._ui.$errorsWrapper)},_actualizeTriggers:function(){var e,t=this,i=this._findRelated();i.off(".Parsley"),this._failedOnce?i.on(a.namespaceEvents(this.options.triggerAfterFailure,"Parsley"),function(){t._validateIfNeeded()}):(e=a.namespaceEvents(this.options.trigger,"Parsley"))&&i.on(e,function(e){t._validateIfNeeded(e)})},_validateIfNeeded:function(e){var t=this;e&&/key|input/.test(e.type)&&(!this._ui||!this._ui.validationInformationVisible)&&this.getValue().length<=this.options.validationThreshold||(this.options.debounce?(window.clearTimeout(this._debounced),this._debounced=window.setTimeout(function(){return t.validate()},this.options.debounce)):this.validate())},_resetUI:function(){this._failedOnce=!1,this._actualizeTriggers(),"undefined"!=typeof this._ui&&(this._ui.$errorsWrapper.removeClass("filled").children().remove(),this._resetClass(),this._ui.lastValidationResult=[],this._ui.validationInformationVisible=!1)},_destroyUI:function(){this._resetUI(),"undefined"!=typeof this._ui&&this._ui.$errorsWrapper.remove(),delete this._ui},_successClass:function(){this._ui.validationInformationVisible=!0,this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass)},_errorClass:function(){this._ui.validationInformationVisible=!0,this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass)},_resetClass:function(){this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass)}};var w=function(t,i,n){this.__class__="Form",this.element=t,this.$element=e(t),this.domOptions=i,this.options=n,this.parent=window.Parsley,this.fields=[],this.validationResult=null},b={pending:null,resolved:!0,rejected:!1};w.prototype={onSubmitValidate:function(e){var t=this;if(!0!==e.parsley){var i=this._submitSource||this.$element.find(a._SubmitSelector)[0];if(this._submitSource=null,this.$element.find(".parsley-synthetic-submit-button").prop("disabled",!0),!i||null===i.getAttribute("formnovalidate")){window.Parsley._remoteCache={};var n=this.whenValidate({event:e});"resolved"===n.state()&&!1!==this._trigger("submit")||(e.stopImmediatePropagation(),e.preventDefault(),"pending"===n.state()&&n.done(function(){t._submit(i)}))}}},onSubmitButton:function(e){this._submitSource=e.currentTarget},_submit:function(t){if(!1!==this._trigger("submit")){if(t){var i=this.$element.find(".parsley-synthetic-submit-button").prop("disabled",!1);0===i.length&&(i=e('<input class="parsley-synthetic-submit-button" type="hidden">').appendTo(this.$element)),i.attr({name:t.getAttribute("name"),value:t.getAttribute("value")})}this.$element.trigger(_extends(e.Event("submit"),{parsley:!0}))}},validate:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){a.warnOnce("Calling validate on a parsley form without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1],s=i[2];t={group:n,force:r,event:s}}return b[this.whenValidate(t).state()]},whenValidate:function(){var t,i=this,n=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],r=n.group,s=n.force,o=n.event;this.submitEvent=o,o&&(this.submitEvent=_extends({},o,{preventDefault:function(){a.warnOnce("Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`"),i.validationResult=!1}})),this.validationResult=!0,this._trigger("validate"),this._refreshFields();var l=this._withoutReactualizingFormOptions(function(){return e.map(i.fields,function(e){return e.whenValidate({force:s,group:r})})});return(t=a.all(l).done(function(){i._trigger("success")}).fail(function(){i.validationResult=!1,i.focus(),i._trigger("error")}).always(function(){i._trigger("validated")})).pipe.apply(t,_toConsumableArray(this._pipeAccordingToValidationResult()))},isValid:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){a.warnOnce("Calling isValid on a parsley form without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1];t={group:n,force:r}}return b[this.whenValid(t).state()]},whenValid:function(){var t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.group,r=i.force;this._refreshFields();var s=this._withoutReactualizingFormOptions(function(){return e.map(t.fields,function(e){return e.whenValid({group:n,force:r})})});return a.all(s)},refresh:function(){return this._refreshFields(),this},reset:function(){for(var e=0;e<this.fields.length;e++)this.fields[e].reset();this._trigger("reset")},destroy:function(){this._destroyUI();for(var e=0;e<this.fields.length;e++)this.fields[e].destroy();this.$element.removeData("Parsley"),this._trigger("destroy")},_refreshFields:function(){return this.actualizeOptions()._bindFields()},_bindFields:function(){var t=this,i=this.fields;return this.fields=[],this.fieldsMappedById={},this._withoutReactualizingFormOptions(function(){t.$element.find(t.options.inputs).not(t.options.excluded).each(function(e,i){var n=new window.Parsley.Factory(i,{},t);if(("Field"===n.__class__||"FieldMultiple"===n.__class__)&&!0!==n.options.excluded){var r=n.__class__+"-"+n.__id__;"undefined"==typeof t.fieldsMappedById[r]&&(t.fieldsMappedById[r]=n,t.fields.push(n))}}),e.each(a.difference(i,t.fields),function(e,t){t.reset()})}),this},_withoutReactualizingFormOptions:function(e){var t=this.actualizeOptions;this.actualizeOptions=function(){return this};var i=e();return this.actualizeOptions=t,i},_trigger:function(e){return this.trigger("form:"+e)}};var F=function(e,t,i,n,r){var s=window.Parsley._validatorRegistry.validators[t],a=new h(s);n=n||e.options[t+"Priority"]||a.priority,r=!0===r,_extends(this,{validator:a,name:t,requirements:i,priority:n,isDomConstraint:r}),this._parseRequirements(e.options)},C=function(e){var t=e[0].toUpperCase();return t+e.slice(1)};F.prototype={validate:function(e,t){var i;return(i=this.validator).validate.apply(i,[e].concat(_toConsumableArray(this.requirementList),[t]))},_parseRequirements:function(e){var t=this;this.requirementList=this.validator.parseRequirements(this.requirements,function(i){return e[t.name+C(i)]})}};var A=function(t,i,n,r){this.__class__="Field",this.element=t,this.$element=e(t),"undefined"!=typeof r&&(this.parent=r),this.options=n,this.domOptions=i,this.constraints=[],this.constraintsByName={},this.validationResult=!0,this._bindConstraints()},E={pending:null,resolved:!0,rejected:!1};A.prototype={validate:function(t){arguments.length>=1&&!e.isPlainObject(t)&&(a.warnOnce("Calling validate on a parsley field without passing arguments as an object is deprecated."),t={options:t});var i=this.whenValidate(t);if(!i)return!0;switch(i.state()){case"pending":return null;case"resolved":return!0;case"rejected":return this.validationResult}},whenValidate:function(){var e,t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.force,r=i.group;if(this.refresh(),!r||this._isInGroup(r))return this.value=this.getValue(),this._trigger("validate"),(e=this.whenValid({force:n,value:this.value,_refreshed:!0}).always(function(){t._reflowUI()}).done(function(){t._trigger("success")}).fail(function(){t._trigger("error")}).always(function(){t._trigger("validated")})).pipe.apply(e,_toConsumableArray(this._pipeAccordingToValidationResult()))},hasConstraints:function(){return 0!==this.constraints.length},needsValidation:function(e){return"undefined"==typeof e&&(e=this.getValue()),!(!e.length&&!this._isRequired()&&"undefined"==typeof this.options.validateIfEmpty)},_isInGroup:function(t){return Array.isArray(this.options.group)?-1!==e.inArray(t,this.options.group):this.options.group===t},isValid:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){a.warnOnce("Calling isValid on a parsley field without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1];t={force:n,value:r}}var s=this.whenValid(t);return!s||E[s.state()]},whenValid:function(){var t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.force,r=void 0!==n&&n,s=i.value,o=i.group,l=i._refreshed;if(l||this.refresh(),!o||this._isInGroup(o)){if(this.validationResult=!0,!this.hasConstraints())return e.when();if("undefined"!=typeof s&&null!==s||(s=this.getValue()),!this.needsValidation(s)&&!0!==r)return e.when();var u=this._getGroupedConstraints(),d=[];return e.each(u,function(i,n){var r=a.all(e.map(n,function(e){return t._validateConstraint(s,e)}));if(d.push(r),"rejected"===r.state())return!1}),a.all(d)}},_validateConstraint:function(t,i){var n=this,r=i.validate(t,this);return!1===r&&(r=e.Deferred().reject()),a.all([r]).fail(function(e){n.validationResult instanceof Array||(n.validationResult=[]),n.validationResult.push({assert:i,errorMessage:"string"==typeof e&&e})})},getValue:function(){var e;return e="function"==typeof this.options.value?this.options.value(this):"undefined"!=typeof this.options.value?this.options.value:this.$element.val(),"undefined"==typeof e||null===e?"":this._handleWhitespace(e)},reset:function(){return this._resetUI(),this._trigger("reset")},destroy:function(){this._destroyUI(),this.$element.removeData("Parsley"),this.$element.removeData("FieldMultiple"),this._trigger("destroy")},refresh:function(){return this._refreshConstraints(),this},_refreshConstraints:function(){return this.actualizeOptions()._bindConstraints()},refreshConstraints:function(){return a.warnOnce("Parsley's refreshConstraints is deprecated. Please use refresh"),this.refresh()},addConstraint:function(e,t,i,n){if(window.Parsley._validatorRegistry.validators[e]){var r=new F(this,e,t,i,n);"undefined"!==this.constraintsByName[r.name]&&this.removeConstraint(r.name),this.constraints.push(r),this.constraintsByName[r.name]=r}return this},removeConstraint:function(e){for(var t=0;t<this.constraints.length;t++)if(e===this.constraints[t].name){this.constraints.splice(t,1);break}return delete this.constraintsByName[e],this},updateConstraint:function(e,t,i){return this.removeConstraint(e).addConstraint(e,t,i)},_bindConstraints:function(){for(var e=[],t={},i=0;i<this.constraints.length;i++)!1===this.constraints[i].isDomConstraint&&(e.push(this.constraints[i]),t[this.constraints[i].name]=this.constraints[i]);this.constraints=e,this.constraintsByName=t;for(var n in this.options)this.addConstraint(n,this.options[n],void 0,!0);return this._bindHtml5Constraints()},_bindHtml5Constraints:function(){null!==this.element.getAttribute("required")&&this.addConstraint("required",!0,void 0,!0),null!==this.element.getAttribute("pattern")&&this.addConstraint("pattern",this.element.getAttribute("pattern"),void 0,!0);var e=this.element.getAttribute("min"),t=this.element.getAttribute("max");null!==e&&null!==t?this.addConstraint("range",[e,t],void 0,!0):null!==e?this.addConstraint("min",e,void 0,!0):null!==t&&this.addConstraint("max",t,void 0,!0),null!==this.element.getAttribute("minlength")&&null!==this.element.getAttribute("maxlength")?this.addConstraint("length",[this.element.getAttribute("minlength"),this.element.getAttribute("maxlength")],void 0,!0):null!==this.element.getAttribute("minlength")?this.addConstraint("minlength",this.element.getAttribute("minlength"),void 0,!0):null!==this.element.getAttribute("maxlength")&&this.addConstraint("maxlength",this.element.getAttribute("maxlength"),void 0,!0);var i=a.getType(this.element);return"number"===i?this.addConstraint("type",["number",{step:this.element.getAttribute("step")||"1",base:e||this.element.getAttribute("value")}],void 0,!0):/^(email|url|range|date)$/i.test(i)?this.addConstraint("type",i,void 0,!0):this},_isRequired:function(){return"undefined"!=typeof this.constraintsByName.required&&!1!==this.constraintsByName.required.requirements},_trigger:function(e){return this.trigger("field:"+e)},_handleWhitespace:function(e){return!0===this.options.trimValue&&a.warnOnce('data-parsley-trim-value="true" is deprecated, please use data-parsley-whitespace="trim"'),"squish"===this.options.whitespace&&(e=e.replace(/\s{2,}/g," ")),"trim"!==this.options.whitespace&&"squish"!==this.options.whitespace&&!0!==this.options.trimValue||(e=a.trimString(e)),e},_isDateInput:function(){var e=this.constraintsByName.type;return e&&"date"===e.requirements},_getGroupedConstraints:function(){if(!1===this.options.priorityEnabled)return[this.constraints];for(var e=[],t={},i=0;i<this.constraints.length;i++){var n=this.constraints[i].priority;t[n]||e.push(t[n]=[]),t[n].push(this.constraints[i])}return e.sort(function(e,t){return t[0].priority-e[0].priority}),e}};var x=A,$=function(){this.__class__="FieldMultiple"};$.prototype={addElement:function(e){return this.$elements.push(e),this},_refreshConstraints:function(){var t;if(this.constraints=[],"SELECT"===this.element.nodeName)return this.actualizeOptions()._bindConstraints(),this;for(var i=0;i<this.$elements.length;i++)if(e("html").has(this.$elements[i]).length){t=this.$elements[i].data("FieldMultiple")._refreshConstraints().constraints;for(var n=0;n<t.length;n++)this.addConstraint(t[n].name,t[n].requirements,t[n].priority,t[n].isDomConstraint)}else this.$elements.splice(i,1);return this},getValue:function(){if("function"==typeof this.options.value)return this.options.value(this);if("undefined"!=typeof this.options.value)return this.options.value;if("INPUT"===this.element.nodeName){var t=a.getType(this.element);if("radio"===t)return this._findRelated().filter(":checked").val()||"";if("checkbox"===t){
17
+ var i=[];return this._findRelated().filter(":checked").each(function(){i.push(e(this).val())}),i}}return"SELECT"===this.element.nodeName&&null===this.$element.val()?[]:this.$element.val()},_init:function(){return this.$elements=[this.$element],this}};var P=function(t,i,n){this.element=t,this.$element=e(t);var r=this.$element.data("Parsley");if(r)return"undefined"!=typeof n&&r.parent===window.Parsley&&(r.parent=n,r._resetOptions(r.options)),"object"==typeof i&&_extends(r.options,i),r;if(!this.$element.length)throw new Error("You must bind Parsley on an existing element.");if("undefined"!=typeof n&&"Form"!==n.__class__)throw new Error("Parent instance must be a Form instance");return this.parent=n||window.Parsley,this.init(i)};P.prototype={init:function(e){return this.__class__="Parsley",this.__version__="2.8.1",this.__id__=a.generateID(),this._resetOptions(e),"FORM"===this.element.nodeName||a.checkAttr(this.element,this.options.namespace,"validate")&&!this.$element.is(this.options.inputs)?this.bind("parsleyForm"):this.isMultiple()?this.handleMultiple():this.bind("parsleyField")},isMultiple:function(){var e=a.getType(this.element);return"radio"===e||"checkbox"===e||"SELECT"===this.element.nodeName&&null!==this.element.getAttribute("multiple")},handleMultiple:function(){var t,i,n=this;if(this.options.multiple=this.options.multiple||(t=this.element.getAttribute("name"))||this.element.getAttribute("id"),"SELECT"===this.element.nodeName&&null!==this.element.getAttribute("multiple"))return this.options.multiple=this.options.multiple||this.__id__,this.bind("parsleyFieldMultiple");if(!this.options.multiple)return a.warn("To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.",this.$element),this;this.options.multiple=this.options.multiple.replace(/(:|\.|\[|\]|\{|\}|\$)/g,""),t&&e('input[name="'+t+'"]').each(function(e,t){var i=a.getType(t);"radio"!==i&&"checkbox"!==i||t.setAttribute(n.options.namespace+"multiple",n.options.multiple)});for(var r=this._findRelated(),s=0;s<r.length;s++)if(i=e(r.get(s)).data("Parsley"),"undefined"!=typeof i){this.$element.data("FieldMultiple")||i.addElement(this.$element);break}return this.bind("parsleyField",!0),i||this.bind("parsleyFieldMultiple")},bind:function(t,i){var n;switch(t){case"parsleyForm":n=e.extend(new w(this.element,this.domOptions,this.options),new l,window.ParsleyExtend)._bindFields();break;case"parsleyField":n=e.extend(new x(this.element,this.domOptions,this.options,this.parent),new l,window.ParsleyExtend);break;case"parsleyFieldMultiple":n=e.extend(new x(this.element,this.domOptions,this.options,this.parent),new $,new l,window.ParsleyExtend)._init();break;default:throw new Error(t+"is not a supported Parsley type")}return this.options.multiple&&a.setAttr(this.element,this.options.namespace,"multiple",this.options.multiple),"undefined"!=typeof i?(this.$element.data("FieldMultiple",n),n):(this.$element.data("Parsley",n),n._actualizeTriggers(),n._trigger("init"),n)}};var V=e.fn.jquery.split(".");if(parseInt(V[0])<=1&&parseInt(V[1])<8)throw"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.";V.forEach||a.warn("Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim");var T=_extends(new l,{element:document,$element:e(document),actualizeOptions:null,_resetOptions:null,Factory:P,version:"2.8.1"});_extends(x.prototype,y.Field,l.prototype),_extends(w.prototype,y.Form,l.prototype),_extends(P.prototype,l.prototype),e.fn.parsley=e.fn.psly=function(t){if(this.length>1){var i=[];return this.each(function(){i.push(e(this).parsley(t))}),i}if(0!=this.length)return new P(this[0],t)},"undefined"==typeof window.ParsleyExtend&&(window.ParsleyExtend={}),T.options=_extends(a.objectCreate(o),window.ParsleyConfig),window.ParsleyConfig=T.options,window.Parsley=window.psly=T,T.Utils=a,window.ParsleyUtils={},e.each(a,function(e,t){"function"==typeof t&&(window.ParsleyUtils[e]=function(){return a.warnOnce("Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead."),a[e].apply(a,arguments)})});var O=window.Parsley._validatorRegistry=new p(window.ParsleyConfig.validators,window.ParsleyConfig.i18n);window.ParsleyValidator={},e.each("setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator hasValidator".split(" "),function(e,t){window.Parsley[t]=function(){return O[t].apply(O,arguments)},window.ParsleyValidator[t]=function(){var e;return a.warnOnce("Accessing the method '"+t+"' through Validator is deprecated. Simply call 'window.Parsley."+t+"(...)'"),(e=window.Parsley)[t].apply(e,arguments)}}),window.Parsley.UI=y,window.ParsleyUI={removeError:function(e,t,i){var n=!0!==i;return a.warnOnce("Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method."),e.removeError(t,{updateClass:n})},getErrorsMessages:function(e){return a.warnOnce("Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly."),e.getErrorsMessages()}},e.each("addError updateError".split(" "),function(e,t){window.ParsleyUI[t]=function(e,i,n,r,s){var o=!0!==s;return a.warnOnce("Accessing UI is deprecated. Call '"+t+"' on the instance directly. Please comment in issue 1073 as to your need to call this method."),e[t](i,{message:n,assert:r,updateClass:o})}}),!1!==window.ParsleyConfig.autoBind&&e(function(){e("[data-parsley-validate]").length&&e("[data-parsley-validate]").parsley()});var M=e({}),R=function(){a.warnOnce("Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley")},D="parsley:";e.listen=function(e,n){var r;if(R(),"object"==typeof arguments[1]&&"function"==typeof arguments[2]&&(r=arguments[1],n=arguments[2]),"function"!=typeof n)throw new Error("Wrong parameters");window.Parsley.on(i(e),t(n,r))},e.listenTo=function(e,n,r){if(R(),!(e instanceof x||e instanceof w))throw new Error("Must give Parsley instance");if("string"!=typeof n||"function"!=typeof r)throw new Error("Wrong parameters");e.on(i(n),t(r))},e.unsubscribe=function(e,t){if(R(),"string"!=typeof e||"function"!=typeof t)throw new Error("Wrong arguments");window.Parsley.off(i(e),t.parsleyAdaptedCallback)},e.unsubscribeTo=function(e,t){if(R(),!(e instanceof x||e instanceof w))throw new Error("Must give Parsley instance");e.off(i(t))},e.unsubscribeAll=function(t){R(),window.Parsley.off(i(t)),e("form,input,textarea,select").each(function(){var n=e(this).data("Parsley");n&&n.off(i(t))})},e.emit=function(e,t){var n;R();var r=t instanceof x||t instanceof w,s=Array.prototype.slice.call(arguments,r?2:1);s.unshift(i(e)),r||(t=window.Parsley),(n=t).trigger.apply(n,_toConsumableArray(s))};e.extend(!0,T,{asyncValidators:{"default":{fn:function(e){return e.status>=200&&e.status<300},url:!1},reverse:{fn:function(e){return e.status<200||e.status>=300},url:!1}},addAsyncValidator:function(e,t,i,n){return T.asyncValidators[e]={fn:t,url:i||!1,options:n||{}},this}}),T.addValidator("remote",{requirementType:{"":"string",validator:"string",reverse:"boolean",options:"object"},validateString:function(t,i,n,r){var s,a,o={},l=n.validator||(!0===n.reverse?"reverse":"default");if("undefined"==typeof T.asyncValidators[l])throw new Error("Calling an undefined async validator: `"+l+"`");i=T.asyncValidators[l].url||i,i.indexOf("{value}")>-1?i=i.replace("{value}",encodeURIComponent(t)):o[r.element.getAttribute("name")||r.element.getAttribute("id")]=t;var u=e.extend(!0,n.options||{},T.asyncValidators[l].options);s=e.extend(!0,{},{url:i,data:o,type:"GET"},u),r.trigger("field:ajaxoptions",r,s),a=e.param(s),"undefined"==typeof T._remoteCache&&(T._remoteCache={});var d=T._remoteCache[a]=T._remoteCache[a]||e.ajax(s),h=function(){var t=T.asyncValidators[l].fn.call(r,d,i,n);return t||(t=e.Deferred().reject()),e.when(t)};return d.then(h,h)},priority:-1}),T.on("form:submit",function(){T._remoteCache={}}),l.prototype.addAsyncValidator=function(){return a.warnOnce("Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`"),T.addAsyncValidator.apply(T,arguments)},T.addMessages("en",{defaultMessage:"This value seems to be invalid.",type:{email:"This value should be a valid email.",url:"This value should be a valid url.",number:"This value should be a valid number.",integer:"This value should be a valid integer.",digits:"This value should be digits.",alphanum:"This value should be alphanumeric."},notblank:"This value should not be blank.",required:"This value is required.",pattern:"This value seems to be invalid.",min:"This value should be greater than or equal to %s.",max:"This value should be lower than or equal to %s.",range:"This value should be between %s and %s.",minlength:"This value is too short. It should have %s characters or more.",maxlength:"This value is too long. It should have %s characters or fewer.",length:"This value length is invalid. It should be between %s and %s characters long.",mincheck:"You must select at least %s choices.",maxcheck:"You must select %s choices or fewer.",check:"You must select between %s and %s choices.",equalto:"This value should be the same."}),T.setLocale("en");var I=new n;I.install();var q=T;return q});
18
18
  //# sourceMappingURL=parsley.min.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["parsley.min.js","parsley.js","src/parsley/pubsub.js","src/vendor/inputevent.js","src/parsley/utils.js","src/parsley/defaults.js","src/parsley/base.js","src/parsley/validator.js","src/parsley/validator_registry.js","src/parsley/ui.js","src/parsley/form.js","src/parsley/constraint.js","src/parsley/field.js","src/parsley/multiple.js","src/parsley/factory.js","src/parsley/main.js","src/parsley/remote.js","src/i18n/en.js","src/parsley.js"],"names":["_toConsumableArray","arr","Array","isArray","i","arr2","length","from","_slice","prototype","slice","_slicedToArray","sliceIterator","_arr","_n","_d","_e","undefined","_s","_i","Symbol","iterator","next","done","push","value","err","Object","TypeError","global","factory","exports","module","require","define","amd","parsley","jQuery","this","$","adapt","fn","context","parsleyAdaptedCallback","args","call","arguments","unshift","apply","o","eventName","name","lastIndexOf","eventPrefix","substr","InputEvent","_this14","globals","window","extend","isNativeEvent","evt","originalEvent","isTrusted","fakeInputEvent","target","trigger","misbehaves","behavesOk","document","on","data","selector","off","install","inputEventPatched","uninstall","globalID","pastWarnings","Utils__Utils","attr","$element","namespace","obj","attribute","attributes","regex","RegExp","hasOwnProperty","specified","test","camelize","deserializeValue","checkAttr","_checkAttr","is","setAttr","setAttribute","dasherize","String","generateID","num","isNaN","Number","parseJSON","e","str","replace","match","chr","toUpperCase","toLowerCase","warn","_window$console","console","warnOnce","msg","_resetWarnings","trimString","string","parse","date","parsed","_parsed$map","map","x","parseInt","_parsed$map2","year","month","day","Date","getFullYear","getMonth","getDate","_string","integer","number","parseFloat","boolean","object","regexp","_regexp","flags","parseRequirement","requirementType","converter","converted","namespaceEvents","events","split","join","difference","array","remove","result","each","_","elem","indexOf","all","promises","when","concat","objectCreate","create","Error","_SubmitSelector","Utils__default","Defaults","inputs","excluded","priorityEnabled","multiple","group","uiEnabled","validationThreshold","focus","triggerAfterFailure","errorClass","successClass","classHandler","Field","errorsContainer","errorsWrapper","errorTemplate","Base","__id__","asyncSupport","_pipeAccordingToValidationResult","_this","pipe","r","Deferred","validationResult","reject","resolve","promise","actualizeOptions","options","domOptions","parent","_resetOptions","initOptions","_listeners","queue","subscribe","listenTo","splice","unsubscribe","unsubscribeTo","extraArg","asyncIsValid","force","whenValid","_findRelated","find","convertArrayRequirement","m","values","convertExtraOptionRequirement","requirementSpec","extraOptionReader","main","extra","key","Validator","spec","validate","requirementFirstArg","validateMultiple","instance","validateDate","_isDateInput","validateNumber","validateString","parseRequirements","requirements","type","isPlainObject","priority","ValidatorRegistry","validators","catalog","__class__","locale","init","typeTesters","email","digits","alphanum","url","range","decimalPlaces","Math","max","ValidatorRegistry__parseArguments","ValidatorRegistry__operatorToValidator","operator","_len","requirementsAndInput","_key","pop","ValidatorRegistry__comparisonOperator","addValidator","Parsley","setLocale","addCatalog","messages","set","addMessage","message","addMessages","nameMessageObject","arg1","arg2","_setValidator","updateValidator","removeValidator","validator","getErrorMessage","constraint","typeMessages","formatMessage","defaultMessage","en","parameters","notblank","required","_ref","_ref$step","step","_ref$base","base","tester","nb","decimals","toInt","f","round","pow","","pattern","minlength","requirement","maxlength","min","mincheck","maxcheck","check","equalto","refOrValue","$reference","val","UI","diffResults","newResult","oldResult","deep","added","kept","found","j","assert","removed","Form","_actualizeTriggers","_this2","onSubmitValidate","onSubmitButton","_focusedField","fields","field","noFocus","_destroyUI","_reflowUI","_buildUI","_ui","diff","lastValidationResult","_manageStatusClass","_manageErrorsMessages","_failedOnce","getErrorsMessages","errorMessage","_getErrorMessage","addError","_ref2","_ref2$updateClass","updateClass","_addError","_errorClass","updateError","_ref3","_ref3$updateClass","_updateError","removeError","_ref4","_ref4$updateClass","_removeError","hasConstraints","needsValidation","_successClass","_resetClass","errorsMessagesDisabled","_insertErrorWrapper","$errorsWrapper","append","addClass","html","removeClass","_ref5","_ref6","customConstraintErrorMessage","$errorClassHandler","_manageClassHandler","errorsWrapperId","validationInformationVisible","$handler","_inputHolder","$errorsContainer","after","_this3","$toBind","_validateIfNeeded","event","_this4","getValue","debounce","clearTimeout","_debounced","setTimeout","_resetUI","children","element","Form__statusMapping","pending","resolved","rejected","_this5","$submitSource","_$submitSource","first","prop","whenValidate","state","_trigger","stopImmediatePropagation","preventDefault","_submit","currentTarget","$synthetic","appendTo","Event","_arguments","_Utils__default$all$done$fail$always","_this6","_ref7","submitEvent","_refreshFields","_withoutReactualizingFormOptions","fail","always","isValid","_arguments2","_this7","_ref8","reset","destroy","removeData","_bindFields","_this8","oldFields","fieldsMappedById","not","fieldInstance","Factory","uniqueId","oldActualizeOptions","Constraint","parsleyField","isDomConstraint","validatorSpec","_validatorRegistry","_parseRequirements","capitalize","cap","_validator","requirementList","_this9","parsleyFormInstance","constraints","constraintsByName","_bindConstraints","parsley_field__statusMapping","_whenValid$always$done$fail$always","_this10","_ref9","refreshConstraints","_isInGroup","_refreshed","_isRequired","validateIfEmpty","inArray","_arguments3","_this11","_ref10","_ref10$force","groupedConstraints","_getGroupedConstraints","_validateConstraint","_this12","_handleWhitespace","addConstraint","removeConstraint","updateConstraint","_bindHtml5Constraints","trimValue","whitespace","c","index","p","sort","a","b","parsley_field","Multiple","addElement","$elements","fieldConstraints","has","filter","_init","savedparsleyFormInstance","__version__","bind","isMultiple","handleMultiple","parsleyMultipleInstance","_this13","input","$previouslyRelated","get","doNotStore","parsleyInstance","ParsleyExtend","vernums","jquery","forEach","version","psly","instances","ParsleyConfig","Utils","ParsleyUtils","registry","i18n","ParsleyValidator","method","proxy","_window$Parsley","ParsleyUI","doNotUpdateClass","autoBind","deprecated","listen","callback","unsubscribeAll","emit","_instance","instanceGiven","asyncValidators","default","xhr","status","reverse","addAsyncValidator","ajaxOptions","csr","encodeURIComponent","remoteOptions","param","_remoteCache","ajax","handleXhr","then","inputevent"],"mappings":"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","file":"parsley.min.js","sourcesContent":["/*!\n* Parsley.js\n* Version 2.7.0 - built Wed, Mar 1st 2017, 3:53 pm\n* http://parsleyjs.org\n* Guillaume Potier - <guillaume@wisembly.com>\n* Marc-Andre Lafortune - <petroselinum@marc-andre.ca>\n* MIT Licensed\n*/\n\n// The source code below is generated by babel as\n// Parsley is written in ECMAScript 6\n//\nvar _slice = Array.prototype.slice;\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) : typeof define === 'function' && define.amd ? define(['jquery'], factory) : global.parsley = factory(global.jQuery);\n})(this, function ($) {\n 'use strict';\n\n var globalID = 1;\n var pastWarnings = {};\n\n var Utils__Utils = {\n // Parsley DOM-API\n // returns object from dom attributes and values\n attr: function attr($element, namespace, obj) {\n var i;\n var attribute;\n var attributes;\n var regex = new RegExp('^' + namespace, 'i');\n\n if ('undefined' === typeof obj) obj = {};else {\n // Clear all own properties. This won't affect prototype's values\n for (i in obj) {\n if (obj.hasOwnProperty(i)) delete obj[i];\n }\n }\n\n if ('undefined' === typeof $element || 'undefined' === typeof $element[0]) return obj;\n\n attributes = $element[0].attributes;\n for (i = attributes.length; i--;) {\n attribute = attributes[i];\n\n if (attribute && attribute.specified && regex.test(attribute.name)) {\n obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n }\n }\n\n return obj;\n },\n\n checkAttr: function checkAttr($element, namespace, _checkAttr) {\n return $element.is('[' + namespace + _checkAttr + ']');\n },\n\n setAttr: function setAttr($element, namespace, attr, value) {\n $element[0].setAttribute(this.dasherize(namespace + attr), String(value));\n },\n\n generateID: function generateID() {\n return '' + globalID++;\n },\n\n /** Third party functions **/\n // Zepto deserialize function\n deserializeValue: function deserializeValue(value) {\n var num;\n\n try {\n return value ? value == \"true\" || (value == \"false\" ? false : value == \"null\" ? null : !isNaN(num = Number(value)) ? num : /^[\\[\\{]/.test(value) ? $.parseJSON(value) : value) : value;\n } catch (e) {\n return value;\n }\n },\n\n // Zepto camelize function\n camelize: function camelize(str) {\n return str.replace(/-+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n });\n },\n\n // Zepto dasherize function\n dasherize: function dasherize(str) {\n return str.replace(/::/g, '/').replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2').replace(/([a-z\\d])([A-Z])/g, '$1_$2').replace(/_/g, '-').toLowerCase();\n },\n\n warn: function warn() {\n var _window$console;\n\n if (window.console && 'function' === typeof window.console.warn) (_window$console = window.console).warn.apply(_window$console, arguments);\n },\n\n warnOnce: function warnOnce(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn.apply(this, arguments);\n }\n },\n\n _resetWarnings: function _resetWarnings() {\n pastWarnings = {};\n },\n\n trimString: function trimString(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n parse: {\n date: function date(string) {\n var parsed = string.match(/^(\\d{4,})-(\\d\\d)-(\\d\\d)$/);\n if (!parsed) return null;\n\n var _parsed$map = parsed.map(function (x) {\n return parseInt(x, 10);\n });\n\n var _parsed$map2 = _slicedToArray(_parsed$map, 4);\n\n var _ = _parsed$map2[0];\n var year = _parsed$map2[1];\n var month = _parsed$map2[2];\n var day = _parsed$map2[3];\n\n var date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) return null;\n return date;\n },\n string: function string(_string) {\n return _string;\n },\n integer: function integer(string) {\n if (isNaN(string)) return null;\n return parseInt(string, 10);\n },\n number: function number(string) {\n if (isNaN(string)) throw null;\n return parseFloat(string);\n },\n 'boolean': function _boolean(string) {\n return !/^\\s*false\\s*$/i.test(string);\n },\n object: function object(string) {\n return Utils__Utils.deserializeValue(string);\n },\n regexp: function regexp(_regexp) {\n var flags = '';\n\n // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n if (/^\\/.*\\/(?:[gimy]*)$/.test(_regexp)) {\n // Replace the regexp literal string with the first match group: ([gimy]*)\n // If no flag is present, this will be a blank string\n flags = _regexp.replace(/.*\\/([gimy]*)$/, '$1');\n // Again, replace the regexp literal string with the first match group:\n // everything excluding the opening and closing slashes and the flags\n _regexp = _regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n } else {\n // Anchor regexp:\n _regexp = '^' + _regexp + '$';\n }\n return new RegExp(_regexp, flags);\n }\n },\n\n parseRequirement: function parseRequirement(requirementType, string) {\n var converter = this.parse[requirementType || 'string'];\n if (!converter) throw 'Unknown requirement specification: \"' + requirementType + '\"';\n var converted = converter(string);\n if (converted === null) throw 'Requirement is not a ' + requirementType + ': \"' + string + '\"';\n return converted;\n },\n\n namespaceEvents: function namespaceEvents(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0]) return '';\n return $.map(events, function (evt) {\n return evt + '.' + namespace;\n }).join(' ');\n },\n\n difference: function difference(array, remove) {\n // This is O(N^2), should be optimized\n var result = [];\n $.each(array, function (_, elem) {\n if (remove.indexOf(elem) == -1) result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function all(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when.apply($, _toConsumableArray(promises).concat([42, 42]));\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function Object() {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })(),\n\n _SubmitSelector: 'input[type=\"submit\"], button:submit'\n };\n\n var Utils__default = Utils__Utils;\n\n // All these options could be overriden and specified directly in DOM using\n // `data-parsley-` default DOM-API\n // eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n // eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n\n var Defaults = {\n // ### General\n\n // Default data-namespace for DOM API\n namespace: 'data-parsley-',\n\n // Supported inputs by default\n inputs: 'input, textarea, select',\n\n // Excluded inputs by default\n excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n\n // Stop validating field on highest priority failing constraint\n priorityEnabled: true,\n\n // ### Field only\n\n // identifier used to group together inputs (e.g. radio buttons...)\n multiple: null,\n\n // identifier (or array of identifiers) used to validate only a select group of inputs\n group: null,\n\n // ### UI\n // Enable\\Disable error messages\n uiEnabled: true,\n\n // Key events threshold before validation\n validationThreshold: 3,\n\n // Focused field on form validation error. 'first'|'last'|'none'\n focus: 'first',\n\n // event(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function classHandler(Field) {},\n\n // Return the `$element` where errors will be appended\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n errorsContainer: function errorsContainer(Field) {},\n\n // ul elem that would receive errors' list\n errorsWrapper: '<ul class=\"parsley-errors-list\"></ul>',\n\n // li elem that would receive error message\n errorTemplate: '<li></li>'\n };\n\n var Base = function Base() {\n this.__id__ = Utils__default.generateID();\n };\n\n Base.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function _pipeAccordingToValidationResult() {\n var _this = this;\n\n var pipe = function pipe() {\n var r = $.Deferred();\n if (true !== _this.validationResult) r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function actualizeOptions() {\n Utils__default.attr(this.$element, this.options.namespace, this.domOptions);\n if (this.parent && this.parent.actualizeOptions) this.parent.actualizeOptions();\n return this;\n },\n\n _resetOptions: function _resetOptions(initOptions) {\n this.domOptions = Utils__default.objectCreate(this.parent.options);\n this.options = Utils__default.objectCreate(this.domOptions);\n // Shallow copy of ownProperties of initOptions:\n for (var i in initOptions) {\n if (initOptions.hasOwnProperty(i)) this.options[i] = initOptions[i];\n }\n this.actualizeOptions();\n },\n\n _listeners: null,\n\n // Register a callback for the given event name\n // Callback is called with context as the first argument and the `this`\n // The context is the current parsley instance, or window.Parsley if global\n // A return value of `false` will interrupt the calls\n on: function on(name, fn) {\n this._listeners = this._listeners || {};\n var queue = this._listeners[name] = this._listeners[name] || [];\n queue.push(fn);\n\n return this;\n },\n\n // Deprecated. Use `on` instead\n subscribe: function subscribe(name, fn) {\n $.listenTo(this, name.toLowerCase(), fn);\n },\n\n // Unregister a callback (or all if none is given) for the given event name\n off: function off(name, fn) {\n var queue = this._listeners && this._listeners[name];\n if (queue) {\n if (!fn) {\n delete this._listeners[name];\n } else {\n for (var i = queue.length; i--;) if (queue[i] === fn) queue.splice(i, 1);\n }\n }\n return this;\n },\n\n // Deprecated. Use `off`\n unsubscribe: function unsubscribe(name, fn) {\n $.unsubscribeTo(this, name.toLowerCase());\n },\n\n // Trigger an event of the given name\n // A return value of `false` interrupts the callback chain\n // Returns false if execution was interrupted\n trigger: function trigger(name, target, extraArg) {\n target = target || this;\n var queue = this._listeners && this._listeners[name];\n var result;\n var parentResult;\n if (queue) {\n for (var i = queue.length; i--;) {\n result = queue[i].call(target, target, extraArg);\n if (result === false) return result;\n }\n }\n if (this.parent) {\n return this.parent.trigger(name, target, extraArg);\n }\n return true;\n },\n\n asyncIsValid: function asyncIsValid(group, force) {\n Utils__default.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({ group: group, force: force });\n },\n\n _findRelated: function _findRelated() {\n return this.options.multiple ? this.parent.$element.find('[' + this.options.namespace + 'multiple=\"' + this.options.multiple + '\"]') : this.$element;\n }\n };\n\n var convertArrayRequirement = function convertArrayRequirement(string, length) {\n var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n if (!m) throw 'Requirement is not an array: \"' + string + '\"';\n var values = m[1].split(',').map(Utils__default.trimString);\n if (values.length !== length) throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n return values;\n };\n\n var convertExtraOptionRequirement = function convertExtraOptionRequirement(requirementSpec, string, extraOptionReader) {\n var main = null;\n var extra = {};\n for (var key in requirementSpec) {\n if (key) {\n var value = extraOptionReader(key);\n if ('string' === typeof value) value = Utils__default.parseRequirement(requirementSpec[key], value);\n extra[key] = value;\n } else {\n main = Utils__default.parseRequirement(requirementSpec[key], string);\n }\n }\n return [main, extra];\n };\n\n // A Validator needs to implement the methods `validate` and `parseRequirements`\n\n var Validator = function Validator(spec) {\n $.extend(true, this, spec);\n };\n\n Validator.prototype = {\n // Returns `true` iff the given `value` is valid according the given requirements.\n validate: function validate(value, requirementFirstArg) {\n if (this.fn) {\n // Legacy style validator\n\n if (arguments.length > 3) // If more args then value, requirement, instance...\n requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest\n return this.fn(value, requirementFirstArg);\n }\n\n if ($.isArray(value)) {\n if (!this.validateMultiple) throw 'Validator `' + this.name + '` does not handle multiple values';\n return this.validateMultiple.apply(this, arguments);\n } else {\n var instance = arguments[arguments.length - 1];\n if (this.validateDate && instance._isDateInput()) {\n arguments[0] = Utils__default.parse.date(arguments[0]);\n if (arguments[0] === null) return false;\n return this.validateDate.apply(this, arguments);\n }\n if (this.validateNumber) {\n if (isNaN(value)) return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber.apply(this, arguments);\n }\n if (this.validateString) {\n return this.validateString.apply(this, arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function parseRequirements(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return $.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if ($.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++) values[i] = Utils__default.parseRequirement(type[i], values[i]);\n return values;\n } else if ($.isPlainObject(type)) {\n return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n } else {\n return [Utils__default.parseRequirement(type, requirements)];\n }\n },\n // Defaults:\n requirementType: 'string',\n\n priority: 2\n\n };\n\n var ValidatorRegistry = function ValidatorRegistry(validators, catalog) {\n this.__class__ = 'ValidatorRegistry';\n\n // Default Parsley locale is en\n this.locale = 'en';\n\n this.init(validators || {}, catalog || {});\n };\n\n var typeTesters = {\n email: /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n date: {\n test: function test(value) {\n return Utils__default.parse.date(value) !== null;\n }\n },\n\n url: new RegExp(\"^\" +\n // protocol identifier\n \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" + \"(?:\" +\n // IP address exclusion\n // private & local networks\n // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" + // ** mod: allow local networks\n // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" + \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" + \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" + \"|\" +\n // host name\n '(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)' +\n // domain name\n '(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*' +\n // TLD identifier\n '(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))' + \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:/\\\\S*)?\" + \"$\", 'i')\n };\n typeTesters.range = typeTesters.number;\n\n // See http://stackoverflow.com/a/10454560/8279\n var decimalPlaces = function decimalPlaces(num) {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) {\n return 0;\n }\n return Math.max(0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) - (\n // Adjust for scientific notation.\n match[2] ? +match[2] : 0));\n };\n\n // parseArguments('number', ['1', '2']) => [1, 2]\n var ValidatorRegistry__parseArguments = function ValidatorRegistry__parseArguments(type, args) {\n return args.map(Utils__default.parse[type]);\n };\n // operatorToValidator returns a validating function for an operator function, applied to the given type\n var ValidatorRegistry__operatorToValidator = function ValidatorRegistry__operatorToValidator(type, operator) {\n return function (value) {\n for (var _len = arguments.length, requirementsAndInput = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n requirementsAndInput[_key - 1] = arguments[_key];\n }\n\n requirementsAndInput.pop(); // Get rid of `input` argument\n return operator.apply(undefined, [value].concat(_toConsumableArray(ValidatorRegistry__parseArguments(type, requirementsAndInput))));\n };\n };\n\n var ValidatorRegistry__comparisonOperator = function ValidatorRegistry__comparisonOperator(operator) {\n return {\n validateDate: ValidatorRegistry__operatorToValidator('date', operator),\n validateNumber: ValidatorRegistry__operatorToValidator('number', operator),\n requirementType: operator.length <= 2 ? 'string' : ['string', 'string'], // Support operators with a 1 or 2 requirement(s)\n priority: 30\n };\n };\n\n ValidatorRegistry.prototype = {\n init: function init(validators, catalog) {\n this.catalog = catalog;\n // Copy prototype's validators:\n this.validators = $.extend({}, this.validators);\n\n for (var name in validators) this.addValidator(name, validators[name].fn, validators[name].priority);\n\n window.Parsley.trigger('parsley:validator:init');\n },\n\n // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n setLocale: function setLocale(locale) {\n if ('undefined' === typeof this.catalog[locale]) throw new Error(locale + ' is not available in the catalog');\n\n this.locale = locale;\n\n return this;\n },\n\n // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n addCatalog: function addCatalog(locale, messages, set) {\n if ('object' === typeof messages) this.catalog[locale] = messages;\n\n if (true === set) return this.setLocale(locale);\n\n return this;\n },\n\n // Add a specific message for a given constraint in a given locale\n addMessage: function addMessage(locale, name, message) {\n if ('undefined' === typeof this.catalog[locale]) this.catalog[locale] = {};\n\n this.catalog[locale][name] = message;\n\n return this;\n },\n\n // Add messages for a given locale\n addMessages: function addMessages(locale, nameMessageObject) {\n for (var name in nameMessageObject) this.addMessage(locale, name, nameMessageObject[name]);\n\n return this;\n },\n\n // Add a new validator\n //\n // addValidator('custom', {\n // requirementType: ['integer', 'integer'],\n // validateString: function(value, from, to) {},\n // priority: 22,\n // messages: {\n // en: \"Hey, that's no good\",\n // fr: \"Aye aye, pas bon du tout\",\n // }\n // })\n //\n // Old API was addValidator(name, function, priority)\n //\n addValidator: function addValidator(name, arg1, arg2) {\n if (this.validators[name]) Utils__default.warn('Validator \"' + name + '\" is already defined.');else if (Defaults.hasOwnProperty(name)) {\n Utils__default.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n return;\n }\n return this._setValidator.apply(this, arguments);\n },\n\n updateValidator: function updateValidator(name, arg1, arg2) {\n if (!this.validators[name]) {\n Utils__default.warn('Validator \"' + name + '\" is not already defined.');\n return this.addValidator.apply(this, arguments);\n }\n return this._setValidator.apply(this, arguments);\n },\n\n removeValidator: function removeValidator(name) {\n if (!this.validators[name]) Utils__default.warn('Validator \"' + name + '\" is not defined.');\n\n delete this.validators[name];\n\n return this;\n },\n\n _setValidator: function _setValidator(name, validator, priority) {\n if ('object' !== typeof validator) {\n // Old style validator, with `fn` and `priority`\n validator = {\n fn: validator,\n priority: priority\n };\n }\n if (!validator.validate) {\n validator = new Validator(validator);\n }\n this.validators[name] = validator;\n\n for (var locale in validator.messages || {}) this.addMessage(locale, name, validator.messages[locale]);\n\n return this;\n },\n\n getErrorMessage: function getErrorMessage(constraint) {\n var message;\n\n // Type constraints are a bit different, we have to match their requirements too to find right error message\n if ('type' === constraint.name) {\n var typeMessages = this.catalog[this.locale][constraint.name] || {};\n message = typeMessages[constraint.requirements];\n } else message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n },\n\n // Kind of light `sprintf()` implementation\n formatMessage: function formatMessage(string, parameters) {\n if ('object' === typeof parameters) {\n for (var i in parameters) string = this.formatMessage(string, parameters[i]);\n\n return string;\n }\n\n return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function validateString(value) {\n return (/\\S/.test(value)\n );\n },\n priority: 2\n },\n required: {\n validateMultiple: function validateMultiple(values) {\n return values.length > 0;\n },\n validateString: function validateString(value) {\n return (/\\S/.test(value)\n );\n },\n priority: 512\n },\n type: {\n validateString: function validateString(value, type) {\n var _ref = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\n var _ref$step = _ref.step;\n var step = _ref$step === undefined ? 'any' : _ref$step;\n var _ref$base = _ref.base;\n var base = _ref$base === undefined ? 0 : _ref$base;\n\n var tester = typeTesters[type];\n if (!tester) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!tester.test(value)) return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = function toInt(f) {\n return Math.round(f * Math.pow(10, decimals));\n };\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0) return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function validateString(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function validateString(value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function validateString(value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function validateString(value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function validateMultiple(values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function validateMultiple(values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function validateMultiple(values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: ValidatorRegistry__comparisonOperator(function (value, requirement) {\n return value >= requirement;\n }),\n max: ValidatorRegistry__comparisonOperator(function (value, requirement) {\n return value <= requirement;\n }),\n range: ValidatorRegistry__comparisonOperator(function (value, min, max) {\n return value >= min && value <= max;\n }),\n equalto: {\n validateString: function validateString(value, refOrValue) {\n var $reference = $(refOrValue);\n if ($reference.length) return value === $reference.val();else return value === refOrValue;\n },\n priority: 256\n }\n }\n };\n\n var UI = {};\n\n var diffResults = function diffResults(newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++) if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found) kept.push(newResult[i]);else added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n };\n\n UI.Form = {\n\n _actualizeTriggers: function _actualizeTriggers() {\n var _this2 = this;\n\n this.$element.on('submit.Parsley', function (evt) {\n _this2.onSubmitValidate(evt);\n });\n this.$element.on('click.Parsley', Utils__default._SubmitSelector, function (evt) {\n _this2.onSubmitButton(evt);\n });\n\n // UI could be disabled\n if (false === this.options.uiEnabled) return;\n\n this.$element.attr('novalidate', '');\n },\n\n focus: function focus() {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus) return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus) break;\n }\n }\n\n if (null === this._focusedField) return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function _destroyUI() {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n };\n\n UI.Field = {\n\n _reflowUI: function _reflowUI() {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui) return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function getErrorsMessages() {\n // No error message, field is valid\n if (true === this.validationResult) return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++) messages.push(this.validationResult[i].errorMessage || this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function addError(name) {\n var _ref2 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var message = _ref2.message;\n var assert = _ref2.assert;\n var _ref2$updateClass = _ref2.updateClass;\n var updateClass = _ref2$updateClass === undefined ? true : _ref2$updateClass;\n\n this._buildUI();\n this._addError(name, { message: message, assert: assert });\n\n if (updateClass) this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function updateError(name) {\n var _ref3 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var message = _ref3.message;\n var assert = _ref3.assert;\n var _ref3$updateClass = _ref3.updateClass;\n var updateClass = _ref3$updateClass === undefined ? true : _ref3$updateClass;\n\n this._buildUI();\n this._updateError(name, { message: message, assert: assert });\n\n if (updateClass) this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function removeError(name) {\n var _ref4 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var _ref4$updateClass = _ref4.updateClass;\n var updateClass = _ref4$updateClass === undefined ? true : _ref4$updateClass;\n\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass) this._manageStatusClass();\n },\n\n _manageStatusClass: function _manageStatusClass() {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult) this._successClass();else if (this.validationResult.length > 0) this._errorClass();else this._resetClass();\n },\n\n _manageErrorsMessages: function _manageErrorsMessages(diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled) return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if (diff.added.length || diff.kept.length) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length) this._ui.$errorsWrapper.append($(this.options.errorTemplate).addClass('parsley-custom-error-message'));\n\n return this._ui.$errorsWrapper.addClass('filled').find('.parsley-custom-error-message').html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper.removeClass('filled').find('.parsley-custom-error-message').remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++) this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++) this._addError(diff.added[i].assert.name, { message: diff.added[i].errorMessage, assert: diff.added[i].assert });\n\n for (i = 0; i < diff.kept.length; i++) this._updateError(diff.kept[i].assert.name, { message: diff.kept[i].errorMessage, assert: diff.kept[i].assert });\n },\n\n _addError: function _addError(name, _ref5) {\n var message = _ref5.message;\n var assert = _ref5.assert;\n\n this._insertErrorWrapper();\n this._ui.$errorsWrapper.addClass('filled').append($(this.options.errorTemplate).addClass('parsley-' + name).html(message || this._getErrorMessage(assert)));\n },\n\n _updateError: function _updateError(name, _ref6) {\n var message = _ref6.message;\n var assert = _ref6.assert;\n\n this._ui.$errorsWrapper.addClass('filled').find('.parsley-' + name).html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function _removeError(name) {\n this._ui.$errorsWrapper.removeClass('filled').find('.parsley-' + name).remove();\n },\n\n _getErrorMessage: function _getErrorMessage(constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage]) return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function _buildUI() {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled) return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function _manageClassHandler() {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length) return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = this.options.classHandler.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length) return $handler;\n\n return this._inputHolder();\n },\n\n _inputHolder: function _inputHolder() {\n // if simple element (input, texatrea, select...) it will perfectly host the classes and precede the error container\n if (!this.options.multiple || this.$element.is('select')) return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function _insertErrorWrapper() {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length) return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof this.options.errorsContainer) {\n if ($(this.options.errorsContainer).length) return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);else Utils__default.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof this.options.errorsContainer) $errorsContainer = this.options.errorsContainer.call(this, this);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length) return $errorsContainer.append(this._ui.$errorsWrapper);\n\n return this._inputHolder().after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function _actualizeTriggers() {\n var _this3 = this;\n\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce) $toBind.on(Utils__default.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), function () {\n _this3._validateIfNeeded();\n });else if (trigger = Utils__default.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, function (event) {\n _this3._validateIfNeeded(event);\n });\n }\n },\n\n _validateIfNeeded: function _validateIfNeeded(event) {\n var _this4 = this;\n\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (event && /key|input/.test(event.type)) if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold) return;\n\n if (this.options.debounce) {\n window.clearTimeout(this._debounced);\n this._debounced = window.setTimeout(function () {\n return _this4.validate();\n }, this.options.debounce);\n } else this.validate();\n },\n\n _resetUI: function _resetUI() {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui) return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper.removeClass('filled').children().remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function _destroyUI() {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui) this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function _successClass() {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function _errorClass() {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function _resetClass() {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n };\n\n var Form = function Form(element, domOptions, options) {\n this.__class__ = 'Form';\n\n this.$element = $(element);\n this.domOptions = domOptions;\n this.options = options;\n this.parent = window.Parsley;\n\n this.fields = [];\n this.validationResult = null;\n };\n\n var Form__statusMapping = { pending: null, resolved: true, rejected: false };\n\n Form.prototype = {\n onSubmitValidate: function onSubmitValidate(event) {\n var _this5 = this;\n\n // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley) return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var $submitSource = this._$submitSource || this.$element.find(Utils__default._SubmitSelector).first();\n this._$submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if ($submitSource.is('[formnovalidate]')) return;\n\n var promise = this.whenValidate({ event: event });\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state()) promise.done(function () {\n _this5._submit($submitSource);\n });\n }\n },\n\n onSubmitButton: function onSubmitButton(event) {\n this._$submitSource = $(event.currentTarget);\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function _submit($submitSource) {\n if (false === this._trigger('submit')) return;\n // Add submit button's data\n if ($submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length) $synthetic = $('<input class=\"parsley-synthetic-submit-button\" type=\"hidden\">').appendTo(this.$element);\n $synthetic.attr({\n name: $submitSource.attr('name'),\n value: $submitSource.attr('value')\n });\n }\n\n this.$element.trigger($.extend($.Event('submit'), { parsley: true }));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function validate(options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils__default.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n\n var _arguments = _slice.call(arguments);\n\n var group = _arguments[0];\n var force = _arguments[1];\n var event = _arguments[2];\n\n options = { group: group, force: force, event: event };\n }\n return Form__statusMapping[this.whenValidate(options).state()];\n },\n\n whenValidate: function whenValidate() {\n var _Utils__default$all$done$fail$always,\n _this6 = this;\n\n var _ref7 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var group = _ref7.group;\n var force = _ref7.force;\n var event = _ref7.event;\n\n this.submitEvent = event;\n if (event) {\n this.submitEvent = $.extend({}, event, { preventDefault: function preventDefault() {\n Utils__default.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n _this6.validationResult = false;\n } });\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(function () {\n return $.map(_this6.fields, function (field) {\n return field.whenValidate({ force: force, group: group });\n });\n });\n\n return (_Utils__default$all$done$fail$always = Utils__default.all(promises).done(function () {\n _this6._trigger('success');\n }).fail(function () {\n _this6.validationResult = false;\n _this6.focus();\n _this6._trigger('error');\n }).always(function () {\n _this6._trigger('validated');\n })).pipe.apply(_Utils__default$all$done$fail$always, _toConsumableArray(this._pipeAccordingToValidationResult()));\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function isValid(options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils__default.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n\n var _arguments2 = _slice.call(arguments);\n\n var group = _arguments2[0];\n var force = _arguments2[1];\n\n options = { group: group, force: force };\n }\n return Form__statusMapping[this.whenValid(options).state()];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function whenValid() {\n var _this7 = this;\n\n var _ref8 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var group = _ref8.group;\n var force = _ref8.force;\n\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(function () {\n return $.map(_this7.fields, function (field) {\n return field.whenValid({ group: group, force: force });\n });\n });\n return Utils__default.all(promises);\n },\n\n // Reset UI\n reset: function reset() {\n // Form case: emit a reset event for each field\n for (var i = 0; i < this.fields.length; i++) this.fields[i].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function destroy() {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n\n // Form case: destroy all its fields and then destroy stored instance\n for (var i = 0; i < this.fields.length; i++) this.fields[i].destroy();\n\n this.$element.removeData('Parsley');\n this._trigger('destroy');\n },\n\n _refreshFields: function _refreshFields() {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function _bindFields() {\n var _this8 = this;\n\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(function () {\n _this8.$element.find(_this8.options.inputs).not(_this8.options.excluded).each(function (_, element) {\n var fieldInstance = new window.Parsley.Factory(element, {}, _this8);\n\n // Only add valid and not excluded `Field` and `FieldMultiple` children\n if (('Field' === fieldInstance.__class__ || 'FieldMultiple' === fieldInstance.__class__) && true !== fieldInstance.options.excluded) {\n var uniqueId = fieldInstance.__class__ + '-' + fieldInstance.__id__;\n if ('undefined' === typeof _this8.fieldsMappedById[uniqueId]) {\n _this8.fieldsMappedById[uniqueId] = fieldInstance;\n _this8.fields.push(fieldInstance);\n }\n }\n });\n\n $.each(Utils__default.difference(oldFields, _this8.fields), function (_, field) {\n field.reset();\n });\n });\n return this;\n },\n\n // Internal only.\n // Looping on a form's fields to do validation or similar\n // will trigger reactualizing options on all of them, which\n // in turn will reactualize the form's options.\n // To avoid calling actualizeOptions so many times on the form\n // for nothing, _withoutReactualizingFormOptions temporarily disables\n // the method actualizeOptions on this form while `fn` is called.\n _withoutReactualizingFormOptions: function _withoutReactualizingFormOptions(fn) {\n var oldActualizeOptions = this.actualizeOptions;\n this.actualizeOptions = function () {\n return this;\n };\n var result = fn();\n this.actualizeOptions = oldActualizeOptions;\n return result;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n // Returns true iff event is not interrupted and default not prevented.\n _trigger: function _trigger(eventName) {\n return this.trigger('form:' + eventName);\n }\n\n };\n\n var Constraint = function Constraint(parsleyField, name, requirements, priority, isDomConstraint) {\n var validatorSpec = window.Parsley._validatorRegistry.validators[name];\n var validator = new Validator(validatorSpec);\n\n $.extend(this, {\n validator: validator,\n name: name,\n requirements: requirements,\n priority: priority || parsleyField.options[name + 'Priority'] || validator.priority,\n isDomConstraint: true === isDomConstraint\n });\n this._parseRequirements(parsleyField.options);\n };\n\n var capitalize = function capitalize(str) {\n var cap = str[0].toUpperCase();\n return cap + str.slice(1);\n };\n\n Constraint.prototype = {\n validate: function validate(value, instance) {\n var _validator;\n\n return (_validator = this.validator).validate.apply(_validator, [value].concat(_toConsumableArray(this.requirementList), [instance]));\n },\n\n _parseRequirements: function _parseRequirements(options) {\n var _this9 = this;\n\n this.requirementList = this.validator.parseRequirements(this.requirements, function (key) {\n return options[_this9.name + capitalize(key)];\n });\n }\n };\n\n var Field = function Field(field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'Field';\n\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n };\n\n var parsley_field__statusMapping = { pending: null, resolved: true, rejected: false };\n\n Field.prototype = {\n // # Public API\n // Validate field and trigger some events for mainly `UI`\n // @returns `true`, an array of the validators that failed, or\n // `null` if validation is not finished. Prefer using whenValidate\n validate: function validate(options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils__default.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = { options: options };\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending':\n return null;\n case 'resolved':\n return true;\n case 'rejected':\n return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `UI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function whenValidate() {\n var _whenValid$always$done$fail$always,\n _this10 = this;\n\n var _ref9 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var force = _ref9.force;\n var group = _ref9.group;\n\n // do not validate a field if not the same as given validation group\n this.refreshConstraints();\n if (group && !this._isInGroup(group)) return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return (_whenValid$always$done$fail$always = this.whenValid({ force: force, value: this.value, _refreshed: true }).always(function () {\n _this10._reflowUI();\n }).done(function () {\n _this10._trigger('success');\n }).fail(function () {\n _this10._trigger('error');\n }).always(function () {\n _this10._trigger('validated');\n })).pipe.apply(_whenValid$always$done$fail$always, _toConsumableArray(this._pipeAccordingToValidationResult()));\n },\n\n hasConstraints: function hasConstraints() {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function needsValidation(value) {\n if ('undefined' === typeof value) value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty) return false;\n\n return true;\n },\n\n _isInGroup: function _isInGroup(group) {\n if ($.isArray(this.options.group)) return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function isValid(options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils__default.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n\n var _arguments3 = _slice.call(arguments);\n\n var force = _arguments3[0];\n var value = _arguments3[1];\n\n options = { force: force, value: value };\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return parsley_field__statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function whenValid() {\n var _this11 = this;\n\n var _ref10 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var _ref10$force = _ref10.force;\n var force = _ref10$force === undefined ? false : _ref10$force;\n var value = _ref10.value;\n var group = _ref10.group;\n var _refreshed = _ref10._refreshed;\n\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed) this.refreshConstraints();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group)) return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints()) return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value) value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force) return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, function (_, constraints) {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = Utils__default.all($.map(constraints, function (constraint) {\n return _this11._validateConstraint(value, constraint);\n }));\n promises.push(promise);\n if (promise.state() === 'rejected') return false; // Interrupt processing if a group has already failed\n });\n return Utils__default.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function _validateConstraint(value, constraint) {\n var _this12 = this;\n\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result) result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return Utils__default.all([result]).fail(function (errorMessage) {\n if (!(_this12.validationResult instanceof Array)) _this12.validationResult = [];\n _this12.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function getValue() {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value) value = this.options.value(this);else if ('undefined' !== typeof this.options.value) value = this.options.value;else value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value) return '';\n\n return this._handleWhitespace(value);\n },\n\n // Reset UI\n reset: function reset() {\n this._resetUI();\n return this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function destroy() {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n this.$element.removeData('Parsley');\n this.$element.removeData('FieldMultiple');\n this._trigger('destroy');\n },\n\n // Actualize options that could have change since previous validation\n // Re-bind accordingly constraints (could be some new, removed or updated)\n refreshConstraints: function refreshConstraints() {\n return this.actualizeOptions()._bindConstraints();\n },\n\n /**\n * Add a new constraint to a field\n *\n * @param {String} name\n * @param {Mixed} requirements optional\n * @param {Number} priority optional\n * @param {Boolean} isDomConstraint optional\n */\n addConstraint: function addConstraint(name, requirements, priority, isDomConstraint) {\n\n if (window.Parsley._validatorRegistry.validators[name]) {\n var constraint = new Constraint(this, name, requirements, priority, isDomConstraint);\n\n // if constraint already exist, delete it and push new version\n if ('undefined' !== this.constraintsByName[constraint.name]) this.removeConstraint(constraint.name);\n\n this.constraints.push(constraint);\n this.constraintsByName[constraint.name] = constraint;\n }\n\n return this;\n },\n\n // Remove a constraint\n removeConstraint: function removeConstraint(name) {\n for (var i = 0; i < this.constraints.length; i++) if (name === this.constraints[i].name) {\n this.constraints.splice(i, 1);\n break;\n }\n delete this.constraintsByName[name];\n return this;\n },\n\n // Update a constraint (Remove + re-add)\n updateConstraint: function updateConstraint(name, parameters, priority) {\n return this.removeConstraint(name).addConstraint(name, parameters, priority);\n },\n\n // # Internals\n\n // Internal only.\n // Bind constraints from config + options + DOM\n _bindConstraints: function _bindConstraints() {\n var constraints = [];\n var constraintsByName = {};\n\n // clean all existing DOM constraints to only keep javascript user constraints\n for (var i = 0; i < this.constraints.length; i++) if (false === this.constraints[i].isDomConstraint) {\n constraints.push(this.constraints[i]);\n constraintsByName[this.constraints[i].name] = this.constraints[i];\n }\n\n this.constraints = constraints;\n this.constraintsByName = constraintsByName;\n\n // then re-add Parsley DOM-API constraints\n for (var name in this.options) this.addConstraint(name, this.options[name], undefined, true);\n\n // finally, bind special HTML5 constraints\n return this._bindHtml5Constraints();\n },\n\n // Internal only.\n // Bind specific HTML5 constraints to be HTML5 compliant\n _bindHtml5Constraints: function _bindHtml5Constraints() {\n // html5 required\n if (this.$element.attr('required')) this.addConstraint('required', true, undefined, true);\n\n // html5 pattern\n if ('string' === typeof this.$element.attr('pattern')) this.addConstraint('pattern', this.$element.attr('pattern'), undefined, true);\n\n // range\n if ('undefined' !== typeof this.$element.attr('min') && 'undefined' !== typeof this.$element.attr('max')) this.addConstraint('range', [this.$element.attr('min'), this.$element.attr('max')], undefined, true);\n\n // HTML5 min\n else if ('undefined' !== typeof this.$element.attr('min')) this.addConstraint('min', this.$element.attr('min'), undefined, true);\n\n // HTML5 max\n else if ('undefined' !== typeof this.$element.attr('max')) this.addConstraint('max', this.$element.attr('max'), undefined, true);\n\n // length\n if ('undefined' !== typeof this.$element.attr('minlength') && 'undefined' !== typeof this.$element.attr('maxlength')) this.addConstraint('length', [this.$element.attr('minlength'), this.$element.attr('maxlength')], undefined, true);\n\n // HTML5 minlength\n else if ('undefined' !== typeof this.$element.attr('minlength')) this.addConstraint('minlength', this.$element.attr('minlength'), undefined, true);\n\n // HTML5 maxlength\n else if ('undefined' !== typeof this.$element.attr('maxlength')) this.addConstraint('maxlength', this.$element.attr('maxlength'), undefined, true);\n\n // html5 types\n var type = this.$element.attr('type');\n\n if ('undefined' === typeof type) return this;\n\n // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n if ('number' === type) {\n return this.addConstraint('type', ['number', {\n step: this.$element.attr('step') || '1',\n base: this.$element.attr('min') || this.$element.attr('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range|date)$/i.test(type)) {\n return this.addConstraint('type', type, undefined, true);\n }\n return this;\n },\n\n // Internal only.\n // Field is required if have required constraint without `false` value\n _isRequired: function _isRequired() {\n if ('undefined' === typeof this.constraintsByName.required) return false;\n\n return false !== this.constraintsByName.required.requirements;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n _trigger: function _trigger(eventName) {\n return this.trigger('field:' + eventName);\n },\n\n // Internal only\n // Handles whitespace in a value\n // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n _handleWhitespace: function _handleWhitespace(value) {\n if (true === this.options.trimValue) Utils__default.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n if ('squish' === this.options.whitespace) value = value.replace(/\\s{2,}/g, ' ');\n\n if ('trim' === this.options.whitespace || 'squish' === this.options.whitespace || true === this.options.trimValue) value = Utils__default.trimString(value);\n\n return value;\n },\n\n _isDateInput: function _isDateInput() {\n var c = this.constraintsByName.type;\n return c && c.requirements === 'date';\n },\n\n // Internal only.\n // Returns the constraints, grouped by descending priority.\n // The result is thus an array of arrays of constraints.\n _getGroupedConstraints: function _getGroupedConstraints() {\n if (false === this.options.priorityEnabled) return [this.constraints];\n\n var groupedConstraints = [];\n var index = {};\n\n // Create array unique of priorities\n for (var i = 0; i < this.constraints.length; i++) {\n var p = this.constraints[i].priority;\n if (!index[p]) groupedConstraints.push(index[p] = []);\n index[p].push(this.constraints[i]);\n }\n // Sort them by priority DESC\n groupedConstraints.sort(function (a, b) {\n return b[0].priority - a[0].priority;\n });\n\n return groupedConstraints;\n }\n\n };\n\n var parsley_field = Field;\n\n var Multiple = function Multiple() {\n this.__class__ = 'FieldMultiple';\n };\n\n Multiple.prototype = {\n // Add new `$element` sibling for multiple field\n addElement: function addElement($element) {\n this.$elements.push($element);\n\n return this;\n },\n\n // See `Field.refreshConstraints()`\n refreshConstraints: function refreshConstraints() {\n var fieldConstraints;\n\n this.constraints = [];\n\n // Select multiple special treatment\n if (this.$element.is('select')) {\n this.actualizeOptions()._bindConstraints();\n\n return this;\n }\n\n // Gather all constraints for each input in the multiple group\n for (var i = 0; i < this.$elements.length; i++) {\n\n // Check if element have not been dynamically removed since last binding\n if (!$('html').has(this.$elements[i]).length) {\n this.$elements.splice(i, 1);\n continue;\n }\n\n fieldConstraints = this.$elements[i].data('FieldMultiple').refreshConstraints().constraints;\n\n for (var j = 0; j < fieldConstraints.length; j++) this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n }\n\n return this;\n },\n\n // See `Field.getValue()`\n getValue: function getValue() {\n // Value could be overriden in DOM\n if ('function' === typeof this.options.value) return this.options.value(this);else if ('undefined' !== typeof this.options.value) return this.options.value;\n\n // Radio input case\n if (this.$element.is('input[type=radio]')) return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n\n // Select multiple case\n if (this.$element.is('select') && null === this.$element.val()) return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function _init() {\n this.$elements = [this.$element];\n\n return this;\n }\n };\n\n var Factory = function Factory(element, options, parsleyFormInstance) {\n this.$element = $(element);\n\n // If the element has already been bound, returns its saved Parsley instance\n var savedparsleyFormInstance = this.$element.data('Parsley');\n if (savedparsleyFormInstance) {\n\n // If the saved instance has been bound without a Form parent and there is one given in this call, add it\n if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n savedparsleyFormInstance.parent = parsleyFormInstance;\n savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n }\n\n if ('object' === typeof options) {\n $.extend(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length) throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && 'Form' !== parsleyFormInstance.__class__) throw new Error('Parent instance must be a Form instance');\n\n this.parent = parsleyFormInstance || window.Parsley;\n return this.init(options);\n };\n\n Factory.prototype = {\n init: function init(options) {\n this.__class__ = 'Parsley';\n this.__version__ = '2.7.0';\n this.__id__ = Utils__default.generateID();\n\n // Pre-compute options\n this._resetOptions(options);\n\n // A Form instance is obviously a `<form>` element but also every node that is not an input and has the `data-parsley-validate` attribute\n if (this.$element.is('form') || Utils__default.checkAttr(this.$element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)) return this.bind('parsleyForm');\n\n // Every other element is bound as a `Field` or `FieldMultiple`\n return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n },\n\n isMultiple: function isMultiple() {\n return this.$element.is('input[type=radio], input[type=checkbox]') || this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple');\n },\n\n // Multiples fields are a real nightmare :(\n // Maybe some refactoring would be appreciated here...\n handleMultiple: function handleMultiple() {\n var _this13 = this;\n\n var name;\n var multiple;\n var parsleyMultipleInstance;\n\n // Handle multiple name\n if (this.options.multiple) ; // We already have our 'multiple' identifier\n else if ('undefined' !== typeof this.$element.attr('name') && this.$element.attr('name').length) this.options.multiple = name = this.$element.attr('name');else if ('undefined' !== typeof this.$element.attr('id') && this.$element.attr('id').length) this.options.multiple = this.$element.attr('id');\n\n // Special select multiple input\n if (this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple')) {\n this.options.multiple = this.options.multiple || this.__id__;\n return this.bind('parsleyFieldMultiple');\n\n // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n } else if (!this.options.multiple) {\n Utils__default.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n return this;\n }\n\n // Remove special chars\n this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, '');\n\n // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n if ('undefined' !== typeof name) {\n $('input[name=\"' + name + '\"]').each(function (i, input) {\n if ($(input).is('input[type=radio], input[type=checkbox]')) $(input).attr(_this13.options.namespace + 'multiple', _this13.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('FieldMultiple')) {\n parsleyMultipleInstance.addElement(this.$element);\n }\n\n break;\n }\n }\n\n // Create a secret Field instance for every multiple field. It will be stored in `data('FieldMultiple')`\n // And will be useful later to access classic `Field` stuff while being in a `FieldMultiple` instance\n this.bind('parsleyField', true);\n\n return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n },\n\n // Return proper `Form`, `Field` or `FieldMultiple`\n bind: function bind(type, doNotStore) {\n var parsleyInstance;\n\n switch (type) {\n case 'parsleyForm':\n parsleyInstance = $.extend(new Form(this.$element, this.domOptions, this.options), new Base(), window.ParsleyExtend)._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(new parsley_field(this.$element, this.domOptions, this.options, this.parent), new Base(), window.ParsleyExtend);\n break;\n case 'parsleyFieldMultiple':\n parsleyInstance = $.extend(new parsley_field(this.$element, this.domOptions, this.options, this.parent), new Multiple(), new Base(), window.ParsleyExtend)._init();\n break;\n default:\n throw new Error(type + 'is not a supported Parsley type');\n }\n\n if (this.options.multiple) Utils__default.setAttr(this.$element, this.options.namespace, 'multiple', this.options.multiple);\n\n if ('undefined' !== typeof doNotStore) {\n this.$element.data('FieldMultiple', parsleyInstance);\n\n return parsleyInstance;\n }\n\n // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n this.$element.data('Parsley', parsleyInstance);\n\n // Tell the world we have a new Form or Field instance!\n parsleyInstance._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n };\n\n var vernums = $.fn.jquery.split('.');\n if (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n }\n if (!vernums.forEach) {\n Utils__default.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n }\n // Inherit `on`, `off` & `trigger` to Parsley:\n var Parsley = $.extend(new Base(), {\n $element: $(document),\n actualizeOptions: null,\n _resetOptions: null,\n Factory: Factory,\n version: '2.7.0'\n });\n\n // Supplement Field and Form with Base\n // This way, the constructors will have access to those methods\n $.extend(parsley_field.prototype, UI.Field, Base.prototype);\n $.extend(Form.prototype, UI.Form, Base.prototype);\n // Inherit actualizeOptions and _resetOptions:\n $.extend(Factory.prototype, Base.prototype);\n\n // ### jQuery API\n // `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n $.fn.parsley = $.fn.psly = function (options) {\n if (this.length > 1) {\n var instances = [];\n\n this.each(function () {\n instances.push($(this).parsley(options));\n });\n\n return instances;\n }\n\n // Return undefined if applied to non existing DOM element\n if (!$(this).length) {\n Utils__default.warn('You must bind Parsley on an existing element.');\n\n return;\n }\n\n return new Factory(this, options);\n };\n\n // ### Field and Form extension\n // Ensure the extension is now defined if it wasn't previously\n if ('undefined' === typeof window.ParsleyExtend) window.ParsleyExtend = {};\n\n // ### Parsley config\n // Inherit from ParsleyDefault, and copy over any existing values\n Parsley.options = $.extend(Utils__default.objectCreate(Defaults), window.ParsleyConfig);\n window.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n // ### Globals\n window.Parsley = window.psly = Parsley;\n Parsley.Utils = Utils__default;\n window.ParsleyUtils = {};\n $.each(Utils__default, function (key, value) {\n if ('function' === typeof value) {\n window.ParsleyUtils[key] = function () {\n Utils__default.warnOnce('Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.');\n return Utils__default[key].apply(Utils__default, arguments);\n };\n }\n });\n\n // ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\n var registry = window.Parsley._validatorRegistry = new ValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\n window.ParsleyValidator = {};\n $.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator'.split(' '), function (i, method) {\n window.Parsley[method] = $.proxy(registry, method);\n window.ParsleyValidator[method] = function () {\n var _window$Parsley;\n\n Utils__default.warnOnce('Accessing the method \\'' + method + '\\' through Validator is deprecated. Simply call \\'window.Parsley.' + method + '(...)\\'');\n return (_window$Parsley = window.Parsley)[method].apply(_window$Parsley, arguments);\n };\n });\n\n // ### UI\n // Deprecated global object\n window.Parsley.UI = UI;\n window.ParsleyUI = {\n removeError: function removeError(instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils__default.warnOnce('Accessing UI is deprecated. Call \\'removeError\\' on the instance directly. Please comment in issue 1073 as to your need to call this method.');\n return instance.removeError(name, { updateClass: updateClass });\n },\n getErrorsMessages: function getErrorsMessages(instance) {\n Utils__default.warnOnce('Accessing UI is deprecated. Call \\'getErrorsMessages\\' on the instance directly.');\n return instance.getErrorsMessages();\n }\n };\n $.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils__default.warnOnce('Accessing UI is deprecated. Call \\'' + method + '\\' on the instance directly. Please comment in issue 1073 as to your need to call this method.');\n return instance[method](name, { message: message, assert: assert, updateClass: updateClass });\n };\n });\n\n // ### PARSLEY auto-binding\n // Prevent it by setting `ParsleyConfig.autoBind` to `false`\n if (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length) $('[data-parsley-validate]').parsley();\n });\n }\n\n var o = $({});\n var deprecated = function deprecated() {\n Utils__default.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n };\n\n // Returns an event handler that calls `fn` with the arguments it expects\n function adapt(fn, context) {\n // Store to allow unbinding\n if (!fn.parsleyAdaptedCallback) {\n fn.parsleyAdaptedCallback = function () {\n var args = Array.prototype.slice.call(arguments, 0);\n args.unshift(this);\n fn.apply(context || o, args);\n };\n }\n return fn.parsleyAdaptedCallback;\n }\n\n var eventPrefix = 'parsley:';\n // Converts 'parsley:form:validate' into 'form:validate'\n function eventName(name) {\n if (name.lastIndexOf(eventPrefix, 0) === 0) return name.substr(eventPrefix.length);\n return name;\n }\n\n // $.listen is deprecated. Use Parsley.on instead.\n $.listen = function (name, callback) {\n var context;\n deprecated();\n if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n context = arguments[1];\n callback = arguments[2];\n }\n\n if ('function' !== typeof callback) throw new Error('Wrong parameters');\n\n window.Parsley.on(eventName(name), adapt(callback, context));\n };\n\n $.listenTo = function (instance, name, fn) {\n deprecated();\n if (!(instance instanceof parsley_field) && !(instance instanceof Form)) throw new Error('Must give Parsley instance');\n\n if ('string' !== typeof name || 'function' !== typeof fn) throw new Error('Wrong parameters');\n\n instance.on(eventName(name), adapt(fn));\n };\n\n $.unsubscribe = function (name, fn) {\n deprecated();\n if ('string' !== typeof name || 'function' !== typeof fn) throw new Error('Wrong arguments');\n window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n };\n\n $.unsubscribeTo = function (instance, name) {\n deprecated();\n if (!(instance instanceof parsley_field) && !(instance instanceof Form)) throw new Error('Must give Parsley instance');\n instance.off(eventName(name));\n };\n\n $.unsubscribeAll = function (name) {\n deprecated();\n window.Parsley.off(eventName(name));\n $('form,input,textarea,select').each(function () {\n var instance = $(this).data('Parsley');\n if (instance) {\n instance.off(eventName(name));\n }\n });\n };\n\n // $.emit is deprecated. Use jQuery events instead.\n $.emit = function (name, instance) {\n var _instance;\n\n deprecated();\n var instanceGiven = instance instanceof parsley_field || instance instanceof Form;\n var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n args.unshift(eventName(name));\n if (!instanceGiven) {\n instance = window.Parsley;\n }\n (_instance = instance).trigger.apply(_instance, _toConsumableArray(args));\n };\n\n var pubsub = {};\n\n $.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function fn(xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function fn(xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function addAsyncValidator(name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n });\n\n Parsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function validateString(value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator]) throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {}, Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache) Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function handleXhr() {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n });\n\n Parsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n });\n\n window.ParsleyExtend.addAsyncValidator = function () {\n Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator.apply(Parsley, arguments);\n };\n\n // This is included with the Parsley library itself,\n // thus there is no use in adding it to your project.\n Parsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n });\n\n Parsley.setLocale('en');\n\n /**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune <github@marc-andre.ca>\n * @license MIT\n */\n\n function InputEvent() {\n var _this14 = this;\n\n var globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n $.extend(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: function isNativeEvent(evt) {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: function fakeInputEvent(evt) {\n if (_this14.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: function misbehaves(evt) {\n if (_this14.isNativeEvent(evt)) {\n _this14.behavesOk(evt);\n $(document).on('change.inputevent', evt.data.selector, _this14.fakeInputEvent);\n _this14.fakeInputEvent(evt);\n }\n },\n\n behavesOk: function behavesOk(evt) {\n if (_this14.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, _this14.behavesOk).off('change.inputevent', evt.data.selector, _this14.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: function install() {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n var _arr = ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]'];\n for (var _i = 0; _i < _arr.length; _i++) {\n var selector = _arr[_i];\n $(document).on('input.inputevent', selector, { selector: selector }, _this14.behavesOk).on('change.inputevent', selector, { selector: selector }, _this14.misbehaves);\n }\n },\n\n uninstall: function uninstall() {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n };\n\n var inputevent = new InputEvent();\n\n inputevent.install();\n\n var parsley = Parsley;\n\n return parsley;\n});\n//# sourceMappingURL=parsley.js.map\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :\n typeof define === 'function' && define.amd ? define(['jquery'], factory) :\n global.parsley = factory(global.$)\n}(this, function ($) { 'use strict';\n\n var globalID = 1;\n var pastWarnings = {};\n\n var Utils__Utils = {\n // Parsley DOM-API\n // returns object from dom attributes and values\n attr: function ($element, namespace, obj) {\n var i;\n var attribute;\n var attributes;\n var regex = new RegExp('^' + namespace, 'i');\n\n if ('undefined' === typeof obj)\n obj = {};\n else {\n // Clear all own properties. This won't affect prototype's values\n for (i in obj) {\n if (obj.hasOwnProperty(i))\n delete obj[i];\n }\n }\n\n if ('undefined' === typeof $element || 'undefined' === typeof $element[0])\n return obj;\n\n attributes = $element[0].attributes;\n for (i = attributes.length; i--; ) {\n attribute = attributes[i];\n\n if (attribute && attribute.specified && regex.test(attribute.name)) {\n obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n }\n }\n\n return obj;\n },\n\n checkAttr: function ($element, namespace, checkAttr) {\n return $element.is('[' + namespace + checkAttr + ']');\n },\n\n setAttr: function ($element, namespace, attr, value) {\n $element[0].setAttribute(this.dasherize(namespace + attr), String(value));\n },\n\n generateID: function () {\n return '' + globalID++;\n },\n\n /** Third party functions **/\n // Zepto deserialize function\n deserializeValue: function (value) {\n var num;\n\n try {\n return value ?\n value == \"true\" ||\n (value == \"false\" ? false :\n value == \"null\" ? null :\n !isNaN(num = Number(value)) ? num :\n /^[\\[\\{]/.test(value) ? $.parseJSON(value) :\n value)\n : value;\n } catch (e) { return value; }\n },\n\n // Zepto camelize function\n camelize: function (str) {\n return str.replace(/-+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n });\n },\n\n // Zepto dasherize function\n dasherize: function (str) {\n return str.replace(/::/g, '/')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n .replace(/_/g, '-')\n .toLowerCase();\n },\n\n warn: function () {\n if (window.console && 'function' === typeof window.console.warn)\n window.console.warn(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n parse: {\n date: function(string) {\n let parsed = string.match(/^(\\d{4,})-(\\d\\d)-(\\d\\d)$/);\n if (!parsed)\n return null;\n let [_, year, month, day] = parsed.map(x => parseInt(x, 10));\n let date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day)\n return null;\n return date;\n },\n string: function(string) {\n return string;\n },\n integer: function(string) {\n if (isNaN(string))\n return null;\n return parseInt(string, 10);\n },\n number: function(string) {\n if (isNaN(string))\n throw null;\n return parseFloat(string);\n },\n 'boolean': function _boolean(string) {\n return !(/^\\s*false\\s*$/i.test(string));\n },\n object: function(string) {\n return Utils__Utils.deserializeValue(string);\n },\n regexp: function(regexp) {\n var flags = '';\n\n // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n if (/^\\/.*\\/(?:[gimy]*)$/.test(regexp)) {\n // Replace the regexp literal string with the first match group: ([gimy]*)\n // If no flag is present, this will be a blank string\n flags = regexp.replace(/.*\\/([gimy]*)$/, '$1');\n // Again, replace the regexp literal string with the first match group:\n // everything excluding the opening and closing slashes and the flags\n regexp = regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n } else {\n // Anchor regexp:\n regexp = '^' + regexp + '$';\n }\n return new RegExp(regexp, flags);\n }\n },\n\n parseRequirement: function(requirementType, string) {\n var converter = this.parse[requirementType || 'string'];\n if (!converter)\n throw 'Unknown requirement specification: \"' + requirementType + '\"';\n let converted = converter(string);\n if (converted === null)\n throw `Requirement is not a ${requirementType}: \"${string}\"`;\n return converted;\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })(),\n\n _SubmitSelector: 'input[type=\"submit\"], button:submit'\n };\n\n var Utils__default = Utils__Utils;\n\n // All these options could be overriden and specified directly in DOM using\n // `data-parsley-` default DOM-API\n // eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n // eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n\n var Defaults = {\n // ### General\n\n // Default data-namespace for DOM API\n namespace: 'data-parsley-',\n\n // Supported inputs by default\n inputs: 'input, textarea, select',\n\n // Excluded inputs by default\n excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n\n // Stop validating field on highest priority failing constraint\n priorityEnabled: true,\n\n // ### Field only\n\n // identifier used to group together inputs (e.g. radio buttons...)\n multiple: null,\n\n // identifier (or array of identifiers) used to validate only a select group of inputs\n group: null,\n\n // ### UI\n // Enable\\Disable error messages\n uiEnabled: true,\n\n // Key events threshold before validation\n validationThreshold: 3,\n\n // Focused field on form validation error. 'first'|'last'|'none'\n focus: 'first',\n\n // event(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (Field) {},\n\n // Return the `$element` where errors will be appended\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n errorsContainer: function (Field) {},\n\n // ul elem that would receive errors' list\n errorsWrapper: '<ul class=\"parsley-errors-list\"></ul>',\n\n // li elem that would receive error message\n errorTemplate: '<li></li>'\n };\n\n var Base = function () {\n this.__id__ = Utils__default.generateID();\n };\n\n Base.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n Utils__default.attr(this.$element, this.options.namespace, this.domOptions);\n if (this.parent && this.parent.actualizeOptions)\n this.parent.actualizeOptions();\n return this;\n },\n\n _resetOptions: function (initOptions) {\n this.domOptions = Utils__default.objectCreate(this.parent.options);\n this.options = Utils__default.objectCreate(this.domOptions);\n // Shallow copy of ownProperties of initOptions:\n for (var i in initOptions) {\n if (initOptions.hasOwnProperty(i))\n this.options[i] = initOptions[i];\n }\n this.actualizeOptions();\n },\n\n _listeners: null,\n\n // Register a callback for the given event name\n // Callback is called with context as the first argument and the `this`\n // The context is the current parsley instance, or window.Parsley if global\n // A return value of `false` will interrupt the calls\n on: function (name, fn) {\n this._listeners = this._listeners || {};\n var queue = this._listeners[name] = this._listeners[name] || [];\n queue.push(fn);\n\n return this;\n },\n\n // Deprecated. Use `on` instead\n subscribe: function(name, fn) {\n $.listenTo(this, name.toLowerCase(), fn);\n },\n\n // Unregister a callback (or all if none is given) for the given event name\n off: function (name, fn) {\n var queue = this._listeners && this._listeners[name];\n if (queue) {\n if (!fn) {\n delete this._listeners[name];\n } else {\n for (var i = queue.length; i--; )\n if (queue[i] === fn)\n queue.splice(i, 1);\n }\n }\n return this;\n },\n\n // Deprecated. Use `off`\n unsubscribe: function(name, fn) {\n $.unsubscribeTo(this, name.toLowerCase());\n },\n\n // Trigger an event of the given name\n // A return value of `false` interrupts the callback chain\n // Returns false if execution was interrupted\n trigger: function (name, target, extraArg) {\n target = target || this;\n var queue = this._listeners && this._listeners[name];\n var result;\n var parentResult;\n if (queue) {\n for (var i = queue.length; i--; ) {\n result = queue[i].call(target, target, extraArg);\n if (result === false) return result;\n }\n }\n if (this.parent) {\n return this.parent.trigger(name, target, extraArg);\n }\n return true;\n },\n\n asyncIsValid: function (group, force) {\n Utils__default.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n this.parent.$element.find(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`)\n : this.$element;\n }\n };\n\n var convertArrayRequirement = function(string, length) {\n var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n if (!m)\n throw 'Requirement is not an array: \"' + string + '\"';\n var values = m[1].split(',').map(Utils__default.trimString);\n if (values.length !== length)\n throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n return values;\n };\n\n var convertExtraOptionRequirement = function(requirementSpec, string, extraOptionReader) {\n var main = null;\n var extra = {};\n for (var key in requirementSpec) {\n if (key) {\n var value = extraOptionReader(key);\n if ('string' === typeof value)\n value = Utils__default.parseRequirement(requirementSpec[key], value);\n extra[key] = value;\n } else {\n main = Utils__default.parseRequirement(requirementSpec[key], string);\n }\n }\n return [main, extra];\n };\n\n // A Validator needs to implement the methods `validate` and `parseRequirements`\n\n var Validator = function(spec) {\n $.extend(true, this, spec);\n };\n\n Validator.prototype = {\n // Returns `true` iff the given `value` is valid according the given requirements.\n validate: function(value, requirementFirstArg) {\n if (this.fn) { // Legacy style validator\n\n if (arguments.length > 3) // If more args then value, requirement, instance...\n requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest\n return this.fn(value, requirementFirstArg);\n }\n\n if ($.isArray(value)) {\n if (!this.validateMultiple)\n throw 'Validator `' + this.name + '` does not handle multiple values';\n return this.validateMultiple(...arguments);\n } else {\n let instance = arguments[arguments.length - 1];\n if (this.validateDate && instance._isDateInput()) {\n arguments[0] = Utils__default.parse.date(arguments[0]);\n if (arguments[0] === null)\n return false;\n return this.validateDate(...arguments);\n }\n if (this.validateNumber) {\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return $.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if ($.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = Utils__default.parseRequirement(type[i], values[i]);\n return values;\n } else if ($.isPlainObject(type)) {\n return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n } else {\n return [Utils__default.parseRequirement(type, requirements)];\n }\n },\n // Defaults:\n requirementType: 'string',\n\n priority: 2\n\n };\n\n var ValidatorRegistry = function (validators, catalog) {\n this.__class__ = 'ValidatorRegistry';\n\n // Default Parsley locale is en\n this.locale = 'en';\n\n this.init(validators || {}, catalog || {});\n };\n\n var typeTesters = {\n email: /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n date: {\n test: value => Utils__default.parse.date(value) !== null\n },\n\n url: new RegExp(\n \"^\" +\n // protocol identifier\n \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\" +\n // IP address exclusion\n // private & local networks\n // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" + // ** mod: allow local networks\n // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n \"|\" +\n // host name\n \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\" +\n // domain name\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\" +\n // TLD identifier\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\" +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:/\\\\S*)?\" +\n \"$\", 'i'\n )\n };\n typeTesters.range = typeTesters.number;\n\n // See http://stackoverflow.com/a/10454560/8279\n var decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n };\n\n // parseArguments('number', ['1', '2']) => [1, 2]\n let ValidatorRegistry__parseArguments = (type, args) => args.map(Utils__default.parse[type]);\n // operatorToValidator returns a validating function for an operator function, applied to the given type\n let ValidatorRegistry__operatorToValidator = (type, operator) => {\n return (value, ...requirementsAndInput) => {\n requirementsAndInput.pop(); // Get rid of `input` argument\n return operator(value, ...ValidatorRegistry__parseArguments(type, requirementsAndInput));\n };\n };\n\n let ValidatorRegistry__comparisonOperator = operator => ({\n validateDate: ValidatorRegistry__operatorToValidator('date', operator),\n validateNumber: ValidatorRegistry__operatorToValidator('number', operator),\n requirementType: operator.length <= 2 ? 'string' : ['string', 'string'], // Support operators with a 1 or 2 requirement(s)\n priority: 30\n });\n\n ValidatorRegistry.prototype = {\n init: function (validators, catalog) {\n this.catalog = catalog;\n // Copy prototype's validators:\n this.validators = $.extend({}, this.validators);\n\n for (var name in validators)\n this.addValidator(name, validators[name].fn, validators[name].priority);\n\n window.Parsley.trigger('parsley:validator:init');\n },\n\n // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n setLocale: function (locale) {\n if ('undefined' === typeof this.catalog[locale])\n throw new Error(locale + ' is not available in the catalog');\n\n this.locale = locale;\n\n return this;\n },\n\n // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n addCatalog: function (locale, messages, set) {\n if ('object' === typeof messages)\n this.catalog[locale] = messages;\n\n if (true === set)\n return this.setLocale(locale);\n\n return this;\n },\n\n // Add a specific message for a given constraint in a given locale\n addMessage: function (locale, name, message) {\n if ('undefined' === typeof this.catalog[locale])\n this.catalog[locale] = {};\n\n this.catalog[locale][name] = message;\n\n return this;\n },\n\n // Add messages for a given locale\n addMessages: function (locale, nameMessageObject) {\n for (var name in nameMessageObject)\n this.addMessage(locale, name, nameMessageObject[name]);\n\n return this;\n },\n\n // Add a new validator\n //\n // addValidator('custom', {\n // requirementType: ['integer', 'integer'],\n // validateString: function(value, from, to) {},\n // priority: 22,\n // messages: {\n // en: \"Hey, that's no good\",\n // fr: \"Aye aye, pas bon du tout\",\n // }\n // })\n //\n // Old API was addValidator(name, function, priority)\n //\n addValidator: function (name, arg1, arg2) {\n if (this.validators[name])\n Utils__default.warn('Validator \"' + name + '\" is already defined.');\n else if (Defaults.hasOwnProperty(name)) {\n Utils__default.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n return;\n }\n return this._setValidator(...arguments);\n },\n\n updateValidator: function (name, arg1, arg2) {\n if (!this.validators[name]) {\n Utils__default.warn('Validator \"' + name + '\" is not already defined.');\n return this.addValidator(...arguments);\n }\n return this._setValidator(...arguments);\n },\n\n removeValidator: function (name) {\n if (!this.validators[name])\n Utils__default.warn('Validator \"' + name + '\" is not defined.');\n\n delete this.validators[name];\n\n return this;\n },\n\n _setValidator: function (name, validator, priority) {\n if ('object' !== typeof validator) {\n // Old style validator, with `fn` and `priority`\n validator = {\n fn: validator,\n priority: priority\n };\n }\n if (!validator.validate) {\n validator = new Validator(validator);\n }\n this.validators[name] = validator;\n\n for (var locale in validator.messages || {})\n this.addMessage(locale, name, validator.messages[locale]);\n\n return this;\n },\n\n getErrorMessage: function (constraint) {\n var message;\n\n // Type constraints are a bit different, we have to match their requirements too to find right error message\n if ('type' === constraint.name) {\n var typeMessages = this.catalog[this.locale][constraint.name] || {};\n message = typeMessages[constraint.requirements];\n } else\n message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n },\n\n // Kind of light `sprintf()` implementation\n formatMessage: function (string, parameters) {\n if ('object' === typeof parameters) {\n for (var i in parameters)\n string = this.formatMessage(string, parameters[i]);\n\n return string;\n }\n\n return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = 'any', base = 0} = {}) {\n var tester = typeTesters[type];\n if (!tester) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!tester.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: ValidatorRegistry__comparisonOperator((value, requirement) => value >= requirement),\n max: ValidatorRegistry__comparisonOperator((value, requirement) => value <= requirement),\n range: ValidatorRegistry__comparisonOperator((value, min, max) => value >= min && value <= max),\n equalto: {\n validateString: function (value, refOrValue) {\n var $reference = $(refOrValue);\n if ($reference.length)\n return value === $reference.val();\n else\n return value === refOrValue;\n },\n priority: 256\n }\n }\n };\n\n var UI = {};\n\n var diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n };\n\n UI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', Utils__default._SubmitSelector, evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.$element.attr('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n };\n\n UI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = this.options.classHandler.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n\n return this._inputHolder();\n },\n\n _inputHolder: function() {\n // if simple element (input, texatrea, select...) it will perfectly host the classes and precede the error container\n if (!this.options.multiple || this.$element.is('select'))\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof this.options.errorsContainer) {\n if ($(this.options.errorsContainer).length)\n return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);\n else\n Utils__default.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof this.options.errorsContainer)\n $errorsContainer = this.options.errorsContainer.call(this, this);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n return this._inputHolder().after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(Utils__default.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this._validateIfNeeded();\n });\n else if (trigger = Utils__default.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._validateIfNeeded(event);\n });\n }\n },\n\n _validateIfNeeded: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (event && /key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n if (this.options.debounce) {\n window.clearTimeout(this._debounced);\n this._debounced = window.setTimeout(() => this.validate(), this.options.debounce);\n } else\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n };\n\n var Form = function (element, domOptions, options) {\n this.__class__ = 'Form';\n\n this.$element = $(element);\n this.domOptions = domOptions;\n this.options = options;\n this.parent = window.Parsley;\n\n this.fields = [];\n this.validationResult = null;\n };\n\n var Form__statusMapping = {pending: null, resolved: true, rejected: false};\n\n Form.prototype = {\n onSubmitValidate: function (event) {\n // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var $submitSource = this._$submitSource || this.$element.find(Utils__default._SubmitSelector).first();\n this._$submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if ($submitSource.is('[formnovalidate]'))\n return;\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit($submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._$submitSource = $(event.currentTarget);\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function ($submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if ($submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('<input class=\"parsley-synthetic-submit-button\" type=\"hidden\">').appendTo(this.$element);\n $synthetic.attr({\n name: $submitSource.attr('name'),\n value: $submitSource.attr('value')\n });\n }\n\n this.$element.trigger($.extend($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils__default.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return Form__statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = $.extend({}, event, {preventDefault: () => {\n Utils__default.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return Utils__default.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils__default.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return Form__statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return Utils__default.all(promises);\n },\n\n // Reset UI\n reset: function () {\n // Form case: emit a reset event for each field\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n\n // Form case: destroy all its fields and then destroy stored instance\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].destroy();\n\n this.$element.removeData('Parsley');\n this._trigger('destroy');\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `Field` and `FieldMultiple` children\n if (('Field' === fieldInstance.__class__ || 'FieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded)) {\n let uniqueId = fieldInstance.__class__ + '-' + fieldInstance.__id__;\n if ('undefined' === typeof this.fieldsMappedById[uniqueId]) {\n this.fieldsMappedById[uniqueId] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n }\n });\n\n $.each(Utils__default.difference(oldFields, this.fields), (_, field) => {\n field.reset();\n });\n });\n return this;\n },\n\n // Internal only.\n // Looping on a form's fields to do validation or similar\n // will trigger reactualizing options on all of them, which\n // in turn will reactualize the form's options.\n // To avoid calling actualizeOptions so many times on the form\n // for nothing, _withoutReactualizingFormOptions temporarily disables\n // the method actualizeOptions on this form while `fn` is called.\n _withoutReactualizingFormOptions: function (fn) {\n var oldActualizeOptions = this.actualizeOptions;\n this.actualizeOptions = function () { return this; };\n var result = fn();\n this.actualizeOptions = oldActualizeOptions;\n return result;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n // Returns true iff event is not interrupted and default not prevented.\n _trigger: function (eventName) {\n return this.trigger('form:' + eventName);\n }\n\n };\n\n var Constraint = function (parsleyField, name, requirements, priority, isDomConstraint) {\n var validatorSpec = window.Parsley._validatorRegistry.validators[name];\n var validator = new Validator(validatorSpec);\n\n $.extend(this, {\n validator: validator,\n name: name,\n requirements: requirements,\n priority: priority || parsleyField.options[name + 'Priority'] || validator.priority,\n isDomConstraint: true === isDomConstraint\n });\n this._parseRequirements(parsleyField.options);\n };\n\n var capitalize = function(str) {\n var cap = str[0].toUpperCase();\n return cap + str.slice(1);\n };\n\n Constraint.prototype = {\n validate: function(value, instance) {\n return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n };\n\n var Field = function (field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'Field';\n\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n };\n\n var parsley_field__statusMapping = {pending: null, resolved: true, rejected: false};\n\n Field.prototype = {\n // # Public API\n // Validate field and trigger some events for mainly `UI`\n // @returns `true`, an array of the validators that failed, or\n // `null` if validation is not finished. Prefer using whenValidate\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils__default.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `UI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refreshConstraints();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if ($.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils__default.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return parsley_field__statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refreshConstraints();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = Utils__default.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return Utils__default.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return Utils__default.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // Reset UI\n reset: function () {\n this._resetUI();\n return this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n this.$element.removeData('Parsley');\n this.$element.removeData('FieldMultiple');\n this._trigger('destroy');\n },\n\n // Actualize options that could have change since previous validation\n // Re-bind accordingly constraints (could be some new, removed or updated)\n refreshConstraints: function () {\n return this.actualizeOptions()._bindConstraints();\n },\n\n /**\n * Add a new constraint to a field\n *\n * @param {String} name\n * @param {Mixed} requirements optional\n * @param {Number} priority optional\n * @param {Boolean} isDomConstraint optional\n */\n addConstraint: function (name, requirements, priority, isDomConstraint) {\n\n if (window.Parsley._validatorRegistry.validators[name]) {\n var constraint = new Constraint(this, name, requirements, priority, isDomConstraint);\n\n // if constraint already exist, delete it and push new version\n if ('undefined' !== this.constraintsByName[constraint.name])\n this.removeConstraint(constraint.name);\n\n this.constraints.push(constraint);\n this.constraintsByName[constraint.name] = constraint;\n }\n\n return this;\n },\n\n // Remove a constraint\n removeConstraint: function (name) {\n for (var i = 0; i < this.constraints.length; i++)\n if (name === this.constraints[i].name) {\n this.constraints.splice(i, 1);\n break;\n }\n delete this.constraintsByName[name];\n return this;\n },\n\n // Update a constraint (Remove + re-add)\n updateConstraint: function (name, parameters, priority) {\n return this.removeConstraint(name)\n .addConstraint(name, parameters, priority);\n },\n\n // # Internals\n\n // Internal only.\n // Bind constraints from config + options + DOM\n _bindConstraints: function () {\n var constraints = [];\n var constraintsByName = {};\n\n // clean all existing DOM constraints to only keep javascript user constraints\n for (var i = 0; i < this.constraints.length; i++)\n if (false === this.constraints[i].isDomConstraint) {\n constraints.push(this.constraints[i]);\n constraintsByName[this.constraints[i].name] = this.constraints[i];\n }\n\n this.constraints = constraints;\n this.constraintsByName = constraintsByName;\n\n // then re-add Parsley DOM-API constraints\n for (var name in this.options)\n this.addConstraint(name, this.options[name], undefined, true);\n\n // finally, bind special HTML5 constraints\n return this._bindHtml5Constraints();\n },\n\n // Internal only.\n // Bind specific HTML5 constraints to be HTML5 compliant\n _bindHtml5Constraints: function () {\n // html5 required\n if (this.$element.attr('required'))\n this.addConstraint('required', true, undefined, true);\n\n // html5 pattern\n if ('string' === typeof this.$element.attr('pattern'))\n this.addConstraint('pattern', this.$element.attr('pattern'), undefined, true);\n\n // range\n if ('undefined' !== typeof this.$element.attr('min') && 'undefined' !== typeof this.$element.attr('max'))\n this.addConstraint('range', [this.$element.attr('min'), this.$element.attr('max')], undefined, true);\n\n // HTML5 min\n else if ('undefined' !== typeof this.$element.attr('min'))\n this.addConstraint('min', this.$element.attr('min'), undefined, true);\n\n // HTML5 max\n else if ('undefined' !== typeof this.$element.attr('max'))\n this.addConstraint('max', this.$element.attr('max'), undefined, true);\n\n\n // length\n if ('undefined' !== typeof this.$element.attr('minlength') && 'undefined' !== typeof this.$element.attr('maxlength'))\n this.addConstraint('length', [this.$element.attr('minlength'), this.$element.attr('maxlength')], undefined, true);\n\n // HTML5 minlength\n else if ('undefined' !== typeof this.$element.attr('minlength'))\n this.addConstraint('minlength', this.$element.attr('minlength'), undefined, true);\n\n // HTML5 maxlength\n else if ('undefined' !== typeof this.$element.attr('maxlength'))\n this.addConstraint('maxlength', this.$element.attr('maxlength'), undefined, true);\n\n\n // html5 types\n var type = this.$element.attr('type');\n\n if ('undefined' === typeof type)\n return this;\n\n // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n if ('number' === type) {\n return this.addConstraint('type', ['number', {\n step: this.$element.attr('step') || '1',\n base: this.$element.attr('min') || this.$element.attr('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range|date)$/i.test(type)) {\n return this.addConstraint('type', type, undefined, true);\n }\n return this;\n },\n\n // Internal only.\n // Field is required if have required constraint without `false` value\n _isRequired: function () {\n if ('undefined' === typeof this.constraintsByName.required)\n return false;\n\n return false !== this.constraintsByName.required.requirements;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n _trigger: function (eventName) {\n return this.trigger('field:' + eventName);\n },\n\n // Internal only\n // Handles whitespace in a value\n // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n _handleWhitespace: function (value) {\n if (true === this.options.trimValue)\n Utils__default.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n if ('squish' === this.options.whitespace)\n value = value.replace(/\\s{2,}/g, ' ');\n\n if (('trim' === this.options.whitespace) || ('squish' === this.options.whitespace) || (true === this.options.trimValue))\n value = Utils__default.trimString(value);\n\n return value;\n },\n\n _isDateInput: function() {\n var c = this.constraintsByName.type;\n return c && c.requirements === 'date';\n },\n\n // Internal only.\n // Returns the constraints, grouped by descending priority.\n // The result is thus an array of arrays of constraints.\n _getGroupedConstraints: function () {\n if (false === this.options.priorityEnabled)\n return [this.constraints];\n\n var groupedConstraints = [];\n var index = {};\n\n // Create array unique of priorities\n for (var i = 0; i < this.constraints.length; i++) {\n var p = this.constraints[i].priority;\n if (!index[p])\n groupedConstraints.push(index[p] = []);\n index[p].push(this.constraints[i]);\n }\n // Sort them by priority DESC\n groupedConstraints.sort(function (a, b) { return b[0].priority - a[0].priority; });\n\n return groupedConstraints;\n }\n\n };\n\n var parsley_field = Field;\n\n var Multiple = function () {\n this.__class__ = 'FieldMultiple';\n };\n\n Multiple.prototype = {\n // Add new `$element` sibling for multiple field\n addElement: function ($element) {\n this.$elements.push($element);\n\n return this;\n },\n\n // See `Field.refreshConstraints()`\n refreshConstraints: function () {\n var fieldConstraints;\n\n this.constraints = [];\n\n // Select multiple special treatment\n if (this.$element.is('select')) {\n this.actualizeOptions()._bindConstraints();\n\n return this;\n }\n\n // Gather all constraints for each input in the multiple group\n for (var i = 0; i < this.$elements.length; i++) {\n\n // Check if element have not been dynamically removed since last binding\n if (!$('html').has(this.$elements[i]).length) {\n this.$elements.splice(i, 1);\n continue;\n }\n\n fieldConstraints = this.$elements[i].data('FieldMultiple').refreshConstraints().constraints;\n\n for (var j = 0; j < fieldConstraints.length; j++)\n this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n }\n\n return this;\n },\n\n // See `Field.getValue()`\n getValue: function () {\n // Value could be overriden in DOM\n if ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.$element.is('input[type=radio]'))\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n\n // Select multiple case\n if (this.$element.is('select') && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n };\n\n var Factory = function (element, options, parsleyFormInstance) {\n this.$element = $(element);\n\n // If the element has already been bound, returns its saved Parsley instance\n var savedparsleyFormInstance = this.$element.data('Parsley');\n if (savedparsleyFormInstance) {\n\n // If the saved instance has been bound without a Form parent and there is one given in this call, add it\n if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n savedparsleyFormInstance.parent = parsleyFormInstance;\n savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n }\n\n if ('object' === typeof options) {\n $.extend(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && 'Form' !== parsleyFormInstance.__class__)\n throw new Error('Parent instance must be a Form instance');\n\n this.parent = parsleyFormInstance || window.Parsley;\n return this.init(options);\n };\n\n Factory.prototype = {\n init: function (options) {\n this.__class__ = 'Parsley';\n this.__version__ = '2.7.0';\n this.__id__ = Utils__default.generateID();\n\n // Pre-compute options\n this._resetOptions(options);\n\n // A Form instance is obviously a `<form>` element but also every node that is not an input and has the `data-parsley-validate` attribute\n if (this.$element.is('form') || (Utils__default.checkAttr(this.$element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)))\n return this.bind('parsleyForm');\n\n // Every other element is bound as a `Field` or `FieldMultiple`\n return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n },\n\n isMultiple: function () {\n return (this.$element.is('input[type=radio], input[type=checkbox]')) || (this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple'));\n },\n\n // Multiples fields are a real nightmare :(\n // Maybe some refactoring would be appreciated here...\n handleMultiple: function () {\n var name;\n var multiple;\n var parsleyMultipleInstance;\n\n // Handle multiple name\n if (this.options.multiple)\n ; // We already have our 'multiple' identifier\n else if ('undefined' !== typeof this.$element.attr('name') && this.$element.attr('name').length)\n this.options.multiple = name = this.$element.attr('name');\n else if ('undefined' !== typeof this.$element.attr('id') && this.$element.attr('id').length)\n this.options.multiple = this.$element.attr('id');\n\n // Special select multiple input\n if (this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple')) {\n this.options.multiple = this.options.multiple || this.__id__;\n return this.bind('parsleyFieldMultiple');\n\n // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n } else if (!this.options.multiple) {\n Utils__default.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n return this;\n }\n\n // Remove special chars\n this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, '');\n\n // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n if ('undefined' !== typeof name) {\n $('input[name=\"' + name + '\"]').each((i, input) => {\n if ($(input).is('input[type=radio], input[type=checkbox]'))\n $(input).attr(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('FieldMultiple')) {\n parsleyMultipleInstance.addElement(this.$element);\n }\n\n break;\n }\n }\n\n // Create a secret Field instance for every multiple field. It will be stored in `data('FieldMultiple')`\n // And will be useful later to access classic `Field` stuff while being in a `FieldMultiple` instance\n this.bind('parsleyField', true);\n\n return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n },\n\n // Return proper `Form`, `Field` or `FieldMultiple`\n bind: function (type, doNotStore) {\n var parsleyInstance;\n\n switch (type) {\n case 'parsleyForm':\n parsleyInstance = $.extend(\n new Form(this.$element, this.domOptions, this.options),\n new Base(),\n window.ParsleyExtend\n )._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(\n new parsley_field(this.$element, this.domOptions, this.options, this.parent),\n new Base(),\n window.ParsleyExtend\n );\n break;\n case 'parsleyFieldMultiple':\n parsleyInstance = $.extend(\n new parsley_field(this.$element, this.domOptions, this.options, this.parent),\n new Multiple(),\n new Base(),\n window.ParsleyExtend\n )._init();\n break;\n default:\n throw new Error(type + 'is not a supported Parsley type');\n }\n\n if (this.options.multiple)\n Utils__default.setAttr(this.$element, this.options.namespace, 'multiple', this.options.multiple);\n\n if ('undefined' !== typeof doNotStore) {\n this.$element.data('FieldMultiple', parsleyInstance);\n\n return parsleyInstance;\n }\n\n // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n this.$element.data('Parsley', parsleyInstance);\n\n // Tell the world we have a new Form or Field instance!\n parsleyInstance._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n };\n\n var vernums = $.fn.jquery.split('.');\n if (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n }\n if (!vernums.forEach) {\n Utils__default.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n }\n // Inherit `on`, `off` & `trigger` to Parsley:\n var Parsley = $.extend(new Base(), {\n $element: $(document),\n actualizeOptions: null,\n _resetOptions: null,\n Factory: Factory,\n version: '2.7.0'\n });\n\n // Supplement Field and Form with Base\n // This way, the constructors will have access to those methods\n $.extend(parsley_field.prototype, UI.Field, Base.prototype);\n $.extend(Form.prototype, UI.Form, Base.prototype);\n // Inherit actualizeOptions and _resetOptions:\n $.extend(Factory.prototype, Base.prototype);\n\n // ### jQuery API\n // `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n $.fn.parsley = $.fn.psly = function (options) {\n if (this.length > 1) {\n var instances = [];\n\n this.each(function () {\n instances.push($(this).parsley(options));\n });\n\n return instances;\n }\n\n // Return undefined if applied to non existing DOM element\n if (!$(this).length) {\n Utils__default.warn('You must bind Parsley on an existing element.');\n\n return;\n }\n\n return new Factory(this, options);\n };\n\n // ### Field and Form extension\n // Ensure the extension is now defined if it wasn't previously\n if ('undefined' === typeof window.ParsleyExtend)\n window.ParsleyExtend = {};\n\n // ### Parsley config\n // Inherit from ParsleyDefault, and copy over any existing values\n Parsley.options = $.extend(Utils__default.objectCreate(Defaults), window.ParsleyConfig);\n window.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n // ### Globals\n window.Parsley = window.psly = Parsley;\n Parsley.Utils = Utils__default;\n window.ParsleyUtils = {};\n $.each(Utils__default, (key, value) => {\n if ('function' === typeof value) {\n window.ParsleyUtils[key] = (...args) => {\n Utils__default.warnOnce('Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.');\n return Utils__default[key](...args);\n };\n }\n });\n\n // ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\n var registry = window.Parsley._validatorRegistry = new ValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\n window.ParsleyValidator = {};\n $.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator'.split(' '), function (i, method) {\n window.Parsley[method] = $.proxy(registry, method);\n window.ParsleyValidator[method] = function () {\n Utils__default.warnOnce(`Accessing the method '${method}' through Validator is deprecated. Simply call 'window.Parsley.${method}(...)'`);\n return window.Parsley[method](...arguments);\n };\n });\n\n // ### UI\n // Deprecated global object\n window.Parsley.UI = UI;\n window.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils__default.warnOnce(`Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n Utils__default.warnOnce(`Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n };\n $.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils__default.warnOnce(`Accessing UI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n });\n\n // ### PARSLEY auto-binding\n // Prevent it by setting `ParsleyConfig.autoBind` to `false`\n if (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n }\n\n var o = $({});\n var deprecated = function () {\n Utils__default.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n };\n\n // Returns an event handler that calls `fn` with the arguments it expects\n function adapt(fn, context) {\n // Store to allow unbinding\n if (!fn.parsleyAdaptedCallback) {\n fn.parsleyAdaptedCallback = function () {\n var args = Array.prototype.slice.call(arguments, 0);\n args.unshift(this);\n fn.apply(context || o, args);\n };\n }\n return fn.parsleyAdaptedCallback;\n }\n\n var eventPrefix = 'parsley:';\n // Converts 'parsley:form:validate' into 'form:validate'\n function eventName(name) {\n if (name.lastIndexOf(eventPrefix, 0) === 0)\n return name.substr(eventPrefix.length);\n return name;\n }\n\n // $.listen is deprecated. Use Parsley.on instead.\n $.listen = function (name, callback) {\n var context;\n deprecated();\n if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n context = arguments[1];\n callback = arguments[2];\n }\n\n if ('function' !== typeof callback)\n throw new Error('Wrong parameters');\n\n window.Parsley.on(eventName(name), adapt(callback, context));\n };\n\n $.listenTo = function (instance, name, fn) {\n deprecated();\n if (!(instance instanceof parsley_field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong parameters');\n\n instance.on(eventName(name), adapt(fn));\n };\n\n $.unsubscribe = function (name, fn) {\n deprecated();\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong arguments');\n window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n };\n\n $.unsubscribeTo = function (instance, name) {\n deprecated();\n if (!(instance instanceof parsley_field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n instance.off(eventName(name));\n };\n\n $.unsubscribeAll = function (name) {\n deprecated();\n window.Parsley.off(eventName(name));\n $('form,input,textarea,select').each(function () {\n var instance = $(this).data('Parsley');\n if (instance) {\n instance.off(eventName(name));\n }\n });\n };\n\n // $.emit is deprecated. Use jQuery events instead.\n $.emit = function (name, instance) {\n deprecated();\n var instanceGiven = (instance instanceof parsley_field) || (instance instanceof Form);\n var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n args.unshift(eventName(name));\n if (!instanceGiven) {\n instance = window.Parsley;\n }\n instance.trigger(...args);\n };\n\n var pubsub = {};\n\n $.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n });\n\n Parsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n });\n\n Parsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n });\n\n window.ParsleyExtend.addAsyncValidator = function () {\n Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n };\n\n // This is included with the Parsley library itself,\n // thus there is no use in adding it to your project.\n Parsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n });\n\n Parsley.setLocale('en');\n\n /**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune <github@marc-andre.ca>\n * @license MIT\n */\n\n function InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n $.extend(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n };\n\n var inputevent = new InputEvent();\n\n inputevent.install();\n\n var parsley = Parsley;\n\n return parsley;\n\n}));\n","import $ from 'jquery';\nimport Field from './field';\nimport Form from './form';\nimport Utils from './utils';\n\nvar o = $({});\nvar deprecated = function () {\n Utils.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n};\n\n// Returns an event handler that calls `fn` with the arguments it expects\nfunction adapt(fn, context) {\n // Store to allow unbinding\n if (!fn.parsleyAdaptedCallback) {\n fn.parsleyAdaptedCallback = function () {\n var args = Array.prototype.slice.call(arguments, 0);\n args.unshift(this);\n fn.apply(context || o, args);\n };\n }\n return fn.parsleyAdaptedCallback;\n}\n\nvar eventPrefix = 'parsley:';\n// Converts 'parsley:form:validate' into 'form:validate'\nfunction eventName(name) {\n if (name.lastIndexOf(eventPrefix, 0) === 0)\n return name.substr(eventPrefix.length);\n return name;\n}\n\n// $.listen is deprecated. Use Parsley.on instead.\n$.listen = function (name, callback) {\n var context;\n deprecated();\n if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n context = arguments[1];\n callback = arguments[2];\n }\n\n if ('function' !== typeof callback)\n throw new Error('Wrong parameters');\n\n window.Parsley.on(eventName(name), adapt(callback, context));\n};\n\n$.listenTo = function (instance, name, fn) {\n deprecated();\n if (!(instance instanceof Field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong parameters');\n\n instance.on(eventName(name), adapt(fn));\n};\n\n$.unsubscribe = function (name, fn) {\n deprecated();\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong arguments');\n window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n};\n\n$.unsubscribeTo = function (instance, name) {\n deprecated();\n if (!(instance instanceof Field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n instance.off(eventName(name));\n};\n\n$.unsubscribeAll = function (name) {\n deprecated();\n window.Parsley.off(eventName(name));\n $('form,input,textarea,select').each(function () {\n var instance = $(this).data('Parsley');\n if (instance) {\n instance.off(eventName(name));\n }\n });\n};\n\n// $.emit is deprecated. Use jQuery events instead.\n$.emit = function (name, instance) {\n deprecated();\n var instanceGiven = (instance instanceof Field) || (instance instanceof Form);\n var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n args.unshift(eventName(name));\n if (!instanceGiven) {\n instance = window.Parsley;\n }\n instance.trigger(...args);\n};\n\nexport default {};\n","/**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune <github@marc-andre.ca>\n * @license MIT\n */\n\nimport $ from 'jquery';\n\nfunction InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n $.extend(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n};\n\nexport default new InputEvent();\n","import $ from 'jquery';\n\nvar globalID = 1;\nvar pastWarnings = {};\n\nvar Utils = {\n // Parsley DOM-API\n // returns object from dom attributes and values\n attr: function ($element, namespace, obj) {\n var i;\n var attribute;\n var attributes;\n var regex = new RegExp('^' + namespace, 'i');\n\n if ('undefined' === typeof obj)\n obj = {};\n else {\n // Clear all own properties. This won't affect prototype's values\n for (i in obj) {\n if (obj.hasOwnProperty(i))\n delete obj[i];\n }\n }\n\n if ('undefined' === typeof $element || 'undefined' === typeof $element[0])\n return obj;\n\n attributes = $element[0].attributes;\n for (i = attributes.length; i--; ) {\n attribute = attributes[i];\n\n if (attribute && attribute.specified && regex.test(attribute.name)) {\n obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n }\n }\n\n return obj;\n },\n\n checkAttr: function ($element, namespace, checkAttr) {\n return $element.is('[' + namespace + checkAttr + ']');\n },\n\n setAttr: function ($element, namespace, attr, value) {\n $element[0].setAttribute(this.dasherize(namespace + attr), String(value));\n },\n\n generateID: function () {\n return '' + globalID++;\n },\n\n /** Third party functions **/\n // Zepto deserialize function\n deserializeValue: function (value) {\n var num;\n\n try {\n return value ?\n value == \"true\" ||\n (value == \"false\" ? false :\n value == \"null\" ? null :\n !isNaN(num = Number(value)) ? num :\n /^[\\[\\{]/.test(value) ? $.parseJSON(value) :\n value)\n : value;\n } catch (e) { return value; }\n },\n\n // Zepto camelize function\n camelize: function (str) {\n return str.replace(/-+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n });\n },\n\n // Zepto dasherize function\n dasherize: function (str) {\n return str.replace(/::/g, '/')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n .replace(/_/g, '-')\n .toLowerCase();\n },\n\n warn: function () {\n if (window.console && 'function' === typeof window.console.warn)\n window.console.warn(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n parse: {\n date: function(string) {\n let parsed = string.match(/^(\\d{4,})-(\\d\\d)-(\\d\\d)$/);\n if (!parsed)\n return null;\n let [_, year, month, day] = parsed.map(x => parseInt(x, 10));\n let date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day)\n return null;\n return date;\n },\n string: function(string) {\n return string;\n },\n integer: function(string) {\n if (isNaN(string))\n return null;\n return parseInt(string, 10);\n },\n number: function(string) {\n if (isNaN(string))\n throw null;\n return parseFloat(string);\n },\n 'boolean': function _boolean(string) {\n return !(/^\\s*false\\s*$/i.test(string));\n },\n object: function(string) {\n return Utils.deserializeValue(string);\n },\n regexp: function(regexp) {\n var flags = '';\n\n // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n if (/^\\/.*\\/(?:[gimy]*)$/.test(regexp)) {\n // Replace the regexp literal string with the first match group: ([gimy]*)\n // If no flag is present, this will be a blank string\n flags = regexp.replace(/.*\\/([gimy]*)$/, '$1');\n // Again, replace the regexp literal string with the first match group:\n // everything excluding the opening and closing slashes and the flags\n regexp = regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n } else {\n // Anchor regexp:\n regexp = '^' + regexp + '$';\n }\n return new RegExp(regexp, flags);\n }\n },\n\n parseRequirement: function(requirementType, string) {\n var converter = this.parse[requirementType || 'string'];\n if (!converter)\n throw 'Unknown requirement specification: \"' + requirementType + '\"';\n let converted = converter(string);\n if (converted === null)\n throw `Requirement is not a ${requirementType}: \"${string}\"`;\n return converted;\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })(),\n\n _SubmitSelector: 'input[type=\"submit\"], button:submit'\n};\n\nexport default Utils;\n","// All these options could be overriden and specified directly in DOM using\n// `data-parsley-` default DOM-API\n// eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n// eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n\nvar Defaults = {\n // ### General\n\n // Default data-namespace for DOM API\n namespace: 'data-parsley-',\n\n // Supported inputs by default\n inputs: 'input, textarea, select',\n\n // Excluded inputs by default\n excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n\n // Stop validating field on highest priority failing constraint\n priorityEnabled: true,\n\n // ### Field only\n\n // identifier used to group together inputs (e.g. radio buttons...)\n multiple: null,\n\n // identifier (or array of identifiers) used to validate only a select group of inputs\n group: null,\n\n // ### UI\n // Enable\\Disable error messages\n uiEnabled: true,\n\n // Key events threshold before validation\n validationThreshold: 3,\n\n // Focused field on form validation error. 'first'|'last'|'none'\n focus: 'first',\n\n // event(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (Field) {},\n\n // Return the `$element` where errors will be appended\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n errorsContainer: function (Field) {},\n\n // ul elem that would receive errors' list\n errorsWrapper: '<ul class=\"parsley-errors-list\"></ul>',\n\n // li elem that would receive error message\n errorTemplate: '<li></li>'\n};\n\nexport default Defaults;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar Base = function () {\n this.__id__ = Utils.generateID();\n};\n\nBase.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n Utils.attr(this.$element, this.options.namespace, this.domOptions);\n if (this.parent && this.parent.actualizeOptions)\n this.parent.actualizeOptions();\n return this;\n },\n\n _resetOptions: function (initOptions) {\n this.domOptions = Utils.objectCreate(this.parent.options);\n this.options = Utils.objectCreate(this.domOptions);\n // Shallow copy of ownProperties of initOptions:\n for (var i in initOptions) {\n if (initOptions.hasOwnProperty(i))\n this.options[i] = initOptions[i];\n }\n this.actualizeOptions();\n },\n\n _listeners: null,\n\n // Register a callback for the given event name\n // Callback is called with context as the first argument and the `this`\n // The context is the current parsley instance, or window.Parsley if global\n // A return value of `false` will interrupt the calls\n on: function (name, fn) {\n this._listeners = this._listeners || {};\n var queue = this._listeners[name] = this._listeners[name] || [];\n queue.push(fn);\n\n return this;\n },\n\n // Deprecated. Use `on` instead\n subscribe: function(name, fn) {\n $.listenTo(this, name.toLowerCase(), fn);\n },\n\n // Unregister a callback (or all if none is given) for the given event name\n off: function (name, fn) {\n var queue = this._listeners && this._listeners[name];\n if (queue) {\n if (!fn) {\n delete this._listeners[name];\n } else {\n for (var i = queue.length; i--; )\n if (queue[i] === fn)\n queue.splice(i, 1);\n }\n }\n return this;\n },\n\n // Deprecated. Use `off`\n unsubscribe: function(name, fn) {\n $.unsubscribeTo(this, name.toLowerCase());\n },\n\n // Trigger an event of the given name\n // A return value of `false` interrupts the callback chain\n // Returns false if execution was interrupted\n trigger: function (name, target, extraArg) {\n target = target || this;\n var queue = this._listeners && this._listeners[name];\n var result;\n var parentResult;\n if (queue) {\n for (var i = queue.length; i--; ) {\n result = queue[i].call(target, target, extraArg);\n if (result === false) return result;\n }\n }\n if (this.parent) {\n return this.parent.trigger(name, target, extraArg);\n }\n return true;\n },\n\n asyncIsValid: function (group, force) {\n Utils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n this.parent.$element.find(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`)\n : this.$element;\n }\n};\n\nexport default Base;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar convertArrayRequirement = function(string, length) {\n var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n if (!m)\n throw 'Requirement is not an array: \"' + string + '\"';\n var values = m[1].split(',').map(Utils.trimString);\n if (values.length !== length)\n throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n return values;\n};\n\nvar convertExtraOptionRequirement = function(requirementSpec, string, extraOptionReader) {\n var main = null;\n var extra = {};\n for (var key in requirementSpec) {\n if (key) {\n var value = extraOptionReader(key);\n if ('string' === typeof value)\n value = Utils.parseRequirement(requirementSpec[key], value);\n extra[key] = value;\n } else {\n main = Utils.parseRequirement(requirementSpec[key], string);\n }\n }\n return [main, extra];\n};\n\n// A Validator needs to implement the methods `validate` and `parseRequirements`\n\nvar Validator = function(spec) {\n $.extend(true, this, spec);\n};\n\nValidator.prototype = {\n // Returns `true` iff the given `value` is valid according the given requirements.\n validate: function(value, requirementFirstArg) {\n if (this.fn) { // Legacy style validator\n\n if (arguments.length > 3) // If more args then value, requirement, instance...\n requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest\n return this.fn(value, requirementFirstArg);\n }\n\n if ($.isArray(value)) {\n if (!this.validateMultiple)\n throw 'Validator `' + this.name + '` does not handle multiple values';\n return this.validateMultiple(...arguments);\n } else {\n let instance = arguments[arguments.length - 1];\n if (this.validateDate && instance._isDateInput()) {\n arguments[0] = Utils.parse.date(arguments[0]);\n if (arguments[0] === null)\n return false;\n return this.validateDate(...arguments);\n }\n if (this.validateNumber) {\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return $.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if ($.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = Utils.parseRequirement(type[i], values[i]);\n return values;\n } else if ($.isPlainObject(type)) {\n return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n } else {\n return [Utils.parseRequirement(type, requirements)];\n }\n },\n // Defaults:\n requirementType: 'string',\n\n priority: 2\n\n};\n\nexport default Validator;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Defaults from './defaults';\nimport Validator from './validator';\n\nvar ValidatorRegistry = function (validators, catalog) {\n this.__class__ = 'ValidatorRegistry';\n\n // Default Parsley locale is en\n this.locale = 'en';\n\n this.init(validators || {}, catalog || {});\n};\n\nvar typeTesters = {\n email: /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n date: {\n test: value => Utils.parse.date(value) !== null\n },\n\n url: new RegExp(\n \"^\" +\n // protocol identifier\n \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\" +\n // IP address exclusion\n // private & local networks\n // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" + // ** mod: allow local networks\n // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n \"|\" +\n // host name\n \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\" +\n // domain name\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\" +\n // TLD identifier\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\" +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:/\\\\S*)?\" +\n \"$\", 'i'\n )\n};\ntypeTesters.range = typeTesters.number;\n\n// See http://stackoverflow.com/a/10454560/8279\nvar decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n};\n\n// parseArguments('number', ['1', '2']) => [1, 2]\nlet parseArguments = (type, args) => args.map(Utils.parse[type]);\n// operatorToValidator returns a validating function for an operator function, applied to the given type\nlet operatorToValidator = (type, operator) => {\n return (value, ...requirementsAndInput) => {\n requirementsAndInput.pop(); // Get rid of `input` argument\n return operator(value, ...parseArguments(type, requirementsAndInput));\n };\n};\n\nlet comparisonOperator = operator => ({\n validateDate: operatorToValidator('date', operator),\n validateNumber: operatorToValidator('number', operator),\n requirementType: operator.length <= 2 ? 'string' : ['string', 'string'], // Support operators with a 1 or 2 requirement(s)\n priority: 30\n});\n\nValidatorRegistry.prototype = {\n init: function (validators, catalog) {\n this.catalog = catalog;\n // Copy prototype's validators:\n this.validators = $.extend({}, this.validators);\n\n for (var name in validators)\n this.addValidator(name, validators[name].fn, validators[name].priority);\n\n window.Parsley.trigger('parsley:validator:init');\n },\n\n // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n setLocale: function (locale) {\n if ('undefined' === typeof this.catalog[locale])\n throw new Error(locale + ' is not available in the catalog');\n\n this.locale = locale;\n\n return this;\n },\n\n // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n addCatalog: function (locale, messages, set) {\n if ('object' === typeof messages)\n this.catalog[locale] = messages;\n\n if (true === set)\n return this.setLocale(locale);\n\n return this;\n },\n\n // Add a specific message for a given constraint in a given locale\n addMessage: function (locale, name, message) {\n if ('undefined' === typeof this.catalog[locale])\n this.catalog[locale] = {};\n\n this.catalog[locale][name] = message;\n\n return this;\n },\n\n // Add messages for a given locale\n addMessages: function (locale, nameMessageObject) {\n for (var name in nameMessageObject)\n this.addMessage(locale, name, nameMessageObject[name]);\n\n return this;\n },\n\n // Add a new validator\n //\n // addValidator('custom', {\n // requirementType: ['integer', 'integer'],\n // validateString: function(value, from, to) {},\n // priority: 22,\n // messages: {\n // en: \"Hey, that's no good\",\n // fr: \"Aye aye, pas bon du tout\",\n // }\n // })\n //\n // Old API was addValidator(name, function, priority)\n //\n addValidator: function (name, arg1, arg2) {\n if (this.validators[name])\n Utils.warn('Validator \"' + name + '\" is already defined.');\n else if (Defaults.hasOwnProperty(name)) {\n Utils.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n return;\n }\n return this._setValidator(...arguments);\n },\n\n updateValidator: function (name, arg1, arg2) {\n if (!this.validators[name]) {\n Utils.warn('Validator \"' + name + '\" is not already defined.');\n return this.addValidator(...arguments);\n }\n return this._setValidator(...arguments);\n },\n\n removeValidator: function (name) {\n if (!this.validators[name])\n Utils.warn('Validator \"' + name + '\" is not defined.');\n\n delete this.validators[name];\n\n return this;\n },\n\n _setValidator: function (name, validator, priority) {\n if ('object' !== typeof validator) {\n // Old style validator, with `fn` and `priority`\n validator = {\n fn: validator,\n priority: priority\n };\n }\n if (!validator.validate) {\n validator = new Validator(validator);\n }\n this.validators[name] = validator;\n\n for (var locale in validator.messages || {})\n this.addMessage(locale, name, validator.messages[locale]);\n\n return this;\n },\n\n getErrorMessage: function (constraint) {\n var message;\n\n // Type constraints are a bit different, we have to match their requirements too to find right error message\n if ('type' === constraint.name) {\n var typeMessages = this.catalog[this.locale][constraint.name] || {};\n message = typeMessages[constraint.requirements];\n } else\n message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n },\n\n // Kind of light `sprintf()` implementation\n formatMessage: function (string, parameters) {\n if ('object' === typeof parameters) {\n for (var i in parameters)\n string = this.formatMessage(string, parameters[i]);\n\n return string;\n }\n\n return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = 'any', base = 0} = {}) {\n var tester = typeTesters[type];\n if (!tester) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!tester.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: comparisonOperator((value, requirement) => value >= requirement),\n max: comparisonOperator((value, requirement) => value <= requirement),\n range: comparisonOperator((value, min, max) => value >= min && value <= max),\n equalto: {\n validateString: function (value, refOrValue) {\n var $reference = $(refOrValue);\n if ($reference.length)\n return value === $reference.val();\n else\n return value === refOrValue;\n },\n priority: 256\n }\n }\n};\n\nexport default ValidatorRegistry;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar UI = {};\n\nvar diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n};\n\nUI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', Utils._SubmitSelector, evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.$element.attr('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n};\n\nUI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = this.options.classHandler.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n\n return this._inputHolder();\n },\n\n _inputHolder: function() {\n // if simple element (input, texatrea, select...) it will perfectly host the classes and precede the error container\n if (!this.options.multiple || this.$element.is('select'))\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof this.options.errorsContainer) {\n if ($(this.options.errorsContainer).length)\n return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);\n else\n Utils.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof this.options.errorsContainer)\n $errorsContainer = this.options.errorsContainer.call(this, this);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n return this._inputHolder().after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(Utils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this._validateIfNeeded();\n });\n else if (trigger = Utils.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._validateIfNeeded(event);\n });\n }\n },\n\n _validateIfNeeded: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (event && /key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n if (this.options.debounce) {\n window.clearTimeout(this._debounced);\n this._debounced = window.setTimeout(() => this.validate(), this.options.debounce);\n } else\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n};\n\nexport default UI;\n","import $ from 'jquery';\nimport Base from './base';\nimport Utils from './utils';\n\nvar Form = function (element, domOptions, options) {\n this.__class__ = 'Form';\n\n this.$element = $(element);\n this.domOptions = domOptions;\n this.options = options;\n this.parent = window.Parsley;\n\n this.fields = [];\n this.validationResult = null;\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nForm.prototype = {\n onSubmitValidate: function (event) {\n // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var $submitSource = this._$submitSource || this.$element.find(Utils._SubmitSelector).first();\n this._$submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if ($submitSource.is('[formnovalidate]'))\n return;\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit($submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._$submitSource = $(event.currentTarget);\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function ($submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if ($submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('<input class=\"parsley-synthetic-submit-button\" type=\"hidden\">').appendTo(this.$element);\n $synthetic.attr({\n name: $submitSource.attr('name'),\n value: $submitSource.attr('value')\n });\n }\n\n this.$element.trigger($.extend($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = $.extend({}, event, {preventDefault: () => {\n Utils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return Utils.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return Utils.all(promises);\n },\n\n // Reset UI\n reset: function () {\n // Form case: emit a reset event for each field\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n\n // Form case: destroy all its fields and then destroy stored instance\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].destroy();\n\n this.$element.removeData('Parsley');\n this._trigger('destroy');\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `Field` and `FieldMultiple` children\n if (('Field' === fieldInstance.__class__ || 'FieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded)) {\n let uniqueId = fieldInstance.__class__ + '-' + fieldInstance.__id__;\n if ('undefined' === typeof this.fieldsMappedById[uniqueId]) {\n this.fieldsMappedById[uniqueId] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n }\n });\n\n $.each(Utils.difference(oldFields, this.fields), (_, field) => {\n field.reset();\n });\n });\n return this;\n },\n\n // Internal only.\n // Looping on a form's fields to do validation or similar\n // will trigger reactualizing options on all of them, which\n // in turn will reactualize the form's options.\n // To avoid calling actualizeOptions so many times on the form\n // for nothing, _withoutReactualizingFormOptions temporarily disables\n // the method actualizeOptions on this form while `fn` is called.\n _withoutReactualizingFormOptions: function (fn) {\n var oldActualizeOptions = this.actualizeOptions;\n this.actualizeOptions = function () { return this; };\n var result = fn();\n this.actualizeOptions = oldActualizeOptions;\n return result;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n // Returns true iff event is not interrupted and default not prevented.\n _trigger: function (eventName) {\n return this.trigger('form:' + eventName);\n }\n\n};\n\nexport default Form;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Validator from './validator';\n\nvar Constraint = function (parsleyField, name, requirements, priority, isDomConstraint) {\n var validatorSpec = window.Parsley._validatorRegistry.validators[name];\n var validator = new Validator(validatorSpec);\n\n $.extend(this, {\n validator: validator,\n name: name,\n requirements: requirements,\n priority: priority || parsleyField.options[name + 'Priority'] || validator.priority,\n isDomConstraint: true === isDomConstraint\n });\n this._parseRequirements(parsleyField.options);\n};\n\nvar capitalize = function(str) {\n var cap = str[0].toUpperCase();\n return cap + str.slice(1);\n};\n\nConstraint.prototype = {\n validate: function(value, instance) {\n return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n};\n\nexport default Constraint;\n\n","import $ from 'jquery';\nimport Constraint from './constraint';\nimport UI from './ui';\nimport Utils from './utils';\n\nvar Field = function (field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'Field';\n\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nField.prototype = {\n // # Public API\n // Validate field and trigger some events for mainly `UI`\n // @returns `true`, an array of the validators that failed, or\n // `null` if validation is not finished. Prefer using whenValidate\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `UI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refreshConstraints();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if ($.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refreshConstraints();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = Utils.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return Utils.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return Utils.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // Reset UI\n reset: function () {\n this._resetUI();\n return this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n this.$element.removeData('Parsley');\n this.$element.removeData('FieldMultiple');\n this._trigger('destroy');\n },\n\n // Actualize options that could have change since previous validation\n // Re-bind accordingly constraints (could be some new, removed or updated)\n refreshConstraints: function () {\n return this.actualizeOptions()._bindConstraints();\n },\n\n /**\n * Add a new constraint to a field\n *\n * @param {String} name\n * @param {Mixed} requirements optional\n * @param {Number} priority optional\n * @param {Boolean} isDomConstraint optional\n */\n addConstraint: function (name, requirements, priority, isDomConstraint) {\n\n if (window.Parsley._validatorRegistry.validators[name]) {\n var constraint = new Constraint(this, name, requirements, priority, isDomConstraint);\n\n // if constraint already exist, delete it and push new version\n if ('undefined' !== this.constraintsByName[constraint.name])\n this.removeConstraint(constraint.name);\n\n this.constraints.push(constraint);\n this.constraintsByName[constraint.name] = constraint;\n }\n\n return this;\n },\n\n // Remove a constraint\n removeConstraint: function (name) {\n for (var i = 0; i < this.constraints.length; i++)\n if (name === this.constraints[i].name) {\n this.constraints.splice(i, 1);\n break;\n }\n delete this.constraintsByName[name];\n return this;\n },\n\n // Update a constraint (Remove + re-add)\n updateConstraint: function (name, parameters, priority) {\n return this.removeConstraint(name)\n .addConstraint(name, parameters, priority);\n },\n\n // # Internals\n\n // Internal only.\n // Bind constraints from config + options + DOM\n _bindConstraints: function () {\n var constraints = [];\n var constraintsByName = {};\n\n // clean all existing DOM constraints to only keep javascript user constraints\n for (var i = 0; i < this.constraints.length; i++)\n if (false === this.constraints[i].isDomConstraint) {\n constraints.push(this.constraints[i]);\n constraintsByName[this.constraints[i].name] = this.constraints[i];\n }\n\n this.constraints = constraints;\n this.constraintsByName = constraintsByName;\n\n // then re-add Parsley DOM-API constraints\n for (var name in this.options)\n this.addConstraint(name, this.options[name], undefined, true);\n\n // finally, bind special HTML5 constraints\n return this._bindHtml5Constraints();\n },\n\n // Internal only.\n // Bind specific HTML5 constraints to be HTML5 compliant\n _bindHtml5Constraints: function () {\n // html5 required\n if (this.$element.attr('required'))\n this.addConstraint('required', true, undefined, true);\n\n // html5 pattern\n if ('string' === typeof this.$element.attr('pattern'))\n this.addConstraint('pattern', this.$element.attr('pattern'), undefined, true);\n\n // range\n if ('undefined' !== typeof this.$element.attr('min') && 'undefined' !== typeof this.$element.attr('max'))\n this.addConstraint('range', [this.$element.attr('min'), this.$element.attr('max')], undefined, true);\n\n // HTML5 min\n else if ('undefined' !== typeof this.$element.attr('min'))\n this.addConstraint('min', this.$element.attr('min'), undefined, true);\n\n // HTML5 max\n else if ('undefined' !== typeof this.$element.attr('max'))\n this.addConstraint('max', this.$element.attr('max'), undefined, true);\n\n\n // length\n if ('undefined' !== typeof this.$element.attr('minlength') && 'undefined' !== typeof this.$element.attr('maxlength'))\n this.addConstraint('length', [this.$element.attr('minlength'), this.$element.attr('maxlength')], undefined, true);\n\n // HTML5 minlength\n else if ('undefined' !== typeof this.$element.attr('minlength'))\n this.addConstraint('minlength', this.$element.attr('minlength'), undefined, true);\n\n // HTML5 maxlength\n else if ('undefined' !== typeof this.$element.attr('maxlength'))\n this.addConstraint('maxlength', this.$element.attr('maxlength'), undefined, true);\n\n\n // html5 types\n var type = this.$element.attr('type');\n\n if ('undefined' === typeof type)\n return this;\n\n // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n if ('number' === type) {\n return this.addConstraint('type', ['number', {\n step: this.$element.attr('step') || '1',\n base: this.$element.attr('min') || this.$element.attr('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range|date)$/i.test(type)) {\n return this.addConstraint('type', type, undefined, true);\n }\n return this;\n },\n\n // Internal only.\n // Field is required if have required constraint without `false` value\n _isRequired: function () {\n if ('undefined' === typeof this.constraintsByName.required)\n return false;\n\n return false !== this.constraintsByName.required.requirements;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n _trigger: function (eventName) {\n return this.trigger('field:' + eventName);\n },\n\n // Internal only\n // Handles whitespace in a value\n // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n _handleWhitespace: function (value) {\n if (true === this.options.trimValue)\n Utils.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n if ('squish' === this.options.whitespace)\n value = value.replace(/\\s{2,}/g, ' ');\n\n if (('trim' === this.options.whitespace) || ('squish' === this.options.whitespace) || (true === this.options.trimValue))\n value = Utils.trimString(value);\n\n return value;\n },\n\n _isDateInput: function() {\n var c = this.constraintsByName.type;\n return c && c.requirements === 'date';\n },\n\n // Internal only.\n // Returns the constraints, grouped by descending priority.\n // The result is thus an array of arrays of constraints.\n _getGroupedConstraints: function () {\n if (false === this.options.priorityEnabled)\n return [this.constraints];\n\n var groupedConstraints = [];\n var index = {};\n\n // Create array unique of priorities\n for (var i = 0; i < this.constraints.length; i++) {\n var p = this.constraints[i].priority;\n if (!index[p])\n groupedConstraints.push(index[p] = []);\n index[p].push(this.constraints[i]);\n }\n // Sort them by priority DESC\n groupedConstraints.sort(function (a, b) { return b[0].priority - a[0].priority; });\n\n return groupedConstraints;\n }\n\n};\n\nexport default Field;\n","import $ from 'jquery';\n\nvar Multiple = function () {\n this.__class__ = 'FieldMultiple';\n};\n\nMultiple.prototype = {\n // Add new `$element` sibling for multiple field\n addElement: function ($element) {\n this.$elements.push($element);\n\n return this;\n },\n\n // See `Field.refreshConstraints()`\n refreshConstraints: function () {\n var fieldConstraints;\n\n this.constraints = [];\n\n // Select multiple special treatment\n if (this.$element.is('select')) {\n this.actualizeOptions()._bindConstraints();\n\n return this;\n }\n\n // Gather all constraints for each input in the multiple group\n for (var i = 0; i < this.$elements.length; i++) {\n\n // Check if element have not been dynamically removed since last binding\n if (!$('html').has(this.$elements[i]).length) {\n this.$elements.splice(i, 1);\n continue;\n }\n\n fieldConstraints = this.$elements[i].data('FieldMultiple').refreshConstraints().constraints;\n\n for (var j = 0; j < fieldConstraints.length; j++)\n this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n }\n\n return this;\n },\n\n // See `Field.getValue()`\n getValue: function () {\n // Value could be overriden in DOM\n if ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.$element.is('input[type=radio]'))\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n\n // Select multiple case\n if (this.$element.is('select') && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n};\n\nexport default Multiple;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Base from './base';\nimport Form from './form';\nimport Field from './field';\nimport Multiple from './multiple';\n\nvar Factory = function (element, options, parsleyFormInstance) {\n this.$element = $(element);\n\n // If the element has already been bound, returns its saved Parsley instance\n var savedparsleyFormInstance = this.$element.data('Parsley');\n if (savedparsleyFormInstance) {\n\n // If the saved instance has been bound without a Form parent and there is one given in this call, add it\n if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n savedparsleyFormInstance.parent = parsleyFormInstance;\n savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n }\n\n if ('object' === typeof options) {\n $.extend(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && 'Form' !== parsleyFormInstance.__class__)\n throw new Error('Parent instance must be a Form instance');\n\n this.parent = parsleyFormInstance || window.Parsley;\n return this.init(options);\n};\n\nFactory.prototype = {\n init: function (options) {\n this.__class__ = 'Parsley';\n this.__version__ = '@@version';\n this.__id__ = Utils.generateID();\n\n // Pre-compute options\n this._resetOptions(options);\n\n // A Form instance is obviously a `<form>` element but also every node that is not an input and has the `data-parsley-validate` attribute\n if (this.$element.is('form') || (Utils.checkAttr(this.$element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)))\n return this.bind('parsleyForm');\n\n // Every other element is bound as a `Field` or `FieldMultiple`\n return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n },\n\n isMultiple: function () {\n return (this.$element.is('input[type=radio], input[type=checkbox]')) || (this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple'));\n },\n\n // Multiples fields are a real nightmare :(\n // Maybe some refactoring would be appreciated here...\n handleMultiple: function () {\n var name;\n var multiple;\n var parsleyMultipleInstance;\n\n // Handle multiple name\n if (this.options.multiple)\n ; // We already have our 'multiple' identifier\n else if ('undefined' !== typeof this.$element.attr('name') && this.$element.attr('name').length)\n this.options.multiple = name = this.$element.attr('name');\n else if ('undefined' !== typeof this.$element.attr('id') && this.$element.attr('id').length)\n this.options.multiple = this.$element.attr('id');\n\n // Special select multiple input\n if (this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple')) {\n this.options.multiple = this.options.multiple || this.__id__;\n return this.bind('parsleyFieldMultiple');\n\n // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n } else if (!this.options.multiple) {\n Utils.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n return this;\n }\n\n // Remove special chars\n this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, '');\n\n // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n if ('undefined' !== typeof name) {\n $('input[name=\"' + name + '\"]').each((i, input) => {\n if ($(input).is('input[type=radio], input[type=checkbox]'))\n $(input).attr(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('FieldMultiple')) {\n parsleyMultipleInstance.addElement(this.$element);\n }\n\n break;\n }\n }\n\n // Create a secret Field instance for every multiple field. It will be stored in `data('FieldMultiple')`\n // And will be useful later to access classic `Field` stuff while being in a `FieldMultiple` instance\n this.bind('parsleyField', true);\n\n return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n },\n\n // Return proper `Form`, `Field` or `FieldMultiple`\n bind: function (type, doNotStore) {\n var parsleyInstance;\n\n switch (type) {\n case 'parsleyForm':\n parsleyInstance = $.extend(\n new Form(this.$element, this.domOptions, this.options),\n new Base(),\n window.ParsleyExtend\n )._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(\n new Field(this.$element, this.domOptions, this.options, this.parent),\n new Base(),\n window.ParsleyExtend\n );\n break;\n case 'parsleyFieldMultiple':\n parsleyInstance = $.extend(\n new Field(this.$element, this.domOptions, this.options, this.parent),\n new Multiple(),\n new Base(),\n window.ParsleyExtend\n )._init();\n break;\n default:\n throw new Error(type + 'is not a supported Parsley type');\n }\n\n if (this.options.multiple)\n Utils.setAttr(this.$element, this.options.namespace, 'multiple', this.options.multiple);\n\n if ('undefined' !== typeof doNotStore) {\n this.$element.data('FieldMultiple', parsleyInstance);\n\n return parsleyInstance;\n }\n\n // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n this.$element.data('Parsley', parsleyInstance);\n\n // Tell the world we have a new Form or Field instance!\n parsleyInstance._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n};\n\nexport default Factory;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Defaults from './defaults';\nimport Base from './base';\nimport ValidatorRegistry from './validator_registry';\nimport UI from './ui';\nimport Form from './form';\nimport Field from './field';\nimport Multiple from './multiple';\nimport Factory from './factory';\n\nvar vernums = $.fn.jquery.split('.');\nif (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n}\nif (!vernums.forEach) {\n Utils.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n}\n// Inherit `on`, `off` & `trigger` to Parsley:\nvar Parsley = $.extend(new Base(), {\n $element: $(document),\n actualizeOptions: null,\n _resetOptions: null,\n Factory: Factory,\n version: '@@version'\n });\n\n// Supplement Field and Form with Base\n// This way, the constructors will have access to those methods\n$.extend(Field.prototype, UI.Field, Base.prototype);\n$.extend(Form.prototype, UI.Form, Base.prototype);\n// Inherit actualizeOptions and _resetOptions:\n$.extend(Factory.prototype, Base.prototype);\n\n// ### jQuery API\n// `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n$.fn.parsley = $.fn.psly = function (options) {\n if (this.length > 1) {\n var instances = [];\n\n this.each(function () {\n instances.push($(this).parsley(options));\n });\n\n return instances;\n }\n\n // Return undefined if applied to non existing DOM element\n if (!$(this).length) {\n Utils.warn('You must bind Parsley on an existing element.');\n\n return;\n }\n\n return new Factory(this, options);\n};\n\n// ### Field and Form extension\n// Ensure the extension is now defined if it wasn't previously\nif ('undefined' === typeof window.ParsleyExtend)\n window.ParsleyExtend = {};\n\n// ### Parsley config\n// Inherit from ParsleyDefault, and copy over any existing values\nParsley.options = $.extend(Utils.objectCreate(Defaults), window.ParsleyConfig);\nwindow.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n// ### Globals\nwindow.Parsley = window.psly = Parsley;\nParsley.Utils = Utils;\nwindow.ParsleyUtils = {};\n$.each(Utils, (key, value) => {\n if ('function' === typeof value) {\n window.ParsleyUtils[key] = (...args) => {\n Utils.warnOnce('Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.');\n return Utils[key](...args);\n };\n }\n});\n\n// ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\nvar registry = window.Parsley._validatorRegistry = new ValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\nwindow.ParsleyValidator = {};\n$.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator'.split(' '), function (i, method) {\n window.Parsley[method] = $.proxy(registry, method);\n window.ParsleyValidator[method] = function () {\n Utils.warnOnce(`Accessing the method '${method}' through Validator is deprecated. Simply call 'window.Parsley.${method}(...)'`);\n return window.Parsley[method](...arguments);\n };\n});\n\n// ### UI\n// Deprecated global object\nwindow.Parsley.UI = UI;\nwindow.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce(`Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n Utils.warnOnce(`Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n};\n$.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce(`Accessing UI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n});\n\n// ### PARSLEY auto-binding\n// Prevent it by setting `ParsleyConfig.autoBind` to `false`\nif (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n}\n\nexport default Parsley;\n","import $ from 'jquery';\n\nimport Parsley from './main';\n\n$.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n});\n\nParsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n});\n\nParsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n});\n\nwindow.ParsleyExtend.addAsyncValidator = function () {\n Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n};\n","// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\nimport Parsley from '../parsley/main';\n\nParsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n});\n\nParsley.setLocale('en');\n","import $ from 'jquery';\nimport Parsley from './parsley/main';\nimport './parsley/pubsub';\nimport './parsley/remote';\nimport './i18n/en';\nimport inputevent from './vendor/inputevent';\n\ninputevent.install();\n\nexport default Parsley;\n"]}
1
+ {"version":3,"sources":["parsley.min.js","parsley.js","src/parsley/pubsub.js","src/vendor/inputevent.js","src/parsley/utils.js","src/parsley/defaults.js","src/parsley/base.js","src/parsley/validator.js","src/parsley/validator_registry.js","src/parsley/ui.js","src/parsley/form.js","src/parsley/constraint.js","src/parsley/field.js","src/parsley/multiple.js","src/parsley/factory.js","src/parsley/main.js","src/parsley/remote.js","src/i18n/en.js","src/parsley.js"],"names":["_toConsumableArray","arr","Array","isArray","i","arr2","length","from","_slice","prototype","slice","_slicedToArray","sliceIterator","_arr","_n","_d","_e","undefined","_s","_i","Symbol","iterator","next","done","push","value","err","Object","TypeError","_extends","assign","target","arguments","source","key","hasOwnProperty","call","global","factory","exports","module","require","define","amd","parsley","jQuery","this","$","adapt","fn","context","parsleyAdaptedCallback","args","unshift","apply","o","eventName","name","lastIndexOf","eventPrefix","substr","InputEvent","_this14","globals","window","isNativeEvent","evt","originalEvent","isTrusted","fakeInputEvent","trigger","misbehaves","behavesOk","document","on","data","selector","off","install","inputEventPatched","uninstall","globalID","pastWarnings","Utils","attr","element","namespace","obj","attribute","attributes","regex","RegExp","specified","test","camelize","deserializeValue","checkAttr","_checkAttr","hasAttribute","setAttr","setAttribute","dasherize","String","getType","getAttribute","generateID","num","isNaN","Number","JSON","parse","e","str","replace","match","chr","toUpperCase","toLowerCase","warn","_window$console","console","warnOnce","msg","_resetWarnings","trimString","string","date","parsed","_parsed$map","map","x","parseInt","_parsed$map2","year","month","day","Date","getFullYear","getMonth","getDate","_string","integer","number","parseFloat","boolean","object","regexp","_regexp","flags","parseRequirement","requirementType","converter","converted","namespaceEvents","events","split","join","difference","array","remove","result","each","_","elem","indexOf","all","promises","when","concat","objectCreate","create","Error","_SubmitSelector","Defaults","inputs","excluded","priorityEnabled","multiple","group","uiEnabled","validationThreshold","focus","triggerAfterFailure","errorClass","successClass","classHandler","Field","errorsContainer","errorsWrapper","errorTemplate","Base","__id__","asyncSupport","_pipeAccordingToValidationResult","_this","pipe","r","Deferred","validationResult","reject","resolve","promise","actualizeOptions","options","domOptions","parent","_resetOptions","initOptions","_listeners","queue","subscribe","listenTo","splice","unsubscribe","unsubscribeTo","extraArg","asyncIsValid","force","whenValid","_findRelated","querySelectorAll","$element","convertArrayRequirement","m","values","convertExtraOptionRequirement","requirementSpec","extraOptionReader","main","extra","Validator","spec","extend","validate","requirementFirstArg","validateMultiple","instance","validateDate","_isDateInput","validateNumber","validateString","parseRequirements","requirements","type","isPlainObject","priority","ValidatorRegistry","validators","catalog","__class__","locale","init","typeTesters","email","digits","alphanum","url","range","decimalPlaces","Math","max","ValidatorRegistry__parseArguments","ValidatorRegistry__operatorToValidator","operator","_len","requirementsAndInput","_key","pop","ValidatorRegistry__comparisonOperator","addValidator","Parsley","setLocale","addCatalog","messages","set","addMessage","message","addMessages","nameMessageObject","arg1","arg2","_setValidator","hasValidator","updateValidator","removeValidator","validator","getErrorMessage","constraint","typeMessages","formatMessage","defaultMessage","en","parameters","notblank","required","_ref","_ref$step","step","_ref$base","base","tester","nb","decimals","toInt","f","round","pow","","pattern","minlength","requirement","maxlength","min","mincheck","maxcheck","check","equalto","refOrValue","$reference","val","UI","diffResults","newResult","oldResult","deep","added","kept","found","j","assert","removed","Form","_actualizeTriggers","_this2","onSubmitValidate","onSubmitButton","_focusedField","fields","field","noFocus","_destroyUI","_reflowUI","_buildUI","_ui","diff","lastValidationResult","_manageStatusClass","_manageErrorsMessages","_failedOnce","getErrorsMessages","errorMessage","_getErrorMessage","addError","_ref2","_ref2$updateClass","updateClass","_addError","_errorClass","updateError","_ref3","_ref3$updateClass","_updateError","removeError","_ref4","_ref4$updateClass","_removeError","hasConstraints","needsValidation","_successClass","_resetClass","errorsMessagesDisabled","_insertErrorWrapper","$errorsWrapper","find","append","addClass","html","removeClass","_ref5","$errorClassHandler","errorsWrapperId","_ref6","removeAttr","customConstraintErrorMessage","_manageClassHandler","validationInformationVisible","$handlerFunction","$handler","_inputHolder","nodeName","$errorsContainer","after","_this3","$toBind","_validateIfNeeded","event","_this4","getValue","debounce","clearTimeout","_debounced","setTimeout","_resetUI","children","Form__statusMapping","pending","resolved","rejected","_this5","submitSource","_submitSource","prop","_remoteCache","whenValidate","state","_trigger","stopImmediatePropagation","preventDefault","_submit","currentTarget","$synthetic","appendTo","Event","_arguments","_Utils$all$done$fail$always","_this6","_ref7","submitEvent","_refreshFields","_withoutReactualizingFormOptions","fail","always","isValid","_arguments2","_this7","_ref8","refresh","reset","destroy","removeData","_bindFields","_this8","oldFields","fieldsMappedById","not","fieldInstance","Factory","uniqueId","oldActualizeOptions","Constraint","parsleyField","isDomConstraint","validatorSpec","_validatorRegistry","_parseRequirements","capitalize","cap","_validator","requirementList","_this9","parsleyFormInstance","constraints","constraintsByName","_bindConstraints","parsley_field__statusMapping","_whenValid$always$done$fail$always","_this10","_ref9","_isInGroup","_refreshed","_isRequired","validateIfEmpty","inArray","_arguments3","_this11","_ref10","_ref10$force","groupedConstraints","_getGroupedConstraints","_validateConstraint","_this12","_handleWhitespace","_refreshConstraints","refreshConstraints","addConstraint","removeConstraint","updateConstraint","_bindHtml5Constraints","trimValue","whitespace","c","index","p","sort","a","b","parsley_field","Multiple","addElement","$elements","fieldConstraints","has","filter","_init","savedparsleyFormInstance","__version__","is","bind","isMultiple","handleMultiple","parsleyMultipleInstance","_this13","input","$previouslyRelated","get","doNotStore","parsleyInstance","ParsleyExtend","vernums","jquery","forEach","version","psly","instances","ParsleyConfig","ParsleyUtils","registry","i18n","ParsleyValidator","method","_window$Parsley","ParsleyUI","doNotUpdateClass","autoBind","deprecated","listen","callback","unsubscribeAll","emit","_instance","instanceGiven","asyncValidators","default","xhr","status","reverse","addAsyncValidator","ajaxOptions","csr","encodeURIComponent","remoteOptions","param","ajax","handleXhr","then","inputevent"],"mappings":"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","file":"parsley.min.js","sourcesContent":["/*!\n* Parsley.js\n* Version 2.8.1 - built Sat, Feb 3rd 2018, 2:27 pm\n* http://parsleyjs.org\n* Guillaume Potier - <guillaume@wisembly.com>\n* Marc-Andre Lafortune - <petroselinum@marc-andre.ca>\n* MIT Licensed\n*/\n\n// The source code below is generated by babel as\n// Parsley is written in ECMAScript 6\n//\nvar _slice = Array.prototype.slice;\n\nvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) : typeof define === 'function' && define.amd ? define(['jquery'], factory) : global.parsley = factory(global.jQuery);\n})(this, function ($) {\n 'use strict';\n\n var globalID = 1;\n var pastWarnings = {};\n\n var Utils = {\n // Parsley DOM-API\n // returns object from dom attributes and values\n attr: function attr(element, namespace, obj) {\n var i;\n var attribute;\n var attributes;\n var regex = new RegExp('^' + namespace, 'i');\n\n if ('undefined' === typeof obj) obj = {};else {\n // Clear all own properties. This won't affect prototype's values\n for (i in obj) {\n if (obj.hasOwnProperty(i)) delete obj[i];\n }\n }\n\n if (!element) return obj;\n\n attributes = element.attributes;\n for (i = attributes.length; i--;) {\n attribute = attributes[i];\n\n if (attribute && attribute.specified && regex.test(attribute.name)) {\n obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n }\n }\n\n return obj;\n },\n\n checkAttr: function checkAttr(element, namespace, _checkAttr) {\n return element.hasAttribute(namespace + _checkAttr);\n },\n\n setAttr: function setAttr(element, namespace, attr, value) {\n element.setAttribute(this.dasherize(namespace + attr), String(value));\n },\n\n getType: function getType(element) {\n return element.getAttribute('type') || 'text';\n },\n\n generateID: function generateID() {\n return '' + globalID++;\n },\n\n /** Third party functions **/\n deserializeValue: function deserializeValue(value) {\n var num;\n\n try {\n return value ? value == \"true\" || (value == \"false\" ? false : value == \"null\" ? null : !isNaN(num = Number(value)) ? num : /^[\\[\\{]/.test(value) ? JSON.parse(value) : value) : value;\n } catch (e) {\n return value;\n }\n },\n\n // Zepto camelize function\n camelize: function camelize(str) {\n return str.replace(/-+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n });\n },\n\n // Zepto dasherize function\n dasherize: function dasherize(str) {\n return str.replace(/::/g, '/').replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2').replace(/([a-z\\d])([A-Z])/g, '$1_$2').replace(/_/g, '-').toLowerCase();\n },\n\n warn: function warn() {\n var _window$console;\n\n if (window.console && 'function' === typeof window.console.warn) (_window$console = window.console).warn.apply(_window$console, arguments);\n },\n\n warnOnce: function warnOnce(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn.apply(this, arguments);\n }\n },\n\n _resetWarnings: function _resetWarnings() {\n pastWarnings = {};\n },\n\n trimString: function trimString(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n parse: {\n date: function date(string) {\n var parsed = string.match(/^(\\d{4,})-(\\d\\d)-(\\d\\d)$/);\n if (!parsed) return null;\n\n var _parsed$map = parsed.map(function (x) {\n return parseInt(x, 10);\n });\n\n var _parsed$map2 = _slicedToArray(_parsed$map, 4);\n\n var _ = _parsed$map2[0];\n var year = _parsed$map2[1];\n var month = _parsed$map2[2];\n var day = _parsed$map2[3];\n\n var date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) return null;\n return date;\n },\n string: function string(_string) {\n return _string;\n },\n integer: function integer(string) {\n if (isNaN(string)) return null;\n return parseInt(string, 10);\n },\n number: function number(string) {\n if (isNaN(string)) throw null;\n return parseFloat(string);\n },\n 'boolean': function _boolean(string) {\n return !/^\\s*false\\s*$/i.test(string);\n },\n object: function object(string) {\n return Utils.deserializeValue(string);\n },\n regexp: function regexp(_regexp) {\n var flags = '';\n\n // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n if (/^\\/.*\\/(?:[gimy]*)$/.test(_regexp)) {\n // Replace the regexp literal string with the first match group: ([gimy]*)\n // If no flag is present, this will be a blank string\n flags = _regexp.replace(/.*\\/([gimy]*)$/, '$1');\n // Again, replace the regexp literal string with the first match group:\n // everything excluding the opening and closing slashes and the flags\n _regexp = _regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n } else {\n // Anchor regexp:\n _regexp = '^' + _regexp + '$';\n }\n return new RegExp(_regexp, flags);\n }\n },\n\n parseRequirement: function parseRequirement(requirementType, string) {\n var converter = this.parse[requirementType || 'string'];\n if (!converter) throw 'Unknown requirement specification: \"' + requirementType + '\"';\n var converted = converter(string);\n if (converted === null) throw 'Requirement is not a ' + requirementType + ': \"' + string + '\"';\n return converted;\n },\n\n namespaceEvents: function namespaceEvents(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0]) return '';\n return $.map(events, function (evt) {\n return evt + '.' + namespace;\n }).join(' ');\n },\n\n difference: function difference(array, remove) {\n // This is O(N^2), should be optimized\n var result = [];\n $.each(array, function (_, elem) {\n if (remove.indexOf(elem) == -1) result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function all(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when.apply($, _toConsumableArray(promises).concat([42, 42]));\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function Object() {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })(),\n\n _SubmitSelector: 'input[type=\"submit\"], button:submit'\n };\n\n // All these options could be overriden and specified directly in DOM using\n // `data-parsley-` default DOM-API\n // eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n // eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n\n var Defaults = {\n // ### General\n\n // Default data-namespace for DOM API\n namespace: 'data-parsley-',\n\n // Supported inputs by default\n inputs: 'input, textarea, select',\n\n // Excluded inputs by default\n excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n\n // Stop validating field on highest priority failing constraint\n priorityEnabled: true,\n\n // ### Field only\n\n // identifier used to group together inputs (e.g. radio buttons...)\n multiple: null,\n\n // identifier (or array of identifiers) used to validate only a select group of inputs\n group: null,\n\n // ### UI\n // Enable\\Disable error messages\n uiEnabled: true,\n\n // Key events threshold before validation\n validationThreshold: 3,\n\n // Focused field on form validation error. 'first'|'last'|'none'\n focus: 'first',\n\n // event(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function classHandler(Field) {},\n\n // Return the `$element` where errors will be appended\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n errorsContainer: function errorsContainer(Field) {},\n\n // ul elem that would receive errors' list\n errorsWrapper: '<ul class=\"parsley-errors-list\"></ul>',\n\n // li elem that would receive error message\n errorTemplate: '<li></li>'\n };\n\n var Base = function Base() {\n this.__id__ = Utils.generateID();\n };\n\n Base.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function _pipeAccordingToValidationResult() {\n var _this = this;\n\n var pipe = function pipe() {\n var r = $.Deferred();\n if (true !== _this.validationResult) r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function actualizeOptions() {\n Utils.attr(this.element, this.options.namespace, this.domOptions);\n if (this.parent && this.parent.actualizeOptions) this.parent.actualizeOptions();\n return this;\n },\n\n _resetOptions: function _resetOptions(initOptions) {\n this.domOptions = Utils.objectCreate(this.parent.options);\n this.options = Utils.objectCreate(this.domOptions);\n // Shallow copy of ownProperties of initOptions:\n for (var i in initOptions) {\n if (initOptions.hasOwnProperty(i)) this.options[i] = initOptions[i];\n }\n this.actualizeOptions();\n },\n\n _listeners: null,\n\n // Register a callback for the given event name\n // Callback is called with context as the first argument and the `this`\n // The context is the current parsley instance, or window.Parsley if global\n // A return value of `false` will interrupt the calls\n on: function on(name, fn) {\n this._listeners = this._listeners || {};\n var queue = this._listeners[name] = this._listeners[name] || [];\n queue.push(fn);\n\n return this;\n },\n\n // Deprecated. Use `on` instead\n subscribe: function subscribe(name, fn) {\n $.listenTo(this, name.toLowerCase(), fn);\n },\n\n // Unregister a callback (or all if none is given) for the given event name\n off: function off(name, fn) {\n var queue = this._listeners && this._listeners[name];\n if (queue) {\n if (!fn) {\n delete this._listeners[name];\n } else {\n for (var i = queue.length; i--;) if (queue[i] === fn) queue.splice(i, 1);\n }\n }\n return this;\n },\n\n // Deprecated. Use `off`\n unsubscribe: function unsubscribe(name, fn) {\n $.unsubscribeTo(this, name.toLowerCase());\n },\n\n // Trigger an event of the given name\n // A return value of `false` interrupts the callback chain\n // Returns false if execution was interrupted\n trigger: function trigger(name, target, extraArg) {\n target = target || this;\n var queue = this._listeners && this._listeners[name];\n var result;\n var parentResult;\n if (queue) {\n for (var i = queue.length; i--;) {\n result = queue[i].call(target, target, extraArg);\n if (result === false) return result;\n }\n }\n if (this.parent) {\n return this.parent.trigger(name, target, extraArg);\n }\n return true;\n },\n\n asyncIsValid: function asyncIsValid(group, force) {\n Utils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({ group: group, force: force });\n },\n\n _findRelated: function _findRelated() {\n return this.options.multiple ? $(this.parent.element.querySelectorAll('[' + this.options.namespace + 'multiple=\"' + this.options.multiple + '\"]')) : this.$element;\n }\n };\n\n var convertArrayRequirement = function convertArrayRequirement(string, length) {\n var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n if (!m) throw 'Requirement is not an array: \"' + string + '\"';\n var values = m[1].split(',').map(Utils.trimString);\n if (values.length !== length) throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n return values;\n };\n\n var convertExtraOptionRequirement = function convertExtraOptionRequirement(requirementSpec, string, extraOptionReader) {\n var main = null;\n var extra = {};\n for (var key in requirementSpec) {\n if (key) {\n var value = extraOptionReader(key);\n if ('string' === typeof value) value = Utils.parseRequirement(requirementSpec[key], value);\n extra[key] = value;\n } else {\n main = Utils.parseRequirement(requirementSpec[key], string);\n }\n }\n return [main, extra];\n };\n\n // A Validator needs to implement the methods `validate` and `parseRequirements`\n\n var Validator = function Validator(spec) {\n $.extend(true, this, spec);\n };\n\n Validator.prototype = {\n // Returns `true` iff the given `value` is valid according the given requirements.\n validate: function validate(value, requirementFirstArg) {\n if (this.fn) {\n // Legacy style validator\n\n if (arguments.length > 3) // If more args then value, requirement, instance...\n requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest\n return this.fn(value, requirementFirstArg);\n }\n\n if (Array.isArray(value)) {\n if (!this.validateMultiple) throw 'Validator `' + this.name + '` does not handle multiple values';\n return this.validateMultiple.apply(this, arguments);\n } else {\n var instance = arguments[arguments.length - 1];\n if (this.validateDate && instance._isDateInput()) {\n arguments[0] = Utils.parse.date(arguments[0]);\n if (arguments[0] === null) return false;\n return this.validateDate.apply(this, arguments);\n }\n if (this.validateNumber) {\n if (isNaN(value)) return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber.apply(this, arguments);\n }\n if (this.validateString) {\n return this.validateString.apply(this, arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function parseRequirements(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return Array.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if (Array.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++) values[i] = Utils.parseRequirement(type[i], values[i]);\n return values;\n } else if ($.isPlainObject(type)) {\n return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n } else {\n return [Utils.parseRequirement(type, requirements)];\n }\n },\n // Defaults:\n requirementType: 'string',\n\n priority: 2\n\n };\n\n var ValidatorRegistry = function ValidatorRegistry(validators, catalog) {\n this.__class__ = 'ValidatorRegistry';\n\n // Default Parsley locale is en\n this.locale = 'en';\n\n this.init(validators || {}, catalog || {});\n };\n\n var typeTesters = {\n email: /^((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n date: {\n test: function test(value) {\n return Utils.parse.date(value) !== null;\n }\n },\n\n url: new RegExp(\"^\" +\n // protocol identifier\n \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" + \"(?:\" +\n // IP address exclusion\n // private & local networks\n // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" + // ** mod: allow local networks\n // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" + \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" + \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" + \"|\" +\n // host name\n '(?:(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)' +\n // domain name\n '(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)*' +\n // TLD identifier\n '(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff]{2,}))' + \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:/\\\\S*)?\" + \"$\")\n };\n typeTesters.range = typeTesters.number;\n\n // See http://stackoverflow.com/a/10454560/8279\n var decimalPlaces = function decimalPlaces(num) {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) {\n return 0;\n }\n return Math.max(0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) - (\n // Adjust for scientific notation.\n match[2] ? +match[2] : 0));\n };\n\n // parseArguments('number', ['1', '2']) => [1, 2]\n var ValidatorRegistry__parseArguments = function ValidatorRegistry__parseArguments(type, args) {\n return args.map(Utils.parse[type]);\n };\n // operatorToValidator returns a validating function for an operator function, applied to the given type\n var ValidatorRegistry__operatorToValidator = function ValidatorRegistry__operatorToValidator(type, operator) {\n return function (value) {\n for (var _len = arguments.length, requirementsAndInput = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n requirementsAndInput[_key - 1] = arguments[_key];\n }\n\n requirementsAndInput.pop(); // Get rid of `input` argument\n return operator.apply(undefined, [value].concat(_toConsumableArray(ValidatorRegistry__parseArguments(type, requirementsAndInput))));\n };\n };\n\n var ValidatorRegistry__comparisonOperator = function ValidatorRegistry__comparisonOperator(operator) {\n return {\n validateDate: ValidatorRegistry__operatorToValidator('date', operator),\n validateNumber: ValidatorRegistry__operatorToValidator('number', operator),\n requirementType: operator.length <= 2 ? 'string' : ['string', 'string'], // Support operators with a 1 or 2 requirement(s)\n priority: 30\n };\n };\n\n ValidatorRegistry.prototype = {\n init: function init(validators, catalog) {\n this.catalog = catalog;\n // Copy prototype's validators:\n this.validators = _extends({}, this.validators);\n\n for (var name in validators) this.addValidator(name, validators[name].fn, validators[name].priority);\n\n window.Parsley.trigger('parsley:validator:init');\n },\n\n // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n setLocale: function setLocale(locale) {\n if ('undefined' === typeof this.catalog[locale]) throw new Error(locale + ' is not available in the catalog');\n\n this.locale = locale;\n\n return this;\n },\n\n // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n addCatalog: function addCatalog(locale, messages, set) {\n if ('object' === typeof messages) this.catalog[locale] = messages;\n\n if (true === set) return this.setLocale(locale);\n\n return this;\n },\n\n // Add a specific message for a given constraint in a given locale\n addMessage: function addMessage(locale, name, message) {\n if ('undefined' === typeof this.catalog[locale]) this.catalog[locale] = {};\n\n this.catalog[locale][name] = message;\n\n return this;\n },\n\n // Add messages for a given locale\n addMessages: function addMessages(locale, nameMessageObject) {\n for (var name in nameMessageObject) this.addMessage(locale, name, nameMessageObject[name]);\n\n return this;\n },\n\n // Add a new validator\n //\n // addValidator('custom', {\n // requirementType: ['integer', 'integer'],\n // validateString: function(value, from, to) {},\n // priority: 22,\n // messages: {\n // en: \"Hey, that's no good\",\n // fr: \"Aye aye, pas bon du tout\",\n // }\n // })\n //\n // Old API was addValidator(name, function, priority)\n //\n addValidator: function addValidator(name, arg1, arg2) {\n if (this.validators[name]) Utils.warn('Validator \"' + name + '\" is already defined.');else if (Defaults.hasOwnProperty(name)) {\n Utils.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n return;\n }\n return this._setValidator.apply(this, arguments);\n },\n\n hasValidator: function hasValidator(name) {\n return !!this.validators[name];\n },\n\n updateValidator: function updateValidator(name, arg1, arg2) {\n if (!this.validators[name]) {\n Utils.warn('Validator \"' + name + '\" is not already defined.');\n return this.addValidator.apply(this, arguments);\n }\n return this._setValidator.apply(this, arguments);\n },\n\n removeValidator: function removeValidator(name) {\n if (!this.validators[name]) Utils.warn('Validator \"' + name + '\" is not defined.');\n\n delete this.validators[name];\n\n return this;\n },\n\n _setValidator: function _setValidator(name, validator, priority) {\n if ('object' !== typeof validator) {\n // Old style validator, with `fn` and `priority`\n validator = {\n fn: validator,\n priority: priority\n };\n }\n if (!validator.validate) {\n validator = new Validator(validator);\n }\n this.validators[name] = validator;\n\n for (var locale in validator.messages || {}) this.addMessage(locale, name, validator.messages[locale]);\n\n return this;\n },\n\n getErrorMessage: function getErrorMessage(constraint) {\n var message;\n\n // Type constraints are a bit different, we have to match their requirements too to find right error message\n if ('type' === constraint.name) {\n var typeMessages = this.catalog[this.locale][constraint.name] || {};\n message = typeMessages[constraint.requirements];\n } else message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n },\n\n // Kind of light `sprintf()` implementation\n formatMessage: function formatMessage(string, parameters) {\n if ('object' === typeof parameters) {\n for (var i in parameters) string = this.formatMessage(string, parameters[i]);\n\n return string;\n }\n\n return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function validateString(value) {\n return (/\\S/.test(value)\n );\n },\n priority: 2\n },\n required: {\n validateMultiple: function validateMultiple(values) {\n return values.length > 0;\n },\n validateString: function validateString(value) {\n return (/\\S/.test(value)\n );\n },\n priority: 512\n },\n type: {\n validateString: function validateString(value, type) {\n var _ref = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\n var _ref$step = _ref.step;\n var step = _ref$step === undefined ? 'any' : _ref$step;\n var _ref$base = _ref.base;\n var base = _ref$base === undefined ? 0 : _ref$base;\n\n var tester = typeTesters[type];\n if (!tester) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!tester.test(value)) return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = function toInt(f) {\n return Math.round(f * Math.pow(10, decimals));\n };\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0) return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function validateString(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function validateString(value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function validateString(value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function validateString(value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function validateMultiple(values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function validateMultiple(values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function validateMultiple(values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: ValidatorRegistry__comparisonOperator(function (value, requirement) {\n return value >= requirement;\n }),\n max: ValidatorRegistry__comparisonOperator(function (value, requirement) {\n return value <= requirement;\n }),\n range: ValidatorRegistry__comparisonOperator(function (value, min, max) {\n return value >= min && value <= max;\n }),\n equalto: {\n validateString: function validateString(value, refOrValue) {\n var $reference = $(refOrValue);\n if ($reference.length) return value === $reference.val();else return value === refOrValue;\n },\n priority: 256\n }\n }\n };\n\n var UI = {};\n\n var diffResults = function diffResults(newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++) if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found) kept.push(newResult[i]);else added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n };\n\n UI.Form = {\n\n _actualizeTriggers: function _actualizeTriggers() {\n var _this2 = this;\n\n this.$element.on('submit.Parsley', function (evt) {\n _this2.onSubmitValidate(evt);\n });\n this.$element.on('click.Parsley', Utils._SubmitSelector, function (evt) {\n _this2.onSubmitButton(evt);\n });\n\n // UI could be disabled\n if (false === this.options.uiEnabled) return;\n\n this.element.setAttribute('novalidate', '');\n },\n\n focus: function focus() {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus) return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus) break;\n }\n }\n\n if (null === this._focusedField) return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function _destroyUI() {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n };\n\n UI.Field = {\n\n _reflowUI: function _reflowUI() {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui) return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function getErrorsMessages() {\n // No error message, field is valid\n if (true === this.validationResult) return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++) messages.push(this.validationResult[i].errorMessage || this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function addError(name) {\n var _ref2 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var message = _ref2.message;\n var assert = _ref2.assert;\n var _ref2$updateClass = _ref2.updateClass;\n var updateClass = _ref2$updateClass === undefined ? true : _ref2$updateClass;\n\n this._buildUI();\n this._addError(name, { message: message, assert: assert });\n\n if (updateClass) this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function updateError(name) {\n var _ref3 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var message = _ref3.message;\n var assert = _ref3.assert;\n var _ref3$updateClass = _ref3.updateClass;\n var updateClass = _ref3$updateClass === undefined ? true : _ref3$updateClass;\n\n this._buildUI();\n this._updateError(name, { message: message, assert: assert });\n\n if (updateClass) this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function removeError(name) {\n var _ref4 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var _ref4$updateClass = _ref4.updateClass;\n var updateClass = _ref4$updateClass === undefined ? true : _ref4$updateClass;\n\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass) this._manageStatusClass();\n },\n\n _manageStatusClass: function _manageStatusClass() {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult) this._successClass();else if (this.validationResult.length > 0) this._errorClass();else this._resetClass();\n },\n\n _manageErrorsMessages: function _manageErrorsMessages(diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled) return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if (diff.added.length || diff.kept.length) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length) this._ui.$errorsWrapper.append($(this.options.errorTemplate).addClass('parsley-custom-error-message'));\n\n return this._ui.$errorsWrapper.addClass('filled').find('.parsley-custom-error-message').html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper.removeClass('filled').find('.parsley-custom-error-message').remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++) this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++) this._addError(diff.added[i].assert.name, { message: diff.added[i].errorMessage, assert: diff.added[i].assert });\n\n for (i = 0; i < diff.kept.length; i++) this._updateError(diff.kept[i].assert.name, { message: diff.kept[i].errorMessage, assert: diff.kept[i].assert });\n },\n\n _addError: function _addError(name, _ref5) {\n var message = _ref5.message;\n var assert = _ref5.assert;\n\n this._insertErrorWrapper();\n this._ui.$errorClassHandler.attr('aria-describedby', this._ui.errorsWrapperId);\n this._ui.$errorsWrapper.addClass('filled').append($(this.options.errorTemplate).addClass('parsley-' + name).html(message || this._getErrorMessage(assert)));\n },\n\n _updateError: function _updateError(name, _ref6) {\n var message = _ref6.message;\n var assert = _ref6.assert;\n\n this._ui.$errorsWrapper.addClass('filled').find('.parsley-' + name).html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function _removeError(name) {\n this._ui.$errorClassHandler.removeAttr('aria-describedby');\n this._ui.$errorsWrapper.removeClass('filled').find('.parsley-' + name).remove();\n },\n\n _getErrorMessage: function _getErrorMessage(constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage]) return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function _buildUI() {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled) return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.element.setAttribute(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function _manageClassHandler() {\n // Class handled could also be determined by function given in Parsley options\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length) return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handlerFunction = this.options.classHandler;\n\n // It might also be the function name of a global function\n if ('string' === typeof this.options.classHandler && 'function' === typeof window[this.options.classHandler]) $handlerFunction = window[this.options.classHandler];\n\n if ('function' === typeof $handlerFunction) {\n var $handler = $handlerFunction.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length) return $handler;\n } else if ('object' === typeof $handlerFunction && $handlerFunction instanceof jQuery && $handlerFunction.length) {\n return $handlerFunction;\n } else if ($handlerFunction) {\n Utils.warn('The class handler `' + $handlerFunction + '` does not exist in DOM nor as a global JS function');\n }\n\n return this._inputHolder();\n },\n\n _inputHolder: function _inputHolder() {\n // if simple element (input, texatrea, select...) it will perfectly host the classes and precede the error container\n if (!this.options.multiple || this.element.nodeName === 'SELECT') return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function _insertErrorWrapper() {\n var $errorsContainer = this.options.errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length) return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof $errorsContainer) {\n if ($($errorsContainer).length) return $($errorsContainer).append(this._ui.$errorsWrapper);else if ('function' === typeof window[$errorsContainer]) $errorsContainer = window[$errorsContainer];else Utils.warn('The errors container `' + $errorsContainer + '` does not exist in DOM nor as a global JS function');\n }\n\n if ('function' === typeof $errorsContainer) $errorsContainer = $errorsContainer.call(this, this);\n\n if ('object' === typeof $errorsContainer && $errorsContainer.length) return $errorsContainer.append(this._ui.$errorsWrapper);\n\n return this._inputHolder().after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function _actualizeTriggers() {\n var _this3 = this;\n\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce) $toBind.on(Utils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), function () {\n _this3._validateIfNeeded();\n });else if (trigger = Utils.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, function (event) {\n _this3._validateIfNeeded(event);\n });\n }\n },\n\n _validateIfNeeded: function _validateIfNeeded(event) {\n var _this4 = this;\n\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (event && /key|input/.test(event.type)) if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold) return;\n\n if (this.options.debounce) {\n window.clearTimeout(this._debounced);\n this._debounced = window.setTimeout(function () {\n return _this4.validate();\n }, this.options.debounce);\n } else this.validate();\n },\n\n _resetUI: function _resetUI() {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui) return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper.removeClass('filled').children().remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function _destroyUI() {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui) this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function _successClass() {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function _errorClass() {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function _resetClass() {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n };\n\n var Form = function Form(element, domOptions, options) {\n this.__class__ = 'Form';\n\n this.element = element;\n this.$element = $(element);\n this.domOptions = domOptions;\n this.options = options;\n this.parent = window.Parsley;\n\n this.fields = [];\n this.validationResult = null;\n };\n\n var Form__statusMapping = { pending: null, resolved: true, rejected: false };\n\n Form.prototype = {\n onSubmitValidate: function onSubmitValidate(event) {\n var _this5 = this;\n\n // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley) return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var submitSource = this._submitSource || this.$element.find(Utils._SubmitSelector)[0];\n this._submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if (submitSource && null !== submitSource.getAttribute('formnovalidate')) return;\n\n window.Parsley._remoteCache = {};\n\n var promise = this.whenValidate({ event: event });\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state()) promise.done(function () {\n _this5._submit(submitSource);\n });\n }\n },\n\n onSubmitButton: function onSubmitButton(event) {\n this._submitSource = event.currentTarget;\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function _submit(submitSource) {\n if (false === this._trigger('submit')) return;\n // Add submit button's data\n if (submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length) $synthetic = $('<input class=\"parsley-synthetic-submit-button\" type=\"hidden\">').appendTo(this.$element);\n $synthetic.attr({\n name: submitSource.getAttribute('name'),\n value: submitSource.getAttribute('value')\n });\n }\n\n this.$element.trigger(_extends($.Event('submit'), { parsley: true }));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function validate(options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n\n var _arguments = _slice.call(arguments);\n\n var group = _arguments[0];\n var force = _arguments[1];\n var event = _arguments[2];\n\n options = { group: group, force: force, event: event };\n }\n return Form__statusMapping[this.whenValidate(options).state()];\n },\n\n whenValidate: function whenValidate() {\n var _Utils$all$done$fail$always,\n _this6 = this;\n\n var _ref7 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var group = _ref7.group;\n var force = _ref7.force;\n var event = _ref7.event;\n\n this.submitEvent = event;\n if (event) {\n this.submitEvent = _extends({}, event, { preventDefault: function preventDefault() {\n Utils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n _this6.validationResult = false;\n } });\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(function () {\n return $.map(_this6.fields, function (field) {\n return field.whenValidate({ force: force, group: group });\n });\n });\n\n return (_Utils$all$done$fail$always = Utils.all(promises).done(function () {\n _this6._trigger('success');\n }).fail(function () {\n _this6.validationResult = false;\n _this6.focus();\n _this6._trigger('error');\n }).always(function () {\n _this6._trigger('validated');\n })).pipe.apply(_Utils$all$done$fail$always, _toConsumableArray(this._pipeAccordingToValidationResult()));\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function isValid(options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n\n var _arguments2 = _slice.call(arguments);\n\n var group = _arguments2[0];\n var force = _arguments2[1];\n\n options = { group: group, force: force };\n }\n return Form__statusMapping[this.whenValid(options).state()];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function whenValid() {\n var _this7 = this;\n\n var _ref8 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var group = _ref8.group;\n var force = _ref8.force;\n\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(function () {\n return $.map(_this7.fields, function (field) {\n return field.whenValid({ group: group, force: force });\n });\n });\n return Utils.all(promises);\n },\n\n refresh: function refresh() {\n this._refreshFields();\n return this;\n },\n\n // Reset UI\n reset: function reset() {\n // Form case: emit a reset event for each field\n for (var i = 0; i < this.fields.length; i++) this.fields[i].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function destroy() {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n\n // Form case: destroy all its fields and then destroy stored instance\n for (var i = 0; i < this.fields.length; i++) this.fields[i].destroy();\n\n this.$element.removeData('Parsley');\n this._trigger('destroy');\n },\n\n _refreshFields: function _refreshFields() {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function _bindFields() {\n var _this8 = this;\n\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(function () {\n _this8.$element.find(_this8.options.inputs).not(_this8.options.excluded).each(function (_, element) {\n var fieldInstance = new window.Parsley.Factory(element, {}, _this8);\n\n // Only add valid and not excluded `Field` and `FieldMultiple` children\n if (('Field' === fieldInstance.__class__ || 'FieldMultiple' === fieldInstance.__class__) && true !== fieldInstance.options.excluded) {\n var uniqueId = fieldInstance.__class__ + '-' + fieldInstance.__id__;\n if ('undefined' === typeof _this8.fieldsMappedById[uniqueId]) {\n _this8.fieldsMappedById[uniqueId] = fieldInstance;\n _this8.fields.push(fieldInstance);\n }\n }\n });\n\n $.each(Utils.difference(oldFields, _this8.fields), function (_, field) {\n field.reset();\n });\n });\n return this;\n },\n\n // Internal only.\n // Looping on a form's fields to do validation or similar\n // will trigger reactualizing options on all of them, which\n // in turn will reactualize the form's options.\n // To avoid calling actualizeOptions so many times on the form\n // for nothing, _withoutReactualizingFormOptions temporarily disables\n // the method actualizeOptions on this form while `fn` is called.\n _withoutReactualizingFormOptions: function _withoutReactualizingFormOptions(fn) {\n var oldActualizeOptions = this.actualizeOptions;\n this.actualizeOptions = function () {\n return this;\n };\n var result = fn();\n this.actualizeOptions = oldActualizeOptions;\n return result;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n // Returns true iff event is not interrupted and default not prevented.\n _trigger: function _trigger(eventName) {\n return this.trigger('form:' + eventName);\n }\n\n };\n\n var Constraint = function Constraint(parsleyField, name, requirements, priority, isDomConstraint) {\n var validatorSpec = window.Parsley._validatorRegistry.validators[name];\n var validator = new Validator(validatorSpec);\n priority = priority || parsleyField.options[name + 'Priority'] || validator.priority;\n isDomConstraint = true === isDomConstraint;\n\n _extends(this, {\n validator: validator,\n name: name,\n requirements: requirements,\n priority: priority,\n isDomConstraint: isDomConstraint\n });\n this._parseRequirements(parsleyField.options);\n };\n\n var capitalize = function capitalize(str) {\n var cap = str[0].toUpperCase();\n return cap + str.slice(1);\n };\n\n Constraint.prototype = {\n validate: function validate(value, instance) {\n var _validator;\n\n return (_validator = this.validator).validate.apply(_validator, [value].concat(_toConsumableArray(this.requirementList), [instance]));\n },\n\n _parseRequirements: function _parseRequirements(options) {\n var _this9 = this;\n\n this.requirementList = this.validator.parseRequirements(this.requirements, function (key) {\n return options[_this9.name + capitalize(key)];\n });\n }\n };\n\n var Field = function Field(field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'Field';\n\n this.element = field;\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n };\n\n var parsley_field__statusMapping = { pending: null, resolved: true, rejected: false };\n\n Field.prototype = {\n // # Public API\n // Validate field and trigger some events for mainly `UI`\n // @returns `true`, an array of the validators that failed, or\n // `null` if validation is not finished. Prefer using whenValidate\n validate: function validate(options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = { options: options };\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending':\n return null;\n case 'resolved':\n return true;\n case 'rejected':\n return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `UI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function whenValidate() {\n var _whenValid$always$done$fail$always,\n _this10 = this;\n\n var _ref9 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var force = _ref9.force;\n var group = _ref9.group;\n\n // do not validate a field if not the same as given validation group\n this.refresh();\n if (group && !this._isInGroup(group)) return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return (_whenValid$always$done$fail$always = this.whenValid({ force: force, value: this.value, _refreshed: true }).always(function () {\n _this10._reflowUI();\n }).done(function () {\n _this10._trigger('success');\n }).fail(function () {\n _this10._trigger('error');\n }).always(function () {\n _this10._trigger('validated');\n })).pipe.apply(_whenValid$always$done$fail$always, _toConsumableArray(this._pipeAccordingToValidationResult()));\n },\n\n hasConstraints: function hasConstraints() {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function needsValidation(value) {\n if ('undefined' === typeof value) value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty) return false;\n\n return true;\n },\n\n _isInGroup: function _isInGroup(group) {\n if (Array.isArray(this.options.group)) return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function isValid(options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n\n var _arguments3 = _slice.call(arguments);\n\n var force = _arguments3[0];\n var value = _arguments3[1];\n\n options = { force: force, value: value };\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return parsley_field__statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function whenValid() {\n var _this11 = this;\n\n var _ref10 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var _ref10$force = _ref10.force;\n var force = _ref10$force === undefined ? false : _ref10$force;\n var value = _ref10.value;\n var group = _ref10.group;\n var _refreshed = _ref10._refreshed;\n\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed) this.refresh();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group)) return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints()) return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value) value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force) return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, function (_, constraints) {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = Utils.all($.map(constraints, function (constraint) {\n return _this11._validateConstraint(value, constraint);\n }));\n promises.push(promise);\n if (promise.state() === 'rejected') return false; // Interrupt processing if a group has already failed\n });\n return Utils.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function _validateConstraint(value, constraint) {\n var _this12 = this;\n\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result) result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return Utils.all([result]).fail(function (errorMessage) {\n if (!(_this12.validationResult instanceof Array)) _this12.validationResult = [];\n _this12.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function getValue() {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value) value = this.options.value(this);else if ('undefined' !== typeof this.options.value) value = this.options.value;else value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value) return '';\n\n return this._handleWhitespace(value);\n },\n\n // Reset UI\n reset: function reset() {\n this._resetUI();\n return this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function destroy() {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n this.$element.removeData('Parsley');\n this.$element.removeData('FieldMultiple');\n this._trigger('destroy');\n },\n\n // Actualize options and rebind constraints\n refresh: function refresh() {\n this._refreshConstraints();\n return this;\n },\n\n _refreshConstraints: function _refreshConstraints() {\n return this.actualizeOptions()._bindConstraints();\n },\n\n refreshConstraints: function refreshConstraints() {\n Utils.warnOnce(\"Parsley's refreshConstraints is deprecated. Please use refresh\");\n return this.refresh();\n },\n\n /**\n * Add a new constraint to a field\n *\n * @param {String} name\n * @param {Mixed} requirements optional\n * @param {Number} priority optional\n * @param {Boolean} isDomConstraint optional\n */\n addConstraint: function addConstraint(name, requirements, priority, isDomConstraint) {\n\n if (window.Parsley._validatorRegistry.validators[name]) {\n var constraint = new Constraint(this, name, requirements, priority, isDomConstraint);\n\n // if constraint already exist, delete it and push new version\n if ('undefined' !== this.constraintsByName[constraint.name]) this.removeConstraint(constraint.name);\n\n this.constraints.push(constraint);\n this.constraintsByName[constraint.name] = constraint;\n }\n\n return this;\n },\n\n // Remove a constraint\n removeConstraint: function removeConstraint(name) {\n for (var i = 0; i < this.constraints.length; i++) if (name === this.constraints[i].name) {\n this.constraints.splice(i, 1);\n break;\n }\n delete this.constraintsByName[name];\n return this;\n },\n\n // Update a constraint (Remove + re-add)\n updateConstraint: function updateConstraint(name, parameters, priority) {\n return this.removeConstraint(name).addConstraint(name, parameters, priority);\n },\n\n // # Internals\n\n // Internal only.\n // Bind constraints from config + options + DOM\n _bindConstraints: function _bindConstraints() {\n var constraints = [];\n var constraintsByName = {};\n\n // clean all existing DOM constraints to only keep javascript user constraints\n for (var i = 0; i < this.constraints.length; i++) if (false === this.constraints[i].isDomConstraint) {\n constraints.push(this.constraints[i]);\n constraintsByName[this.constraints[i].name] = this.constraints[i];\n }\n\n this.constraints = constraints;\n this.constraintsByName = constraintsByName;\n\n // then re-add Parsley DOM-API constraints\n for (var name in this.options) this.addConstraint(name, this.options[name], undefined, true);\n\n // finally, bind special HTML5 constraints\n return this._bindHtml5Constraints();\n },\n\n // Internal only.\n // Bind specific HTML5 constraints to be HTML5 compliant\n _bindHtml5Constraints: function _bindHtml5Constraints() {\n // html5 required\n if (null !== this.element.getAttribute('required')) this.addConstraint('required', true, undefined, true);\n\n // html5 pattern\n if (null !== this.element.getAttribute('pattern')) this.addConstraint('pattern', this.element.getAttribute('pattern'), undefined, true);\n\n // range\n var min = this.element.getAttribute('min');\n var max = this.element.getAttribute('max');\n if (null !== min && null !== max) this.addConstraint('range', [min, max], undefined, true);\n\n // HTML5 min\n else if (null !== min) this.addConstraint('min', min, undefined, true);\n\n // HTML5 max\n else if (null !== max) this.addConstraint('max', max, undefined, true);\n\n // length\n if (null !== this.element.getAttribute('minlength') && null !== this.element.getAttribute('maxlength')) this.addConstraint('length', [this.element.getAttribute('minlength'), this.element.getAttribute('maxlength')], undefined, true);\n\n // HTML5 minlength\n else if (null !== this.element.getAttribute('minlength')) this.addConstraint('minlength', this.element.getAttribute('minlength'), undefined, true);\n\n // HTML5 maxlength\n else if (null !== this.element.getAttribute('maxlength')) this.addConstraint('maxlength', this.element.getAttribute('maxlength'), undefined, true);\n\n // html5 types\n var type = Utils.getType(this.element);\n\n // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n if ('number' === type) {\n return this.addConstraint('type', ['number', {\n step: this.element.getAttribute('step') || '1',\n base: min || this.element.getAttribute('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range|date)$/i.test(type)) {\n return this.addConstraint('type', type, undefined, true);\n }\n return this;\n },\n\n // Internal only.\n // Field is required if have required constraint without `false` value\n _isRequired: function _isRequired() {\n if ('undefined' === typeof this.constraintsByName.required) return false;\n\n return false !== this.constraintsByName.required.requirements;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n _trigger: function _trigger(eventName) {\n return this.trigger('field:' + eventName);\n },\n\n // Internal only\n // Handles whitespace in a value\n // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n _handleWhitespace: function _handleWhitespace(value) {\n if (true === this.options.trimValue) Utils.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n if ('squish' === this.options.whitespace) value = value.replace(/\\s{2,}/g, ' ');\n\n if ('trim' === this.options.whitespace || 'squish' === this.options.whitespace || true === this.options.trimValue) value = Utils.trimString(value);\n\n return value;\n },\n\n _isDateInput: function _isDateInput() {\n var c = this.constraintsByName.type;\n return c && c.requirements === 'date';\n },\n\n // Internal only.\n // Returns the constraints, grouped by descending priority.\n // The result is thus an array of arrays of constraints.\n _getGroupedConstraints: function _getGroupedConstraints() {\n if (false === this.options.priorityEnabled) return [this.constraints];\n\n var groupedConstraints = [];\n var index = {};\n\n // Create array unique of priorities\n for (var i = 0; i < this.constraints.length; i++) {\n var p = this.constraints[i].priority;\n if (!index[p]) groupedConstraints.push(index[p] = []);\n index[p].push(this.constraints[i]);\n }\n // Sort them by priority DESC\n groupedConstraints.sort(function (a, b) {\n return b[0].priority - a[0].priority;\n });\n\n return groupedConstraints;\n }\n\n };\n\n var parsley_field = Field;\n\n var Multiple = function Multiple() {\n this.__class__ = 'FieldMultiple';\n };\n\n Multiple.prototype = {\n // Add new `$element` sibling for multiple field\n addElement: function addElement($element) {\n this.$elements.push($element);\n\n return this;\n },\n\n // See `Field._refreshConstraints()`\n _refreshConstraints: function _refreshConstraints() {\n var fieldConstraints;\n\n this.constraints = [];\n\n // Select multiple special treatment\n if (this.element.nodeName === 'SELECT') {\n this.actualizeOptions()._bindConstraints();\n\n return this;\n }\n\n // Gather all constraints for each input in the multiple group\n for (var i = 0; i < this.$elements.length; i++) {\n\n // Check if element have not been dynamically removed since last binding\n if (!$('html').has(this.$elements[i]).length) {\n this.$elements.splice(i, 1);\n continue;\n }\n\n fieldConstraints = this.$elements[i].data('FieldMultiple')._refreshConstraints().constraints;\n\n for (var j = 0; j < fieldConstraints.length; j++) this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n }\n\n return this;\n },\n\n // See `Field.getValue()`\n getValue: function getValue() {\n // Value could be overriden in DOM\n if ('function' === typeof this.options.value) return this.options.value(this);else if ('undefined' !== typeof this.options.value) return this.options.value;\n\n // Radio input case\n if (this.element.nodeName === 'INPUT') {\n var type = Utils.getType(this.element);\n if (type === 'radio') return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (type === 'checkbox') {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n }\n\n // Select multiple case\n if (this.element.nodeName === 'SELECT' && null === this.$element.val()) return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function _init() {\n this.$elements = [this.$element];\n\n return this;\n }\n };\n\n var Factory = function Factory(element, options, parsleyFormInstance) {\n this.element = element;\n this.$element = $(element);\n\n // If the element has already been bound, returns its saved Parsley instance\n var savedparsleyFormInstance = this.$element.data('Parsley');\n if (savedparsleyFormInstance) {\n\n // If the saved instance has been bound without a Form parent and there is one given in this call, add it\n if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n savedparsleyFormInstance.parent = parsleyFormInstance;\n savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n }\n\n if ('object' === typeof options) {\n _extends(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length) throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && 'Form' !== parsleyFormInstance.__class__) throw new Error('Parent instance must be a Form instance');\n\n this.parent = parsleyFormInstance || window.Parsley;\n return this.init(options);\n };\n\n Factory.prototype = {\n init: function init(options) {\n this.__class__ = 'Parsley';\n this.__version__ = '2.8.1';\n this.__id__ = Utils.generateID();\n\n // Pre-compute options\n this._resetOptions(options);\n\n // A Form instance is obviously a `<form>` element but also every node that is not an input and has the `data-parsley-validate` attribute\n if (this.element.nodeName === 'FORM' || Utils.checkAttr(this.element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)) return this.bind('parsleyForm');\n\n // Every other element is bound as a `Field` or `FieldMultiple`\n return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n },\n\n isMultiple: function isMultiple() {\n var type = Utils.getType(this.element);\n return type === 'radio' || type === 'checkbox' || this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple');\n },\n\n // Multiples fields are a real nightmare :(\n // Maybe some refactoring would be appreciated here...\n handleMultiple: function handleMultiple() {\n var _this13 = this;\n\n var name;\n var multiple;\n var parsleyMultipleInstance;\n\n // Handle multiple name\n this.options.multiple = this.options.multiple || (name = this.element.getAttribute('name')) || this.element.getAttribute('id');\n\n // Special select multiple input\n if (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')) {\n this.options.multiple = this.options.multiple || this.__id__;\n return this.bind('parsleyFieldMultiple');\n\n // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n } else if (!this.options.multiple) {\n Utils.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n return this;\n }\n\n // Remove special chars\n this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, '');\n\n // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n if (name) {\n $('input[name=\"' + name + '\"]').each(function (i, input) {\n var type = Utils.getType(input);\n if (type === 'radio' || type === 'checkbox') input.setAttribute(_this13.options.namespace + 'multiple', _this13.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('FieldMultiple')) {\n parsleyMultipleInstance.addElement(this.$element);\n }\n\n break;\n }\n }\n\n // Create a secret Field instance for every multiple field. It will be stored in `data('FieldMultiple')`\n // And will be useful later to access classic `Field` stuff while being in a `FieldMultiple` instance\n this.bind('parsleyField', true);\n\n return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n },\n\n // Return proper `Form`, `Field` or `FieldMultiple`\n bind: function bind(type, doNotStore) {\n var parsleyInstance;\n\n switch (type) {\n case 'parsleyForm':\n parsleyInstance = $.extend(new Form(this.element, this.domOptions, this.options), new Base(), window.ParsleyExtend)._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(new parsley_field(this.element, this.domOptions, this.options, this.parent), new Base(), window.ParsleyExtend);\n break;\n case 'parsleyFieldMultiple':\n parsleyInstance = $.extend(new parsley_field(this.element, this.domOptions, this.options, this.parent), new Multiple(), new Base(), window.ParsleyExtend)._init();\n break;\n default:\n throw new Error(type + 'is not a supported Parsley type');\n }\n\n if (this.options.multiple) Utils.setAttr(this.element, this.options.namespace, 'multiple', this.options.multiple);\n\n if ('undefined' !== typeof doNotStore) {\n this.$element.data('FieldMultiple', parsleyInstance);\n\n return parsleyInstance;\n }\n\n // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n this.$element.data('Parsley', parsleyInstance);\n\n // Tell the world we have a new Form or Field instance!\n parsleyInstance._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n };\n\n var vernums = $.fn.jquery.split('.');\n if (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n }\n if (!vernums.forEach) {\n Utils.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n }\n // Inherit `on`, `off` & `trigger` to Parsley:\n var Parsley = _extends(new Base(), {\n element: document,\n $element: $(document),\n actualizeOptions: null,\n _resetOptions: null,\n Factory: Factory,\n version: '2.8.1'\n });\n\n // Supplement Field and Form with Base\n // This way, the constructors will have access to those methods\n _extends(parsley_field.prototype, UI.Field, Base.prototype);\n _extends(Form.prototype, UI.Form, Base.prototype);\n // Inherit actualizeOptions and _resetOptions:\n _extends(Factory.prototype, Base.prototype);\n\n // ### jQuery API\n // `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n $.fn.parsley = $.fn.psly = function (options) {\n if (this.length > 1) {\n var instances = [];\n\n this.each(function () {\n instances.push($(this).parsley(options));\n });\n\n return instances;\n }\n\n // Return undefined if applied to non existing DOM element\n if (this.length == 0) {\n return;\n }\n\n return new Factory(this[0], options);\n };\n\n // ### Field and Form extension\n // Ensure the extension is now defined if it wasn't previously\n if ('undefined' === typeof window.ParsleyExtend) window.ParsleyExtend = {};\n\n // ### Parsley config\n // Inherit from ParsleyDefault, and copy over any existing values\n Parsley.options = _extends(Utils.objectCreate(Defaults), window.ParsleyConfig);\n window.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n // ### Globals\n window.Parsley = window.psly = Parsley;\n Parsley.Utils = Utils;\n window.ParsleyUtils = {};\n $.each(Utils, function (key, value) {\n if ('function' === typeof value) {\n window.ParsleyUtils[key] = function () {\n Utils.warnOnce('Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.');\n return Utils[key].apply(Utils, arguments);\n };\n }\n });\n\n // ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\n var registry = window.Parsley._validatorRegistry = new ValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\n window.ParsleyValidator = {};\n $.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator hasValidator'.split(' '), function (i, method) {\n window.Parsley[method] = function () {\n return registry[method].apply(registry, arguments);\n };\n window.ParsleyValidator[method] = function () {\n var _window$Parsley;\n\n Utils.warnOnce('Accessing the method \\'' + method + '\\' through Validator is deprecated. Simply call \\'window.Parsley.' + method + '(...)\\'');\n return (_window$Parsley = window.Parsley)[method].apply(_window$Parsley, arguments);\n };\n });\n\n // ### UI\n // Deprecated global object\n window.Parsley.UI = UI;\n window.ParsleyUI = {\n removeError: function removeError(instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce('Accessing UI is deprecated. Call \\'removeError\\' on the instance directly. Please comment in issue 1073 as to your need to call this method.');\n return instance.removeError(name, { updateClass: updateClass });\n },\n getErrorsMessages: function getErrorsMessages(instance) {\n Utils.warnOnce('Accessing UI is deprecated. Call \\'getErrorsMessages\\' on the instance directly.');\n return instance.getErrorsMessages();\n }\n };\n $.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce('Accessing UI is deprecated. Call \\'' + method + '\\' on the instance directly. Please comment in issue 1073 as to your need to call this method.');\n return instance[method](name, { message: message, assert: assert, updateClass: updateClass });\n };\n });\n\n // ### PARSLEY auto-binding\n // Prevent it by setting `ParsleyConfig.autoBind` to `false`\n if (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length) $('[data-parsley-validate]').parsley();\n });\n }\n\n var o = $({});\n var deprecated = function deprecated() {\n Utils.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n };\n\n // Returns an event handler that calls `fn` with the arguments it expects\n function adapt(fn, context) {\n // Store to allow unbinding\n if (!fn.parsleyAdaptedCallback) {\n fn.parsleyAdaptedCallback = function () {\n var args = Array.prototype.slice.call(arguments, 0);\n args.unshift(this);\n fn.apply(context || o, args);\n };\n }\n return fn.parsleyAdaptedCallback;\n }\n\n var eventPrefix = 'parsley:';\n // Converts 'parsley:form:validate' into 'form:validate'\n function eventName(name) {\n if (name.lastIndexOf(eventPrefix, 0) === 0) return name.substr(eventPrefix.length);\n return name;\n }\n\n // $.listen is deprecated. Use Parsley.on instead.\n $.listen = function (name, callback) {\n var context;\n deprecated();\n if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n context = arguments[1];\n callback = arguments[2];\n }\n\n if ('function' !== typeof callback) throw new Error('Wrong parameters');\n\n window.Parsley.on(eventName(name), adapt(callback, context));\n };\n\n $.listenTo = function (instance, name, fn) {\n deprecated();\n if (!(instance instanceof parsley_field) && !(instance instanceof Form)) throw new Error('Must give Parsley instance');\n\n if ('string' !== typeof name || 'function' !== typeof fn) throw new Error('Wrong parameters');\n\n instance.on(eventName(name), adapt(fn));\n };\n\n $.unsubscribe = function (name, fn) {\n deprecated();\n if ('string' !== typeof name || 'function' !== typeof fn) throw new Error('Wrong arguments');\n window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n };\n\n $.unsubscribeTo = function (instance, name) {\n deprecated();\n if (!(instance instanceof parsley_field) && !(instance instanceof Form)) throw new Error('Must give Parsley instance');\n instance.off(eventName(name));\n };\n\n $.unsubscribeAll = function (name) {\n deprecated();\n window.Parsley.off(eventName(name));\n $('form,input,textarea,select').each(function () {\n var instance = $(this).data('Parsley');\n if (instance) {\n instance.off(eventName(name));\n }\n });\n };\n\n // $.emit is deprecated. Use jQuery events instead.\n $.emit = function (name, instance) {\n var _instance;\n\n deprecated();\n var instanceGiven = instance instanceof parsley_field || instance instanceof Form;\n var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n args.unshift(eventName(name));\n if (!instanceGiven) {\n instance = window.Parsley;\n }\n (_instance = instance).trigger.apply(_instance, _toConsumableArray(args));\n };\n\n var pubsub = {};\n\n $.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function fn(xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function fn(xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function addAsyncValidator(name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n });\n\n Parsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function validateString(value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator]) throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.element.getAttribute('name') || instance.element.getAttribute('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {}, Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache) Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function handleXhr() {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n });\n\n Parsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n });\n\n Base.prototype.addAsyncValidator = function () {\n Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator.apply(Parsley, arguments);\n };\n\n // This is included with the Parsley library itself,\n // thus there is no use in adding it to your project.\n Parsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n });\n\n Parsley.setLocale('en');\n\n /**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune <github@marc-andre.ca>\n * @license MIT\n */\n\n function InputEvent() {\n var _this14 = this;\n\n var globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n _extends(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: function isNativeEvent(evt) {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: function fakeInputEvent(evt) {\n if (_this14.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: function misbehaves(evt) {\n if (_this14.isNativeEvent(evt)) {\n _this14.behavesOk(evt);\n $(document).on('change.inputevent', evt.data.selector, _this14.fakeInputEvent);\n _this14.fakeInputEvent(evt);\n }\n },\n\n behavesOk: function behavesOk(evt) {\n if (_this14.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, _this14.behavesOk).off('change.inputevent', evt.data.selector, _this14.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: function install() {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n var _arr = ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]'];\n for (var _i = 0; _i < _arr.length; _i++) {\n var selector = _arr[_i];\n $(document).on('input.inputevent', selector, { selector: selector }, _this14.behavesOk).on('change.inputevent', selector, { selector: selector }, _this14.misbehaves);\n }\n },\n\n uninstall: function uninstall() {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n };\n\n var inputevent = new InputEvent();\n\n inputevent.install();\n\n var parsley = Parsley;\n\n return parsley;\n});\n//# sourceMappingURL=parsley.js.map\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :\n typeof define === 'function' && define.amd ? define(['jquery'], factory) :\n global.parsley = factory(global.$)\n}(this, function ($) { 'use strict';\n\n var globalID = 1;\n var pastWarnings = {};\n\n var Utils = {\n // Parsley DOM-API\n // returns object from dom attributes and values\n attr: function (element, namespace, obj) {\n var i;\n var attribute;\n var attributes;\n var regex = new RegExp('^' + namespace, 'i');\n\n if ('undefined' === typeof obj)\n obj = {};\n else {\n // Clear all own properties. This won't affect prototype's values\n for (i in obj) {\n if (obj.hasOwnProperty(i))\n delete obj[i];\n }\n }\n\n if (!element)\n return obj;\n\n attributes = element.attributes;\n for (i = attributes.length; i--; ) {\n attribute = attributes[i];\n\n if (attribute && attribute.specified && regex.test(attribute.name)) {\n obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n }\n }\n\n return obj;\n },\n\n checkAttr: function (element, namespace, checkAttr) {\n return element.hasAttribute(namespace + checkAttr);\n },\n\n setAttr: function (element, namespace, attr, value) {\n element.setAttribute(this.dasherize(namespace + attr), String(value));\n },\n\n getType: function(element) {\n return element.getAttribute('type') || 'text';\n },\n\n generateID: function () {\n return '' + globalID++;\n },\n\n /** Third party functions **/\n deserializeValue: function (value) {\n var num;\n\n try {\n return value ?\n value == \"true\" ||\n (value == \"false\" ? false :\n value == \"null\" ? null :\n !isNaN(num = Number(value)) ? num :\n /^[\\[\\{]/.test(value) ? JSON.parse(value) :\n value)\n : value;\n } catch (e) { return value; }\n },\n\n // Zepto camelize function\n camelize: function (str) {\n return str.replace(/-+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n });\n },\n\n // Zepto dasherize function\n dasherize: function (str) {\n return str.replace(/::/g, '/')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n .replace(/_/g, '-')\n .toLowerCase();\n },\n\n warn: function () {\n if (window.console && 'function' === typeof window.console.warn)\n window.console.warn(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n parse: {\n date: function(string) {\n let parsed = string.match(/^(\\d{4,})-(\\d\\d)-(\\d\\d)$/);\n if (!parsed)\n return null;\n let [_, year, month, day] = parsed.map(x => parseInt(x, 10));\n let date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day)\n return null;\n return date;\n },\n string: function(string) {\n return string;\n },\n integer: function(string) {\n if (isNaN(string))\n return null;\n return parseInt(string, 10);\n },\n number: function(string) {\n if (isNaN(string))\n throw null;\n return parseFloat(string);\n },\n 'boolean': function _boolean(string) {\n return !(/^\\s*false\\s*$/i.test(string));\n },\n object: function(string) {\n return Utils.deserializeValue(string);\n },\n regexp: function(regexp) {\n var flags = '';\n\n // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n if (/^\\/.*\\/(?:[gimy]*)$/.test(regexp)) {\n // Replace the regexp literal string with the first match group: ([gimy]*)\n // If no flag is present, this will be a blank string\n flags = regexp.replace(/.*\\/([gimy]*)$/, '$1');\n // Again, replace the regexp literal string with the first match group:\n // everything excluding the opening and closing slashes and the flags\n regexp = regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n } else {\n // Anchor regexp:\n regexp = '^' + regexp + '$';\n }\n return new RegExp(regexp, flags);\n }\n },\n\n parseRequirement: function(requirementType, string) {\n var converter = this.parse[requirementType || 'string'];\n if (!converter)\n throw 'Unknown requirement specification: \"' + requirementType + '\"';\n let converted = converter(string);\n if (converted === null)\n throw `Requirement is not a ${requirementType}: \"${string}\"`;\n return converted;\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })(),\n\n _SubmitSelector: 'input[type=\"submit\"], button:submit'\n };\n\n // All these options could be overriden and specified directly in DOM using\n // `data-parsley-` default DOM-API\n // eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n // eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n\n var Defaults = {\n // ### General\n\n // Default data-namespace for DOM API\n namespace: 'data-parsley-',\n\n // Supported inputs by default\n inputs: 'input, textarea, select',\n\n // Excluded inputs by default\n excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n\n // Stop validating field on highest priority failing constraint\n priorityEnabled: true,\n\n // ### Field only\n\n // identifier used to group together inputs (e.g. radio buttons...)\n multiple: null,\n\n // identifier (or array of identifiers) used to validate only a select group of inputs\n group: null,\n\n // ### UI\n // Enable\\Disable error messages\n uiEnabled: true,\n\n // Key events threshold before validation\n validationThreshold: 3,\n\n // Focused field on form validation error. 'first'|'last'|'none'\n focus: 'first',\n\n // event(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (Field) {},\n\n // Return the `$element` where errors will be appended\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n errorsContainer: function (Field) {},\n\n // ul elem that would receive errors' list\n errorsWrapper: '<ul class=\"parsley-errors-list\"></ul>',\n\n // li elem that would receive error message\n errorTemplate: '<li></li>'\n };\n\n var Base = function () {\n this.__id__ = Utils.generateID();\n };\n\n Base.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n Utils.attr(this.element, this.options.namespace, this.domOptions);\n if (this.parent && this.parent.actualizeOptions)\n this.parent.actualizeOptions();\n return this;\n },\n\n _resetOptions: function (initOptions) {\n this.domOptions = Utils.objectCreate(this.parent.options);\n this.options = Utils.objectCreate(this.domOptions);\n // Shallow copy of ownProperties of initOptions:\n for (var i in initOptions) {\n if (initOptions.hasOwnProperty(i))\n this.options[i] = initOptions[i];\n }\n this.actualizeOptions();\n },\n\n _listeners: null,\n\n // Register a callback for the given event name\n // Callback is called with context as the first argument and the `this`\n // The context is the current parsley instance, or window.Parsley if global\n // A return value of `false` will interrupt the calls\n on: function (name, fn) {\n this._listeners = this._listeners || {};\n var queue = this._listeners[name] = this._listeners[name] || [];\n queue.push(fn);\n\n return this;\n },\n\n // Deprecated. Use `on` instead\n subscribe: function(name, fn) {\n $.listenTo(this, name.toLowerCase(), fn);\n },\n\n // Unregister a callback (or all if none is given) for the given event name\n off: function (name, fn) {\n var queue = this._listeners && this._listeners[name];\n if (queue) {\n if (!fn) {\n delete this._listeners[name];\n } else {\n for (var i = queue.length; i--; )\n if (queue[i] === fn)\n queue.splice(i, 1);\n }\n }\n return this;\n },\n\n // Deprecated. Use `off`\n unsubscribe: function(name, fn) {\n $.unsubscribeTo(this, name.toLowerCase());\n },\n\n // Trigger an event of the given name\n // A return value of `false` interrupts the callback chain\n // Returns false if execution was interrupted\n trigger: function (name, target, extraArg) {\n target = target || this;\n var queue = this._listeners && this._listeners[name];\n var result;\n var parentResult;\n if (queue) {\n for (var i = queue.length; i--; ) {\n result = queue[i].call(target, target, extraArg);\n if (result === false) return result;\n }\n }\n if (this.parent) {\n return this.parent.trigger(name, target, extraArg);\n }\n return true;\n },\n\n asyncIsValid: function (group, force) {\n Utils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n $(this.parent.element.querySelectorAll(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`))\n : this.$element;\n }\n };\n\n var convertArrayRequirement = function(string, length) {\n var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n if (!m)\n throw 'Requirement is not an array: \"' + string + '\"';\n var values = m[1].split(',').map(Utils.trimString);\n if (values.length !== length)\n throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n return values;\n };\n\n var convertExtraOptionRequirement = function(requirementSpec, string, extraOptionReader) {\n var main = null;\n var extra = {};\n for (var key in requirementSpec) {\n if (key) {\n var value = extraOptionReader(key);\n if ('string' === typeof value)\n value = Utils.parseRequirement(requirementSpec[key], value);\n extra[key] = value;\n } else {\n main = Utils.parseRequirement(requirementSpec[key], string);\n }\n }\n return [main, extra];\n };\n\n // A Validator needs to implement the methods `validate` and `parseRequirements`\n\n var Validator = function(spec) {\n $.extend(true, this, spec);\n };\n\n Validator.prototype = {\n // Returns `true` iff the given `value` is valid according the given requirements.\n validate: function(value, requirementFirstArg) {\n if (this.fn) { // Legacy style validator\n\n if (arguments.length > 3) // If more args then value, requirement, instance...\n requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest\n return this.fn(value, requirementFirstArg);\n }\n\n if (Array.isArray(value)) {\n if (!this.validateMultiple)\n throw 'Validator `' + this.name + '` does not handle multiple values';\n return this.validateMultiple(...arguments);\n } else {\n let instance = arguments[arguments.length - 1];\n if (this.validateDate && instance._isDateInput()) {\n arguments[0] = Utils.parse.date(arguments[0]);\n if (arguments[0] === null)\n return false;\n return this.validateDate(...arguments);\n }\n if (this.validateNumber) {\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return Array.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if (Array.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = Utils.parseRequirement(type[i], values[i]);\n return values;\n } else if ($.isPlainObject(type)) {\n return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n } else {\n return [Utils.parseRequirement(type, requirements)];\n }\n },\n // Defaults:\n requirementType: 'string',\n\n priority: 2\n\n };\n\n var ValidatorRegistry = function (validators, catalog) {\n this.__class__ = 'ValidatorRegistry';\n\n // Default Parsley locale is en\n this.locale = 'en';\n\n this.init(validators || {}, catalog || {});\n };\n\n var typeTesters = {\n email: /^((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n date: {\n test: value => Utils.parse.date(value) !== null\n },\n\n url: new RegExp(\n \"^\" +\n // protocol identifier\n \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\" +\n // IP address exclusion\n // private & local networks\n // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" + // ** mod: allow local networks\n // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n \"|\" +\n // host name\n \"(?:(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)\" +\n // domain name\n \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)*\" +\n // TLD identifier\n \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff]{2,}))\" +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:/\\\\S*)?\" +\n \"$\"\n )\n };\n typeTesters.range = typeTesters.number;\n\n // See http://stackoverflow.com/a/10454560/8279\n var decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n };\n\n // parseArguments('number', ['1', '2']) => [1, 2]\n let ValidatorRegistry__parseArguments = (type, args) => args.map(Utils.parse[type]);\n // operatorToValidator returns a validating function for an operator function, applied to the given type\n let ValidatorRegistry__operatorToValidator = (type, operator) => {\n return (value, ...requirementsAndInput) => {\n requirementsAndInput.pop(); // Get rid of `input` argument\n return operator(value, ...ValidatorRegistry__parseArguments(type, requirementsAndInput));\n };\n };\n\n let ValidatorRegistry__comparisonOperator = operator => ({\n validateDate: ValidatorRegistry__operatorToValidator('date', operator),\n validateNumber: ValidatorRegistry__operatorToValidator('number', operator),\n requirementType: operator.length <= 2 ? 'string' : ['string', 'string'], // Support operators with a 1 or 2 requirement(s)\n priority: 30\n });\n\n ValidatorRegistry.prototype = {\n init: function (validators, catalog) {\n this.catalog = catalog;\n // Copy prototype's validators:\n this.validators = Object.assign({}, this.validators);\n\n for (var name in validators)\n this.addValidator(name, validators[name].fn, validators[name].priority);\n\n window.Parsley.trigger('parsley:validator:init');\n },\n\n // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n setLocale: function (locale) {\n if ('undefined' === typeof this.catalog[locale])\n throw new Error(locale + ' is not available in the catalog');\n\n this.locale = locale;\n\n return this;\n },\n\n // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n addCatalog: function (locale, messages, set) {\n if ('object' === typeof messages)\n this.catalog[locale] = messages;\n\n if (true === set)\n return this.setLocale(locale);\n\n return this;\n },\n\n // Add a specific message for a given constraint in a given locale\n addMessage: function (locale, name, message) {\n if ('undefined' === typeof this.catalog[locale])\n this.catalog[locale] = {};\n\n this.catalog[locale][name] = message;\n\n return this;\n },\n\n // Add messages for a given locale\n addMessages: function (locale, nameMessageObject) {\n for (var name in nameMessageObject)\n this.addMessage(locale, name, nameMessageObject[name]);\n\n return this;\n },\n\n // Add a new validator\n //\n // addValidator('custom', {\n // requirementType: ['integer', 'integer'],\n // validateString: function(value, from, to) {},\n // priority: 22,\n // messages: {\n // en: \"Hey, that's no good\",\n // fr: \"Aye aye, pas bon du tout\",\n // }\n // })\n //\n // Old API was addValidator(name, function, priority)\n //\n addValidator: function (name, arg1, arg2) {\n if (this.validators[name])\n Utils.warn('Validator \"' + name + '\" is already defined.');\n else if (Defaults.hasOwnProperty(name)) {\n Utils.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n return;\n }\n return this._setValidator(...arguments);\n },\n\n hasValidator: function (name) {\n return !!this.validators[name];\n },\n\n updateValidator: function (name, arg1, arg2) {\n if (!this.validators[name]) {\n Utils.warn('Validator \"' + name + '\" is not already defined.');\n return this.addValidator(...arguments);\n }\n return this._setValidator(...arguments);\n },\n\n removeValidator: function (name) {\n if (!this.validators[name])\n Utils.warn('Validator \"' + name + '\" is not defined.');\n\n delete this.validators[name];\n\n return this;\n },\n\n _setValidator: function (name, validator, priority) {\n if ('object' !== typeof validator) {\n // Old style validator, with `fn` and `priority`\n validator = {\n fn: validator,\n priority: priority\n };\n }\n if (!validator.validate) {\n validator = new Validator(validator);\n }\n this.validators[name] = validator;\n\n for (var locale in validator.messages || {})\n this.addMessage(locale, name, validator.messages[locale]);\n\n return this;\n },\n\n getErrorMessage: function (constraint) {\n var message;\n\n // Type constraints are a bit different, we have to match their requirements too to find right error message\n if ('type' === constraint.name) {\n var typeMessages = this.catalog[this.locale][constraint.name] || {};\n message = typeMessages[constraint.requirements];\n } else\n message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n },\n\n // Kind of light `sprintf()` implementation\n formatMessage: function (string, parameters) {\n if ('object' === typeof parameters) {\n for (var i in parameters)\n string = this.formatMessage(string, parameters[i]);\n\n return string;\n }\n\n return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = 'any', base = 0} = {}) {\n var tester = typeTesters[type];\n if (!tester) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!tester.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: ValidatorRegistry__comparisonOperator((value, requirement) => value >= requirement),\n max: ValidatorRegistry__comparisonOperator((value, requirement) => value <= requirement),\n range: ValidatorRegistry__comparisonOperator((value, min, max) => value >= min && value <= max),\n equalto: {\n validateString: function (value, refOrValue) {\n var $reference = $(refOrValue);\n if ($reference.length)\n return value === $reference.val();\n else\n return value === refOrValue;\n },\n priority: 256\n }\n }\n };\n\n var UI = {};\n\n var diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n };\n\n UI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', Utils._SubmitSelector, evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.element.setAttribute('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n };\n\n UI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorClassHandler\n .attr('aria-describedby', this._ui.errorsWrapperId);\n this._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorClassHandler\n .removeAttr('aria-describedby');\n this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.element.setAttribute(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // Class handled could also be determined by function given in Parsley options\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handlerFunction = this.options.classHandler;\n\n // It might also be the function name of a global function\n if ('string' === typeof this.options.classHandler && 'function' === typeof window[this.options.classHandler])\n $handlerFunction = window[this.options.classHandler];\n\n if ('function' === typeof $handlerFunction) {\n var $handler = $handlerFunction.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n } else if ('object' === typeof $handlerFunction && $handlerFunction instanceof jQuery && $handlerFunction.length) {\n return $handlerFunction;\n } else if ($handlerFunction) {\n Utils.warn('The class handler `' + $handlerFunction + '` does not exist in DOM nor as a global JS function');\n }\n\n return this._inputHolder();\n },\n\n _inputHolder: function() {\n // if simple element (input, texatrea, select...) it will perfectly host the classes and precede the error container\n if (!this.options.multiple || this.element.nodeName === 'SELECT')\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer = this.options.errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof $errorsContainer) {\n if ($($errorsContainer).length)\n return $($errorsContainer).append(this._ui.$errorsWrapper);\n else if ('function' === typeof window[$errorsContainer])\n $errorsContainer = window[$errorsContainer];\n else\n Utils.warn('The errors container `' + $errorsContainer + '` does not exist in DOM nor as a global JS function');\n }\n\n if ('function' === typeof $errorsContainer)\n $errorsContainer = $errorsContainer.call(this, this);\n\n if ('object' === typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n return this._inputHolder().after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(Utils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this._validateIfNeeded();\n });\n else if (trigger = Utils.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._validateIfNeeded(event);\n });\n }\n },\n\n _validateIfNeeded: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (event && /key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n if (this.options.debounce) {\n window.clearTimeout(this._debounced);\n this._debounced = window.setTimeout(() => this.validate(), this.options.debounce);\n } else\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n };\n\n var Form = function (element, domOptions, options) {\n this.__class__ = 'Form';\n\n this.element = element;\n this.$element = $(element);\n this.domOptions = domOptions;\n this.options = options;\n this.parent = window.Parsley;\n\n this.fields = [];\n this.validationResult = null;\n };\n\n var Form__statusMapping = {pending: null, resolved: true, rejected: false};\n\n Form.prototype = {\n onSubmitValidate: function (event) {\n // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var submitSource = this._submitSource || this.$element.find(Utils._SubmitSelector)[0];\n this._submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if (submitSource && null !== submitSource.getAttribute('formnovalidate'))\n return;\n\n window.Parsley._remoteCache = {};\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit(submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._submitSource = event.currentTarget;\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function (submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if (submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('<input class=\"parsley-synthetic-submit-button\" type=\"hidden\">').appendTo(this.$element);\n $synthetic.attr({\n name: submitSource.getAttribute('name'),\n value: submitSource.getAttribute('value')\n });\n }\n\n this.$element.trigger(Object.assign($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return Form__statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = Object.assign({}, event, {preventDefault: () => {\n Utils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return Utils.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return Form__statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return Utils.all(promises);\n },\n\n refresh: function() {\n this._refreshFields();\n return this;\n },\n\n // Reset UI\n reset: function () {\n // Form case: emit a reset event for each field\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n\n // Form case: destroy all its fields and then destroy stored instance\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].destroy();\n\n this.$element.removeData('Parsley');\n this._trigger('destroy');\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `Field` and `FieldMultiple` children\n if (('Field' === fieldInstance.__class__ || 'FieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded)) {\n let uniqueId = fieldInstance.__class__ + '-' + fieldInstance.__id__;\n if ('undefined' === typeof this.fieldsMappedById[uniqueId]) {\n this.fieldsMappedById[uniqueId] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n }\n });\n\n $.each(Utils.difference(oldFields, this.fields), (_, field) => {\n field.reset();\n });\n });\n return this;\n },\n\n // Internal only.\n // Looping on a form's fields to do validation or similar\n // will trigger reactualizing options on all of them, which\n // in turn will reactualize the form's options.\n // To avoid calling actualizeOptions so many times on the form\n // for nothing, _withoutReactualizingFormOptions temporarily disables\n // the method actualizeOptions on this form while `fn` is called.\n _withoutReactualizingFormOptions: function (fn) {\n var oldActualizeOptions = this.actualizeOptions;\n this.actualizeOptions = function () { return this; };\n var result = fn();\n this.actualizeOptions = oldActualizeOptions;\n return result;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n // Returns true iff event is not interrupted and default not prevented.\n _trigger: function (eventName) {\n return this.trigger('form:' + eventName);\n }\n\n };\n\n const Constraint = function(parsleyField, name, requirements, priority, isDomConstraint) {\n const validatorSpec = window.Parsley._validatorRegistry.validators[name];\n const validator = new Validator(validatorSpec);\n priority = priority || parsleyField.options[name + 'Priority'] || validator.priority;\n isDomConstraint = (true === isDomConstraint);\n\n Object.assign(this, {\n validator,\n name,\n requirements,\n priority,\n isDomConstraint\n });\n this._parseRequirements(parsleyField.options);\n };\n\n const capitalize = function(str) {\n const cap = str[0].toUpperCase();\n return cap + str.slice(1);\n };\n\n Constraint.prototype = {\n validate: function(value, instance) {\n return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n };\n\n var Field = function (field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'Field';\n\n this.element = field;\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n };\n\n var parsley_field__statusMapping = {pending: null, resolved: true, rejected: false};\n\n Field.prototype = {\n // # Public API\n // Validate field and trigger some events for mainly `UI`\n // @returns `true`, an array of the validators that failed, or\n // `null` if validation is not finished. Prefer using whenValidate\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `UI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refresh();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if (Array.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return parsley_field__statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refresh();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = Utils.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return Utils.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return Utils.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // Reset UI\n reset: function () {\n this._resetUI();\n return this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n this.$element.removeData('Parsley');\n this.$element.removeData('FieldMultiple');\n this._trigger('destroy');\n },\n\n // Actualize options and rebind constraints\n refresh: function () {\n this._refreshConstraints();\n return this;\n },\n\n _refreshConstraints: function () {\n return this.actualizeOptions()._bindConstraints();\n },\n\n refreshConstraints: function() {\n Utils.warnOnce(\"Parsley's refreshConstraints is deprecated. Please use refresh\");\n return this.refresh();\n },\n\n /**\n * Add a new constraint to a field\n *\n * @param {String} name\n * @param {Mixed} requirements optional\n * @param {Number} priority optional\n * @param {Boolean} isDomConstraint optional\n */\n addConstraint: function (name, requirements, priority, isDomConstraint) {\n\n if (window.Parsley._validatorRegistry.validators[name]) {\n var constraint = new Constraint(this, name, requirements, priority, isDomConstraint);\n\n // if constraint already exist, delete it and push new version\n if ('undefined' !== this.constraintsByName[constraint.name])\n this.removeConstraint(constraint.name);\n\n this.constraints.push(constraint);\n this.constraintsByName[constraint.name] = constraint;\n }\n\n return this;\n },\n\n // Remove a constraint\n removeConstraint: function (name) {\n for (var i = 0; i < this.constraints.length; i++)\n if (name === this.constraints[i].name) {\n this.constraints.splice(i, 1);\n break;\n }\n delete this.constraintsByName[name];\n return this;\n },\n\n // Update a constraint (Remove + re-add)\n updateConstraint: function (name, parameters, priority) {\n return this.removeConstraint(name)\n .addConstraint(name, parameters, priority);\n },\n\n // # Internals\n\n // Internal only.\n // Bind constraints from config + options + DOM\n _bindConstraints: function () {\n var constraints = [];\n var constraintsByName = {};\n\n // clean all existing DOM constraints to only keep javascript user constraints\n for (var i = 0; i < this.constraints.length; i++)\n if (false === this.constraints[i].isDomConstraint) {\n constraints.push(this.constraints[i]);\n constraintsByName[this.constraints[i].name] = this.constraints[i];\n }\n\n this.constraints = constraints;\n this.constraintsByName = constraintsByName;\n\n // then re-add Parsley DOM-API constraints\n for (var name in this.options)\n this.addConstraint(name, this.options[name], undefined, true);\n\n // finally, bind special HTML5 constraints\n return this._bindHtml5Constraints();\n },\n\n // Internal only.\n // Bind specific HTML5 constraints to be HTML5 compliant\n _bindHtml5Constraints: function () {\n // html5 required\n if (null !== this.element.getAttribute('required'))\n this.addConstraint('required', true, undefined, true);\n\n // html5 pattern\n if (null !== this.element.getAttribute('pattern'))\n this.addConstraint('pattern', this.element.getAttribute('pattern'), undefined, true);\n\n // range\n let min = this.element.getAttribute('min');\n let max = this.element.getAttribute('max');\n if (null !== min && null !== max)\n this.addConstraint('range', [min, max], undefined, true);\n\n // HTML5 min\n else if (null !== min)\n this.addConstraint('min', min, undefined, true);\n\n // HTML5 max\n else if (null !== max)\n this.addConstraint('max', max, undefined, true);\n\n\n // length\n if (null !== this.element.getAttribute('minlength') && null !== this.element.getAttribute('maxlength'))\n this.addConstraint('length', [this.element.getAttribute('minlength'), this.element.getAttribute('maxlength')], undefined, true);\n\n // HTML5 minlength\n else if (null !== this.element.getAttribute('minlength'))\n this.addConstraint('minlength', this.element.getAttribute('minlength'), undefined, true);\n\n // HTML5 maxlength\n else if (null !== this.element.getAttribute('maxlength'))\n this.addConstraint('maxlength', this.element.getAttribute('maxlength'), undefined, true);\n\n\n // html5 types\n var type = Utils.getType(this.element);\n\n // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n if ('number' === type) {\n return this.addConstraint('type', ['number', {\n step: this.element.getAttribute('step') || '1',\n base: min || this.element.getAttribute('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range|date)$/i.test(type)) {\n return this.addConstraint('type', type, undefined, true);\n }\n return this;\n },\n\n // Internal only.\n // Field is required if have required constraint without `false` value\n _isRequired: function () {\n if ('undefined' === typeof this.constraintsByName.required)\n return false;\n\n return false !== this.constraintsByName.required.requirements;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n _trigger: function (eventName) {\n return this.trigger('field:' + eventName);\n },\n\n // Internal only\n // Handles whitespace in a value\n // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n _handleWhitespace: function (value) {\n if (true === this.options.trimValue)\n Utils.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n if ('squish' === this.options.whitespace)\n value = value.replace(/\\s{2,}/g, ' ');\n\n if (('trim' === this.options.whitespace) || ('squish' === this.options.whitespace) || (true === this.options.trimValue))\n value = Utils.trimString(value);\n\n return value;\n },\n\n _isDateInput: function() {\n var c = this.constraintsByName.type;\n return c && c.requirements === 'date';\n },\n\n // Internal only.\n // Returns the constraints, grouped by descending priority.\n // The result is thus an array of arrays of constraints.\n _getGroupedConstraints: function () {\n if (false === this.options.priorityEnabled)\n return [this.constraints];\n\n var groupedConstraints = [];\n var index = {};\n\n // Create array unique of priorities\n for (var i = 0; i < this.constraints.length; i++) {\n var p = this.constraints[i].priority;\n if (!index[p])\n groupedConstraints.push(index[p] = []);\n index[p].push(this.constraints[i]);\n }\n // Sort them by priority DESC\n groupedConstraints.sort(function (a, b) { return b[0].priority - a[0].priority; });\n\n return groupedConstraints;\n }\n\n };\n\n var parsley_field = Field;\n\n var Multiple = function () {\n this.__class__ = 'FieldMultiple';\n };\n\n Multiple.prototype = {\n // Add new `$element` sibling for multiple field\n addElement: function ($element) {\n this.$elements.push($element);\n\n return this;\n },\n\n // See `Field._refreshConstraints()`\n _refreshConstraints: function () {\n var fieldConstraints;\n\n this.constraints = [];\n\n // Select multiple special treatment\n if (this.element.nodeName === 'SELECT') {\n this.actualizeOptions()._bindConstraints();\n\n return this;\n }\n\n // Gather all constraints for each input in the multiple group\n for (var i = 0; i < this.$elements.length; i++) {\n\n // Check if element have not been dynamically removed since last binding\n if (!$('html').has(this.$elements[i]).length) {\n this.$elements.splice(i, 1);\n continue;\n }\n\n fieldConstraints = this.$elements[i].data('FieldMultiple')._refreshConstraints().constraints;\n\n for (var j = 0; j < fieldConstraints.length; j++)\n this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n }\n\n return this;\n },\n\n // See `Field.getValue()`\n getValue: function () {\n // Value could be overriden in DOM\n if ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.element.nodeName === 'INPUT') {\n var type = Utils.getType(this.element);\n if (type === 'radio')\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (type === 'checkbox') {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n }\n\n // Select multiple case\n if (this.element.nodeName === 'SELECT' && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n };\n\n var Factory = function (element, options, parsleyFormInstance) {\n this.element = element;\n this.$element = $(element);\n\n // If the element has already been bound, returns its saved Parsley instance\n var savedparsleyFormInstance = this.$element.data('Parsley');\n if (savedparsleyFormInstance) {\n\n // If the saved instance has been bound without a Form parent and there is one given in this call, add it\n if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n savedparsleyFormInstance.parent = parsleyFormInstance;\n savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n }\n\n if ('object' === typeof options) {\n Object.assign(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && 'Form' !== parsleyFormInstance.__class__)\n throw new Error('Parent instance must be a Form instance');\n\n this.parent = parsleyFormInstance || window.Parsley;\n return this.init(options);\n };\n\n Factory.prototype = {\n init: function (options) {\n this.__class__ = 'Parsley';\n this.__version__ = '2.8.1';\n this.__id__ = Utils.generateID();\n\n // Pre-compute options\n this._resetOptions(options);\n\n // A Form instance is obviously a `<form>` element but also every node that is not an input and has the `data-parsley-validate` attribute\n if (this.element.nodeName === 'FORM' || (Utils.checkAttr(this.element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)))\n return this.bind('parsleyForm');\n\n // Every other element is bound as a `Field` or `FieldMultiple`\n return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n },\n\n isMultiple: function () {\n var type = Utils.getType(this.element);\n return ((type === 'radio' || type === 'checkbox') ||\n (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')));\n },\n\n // Multiples fields are a real nightmare :(\n // Maybe some refactoring would be appreciated here...\n handleMultiple: function () {\n var name;\n var multiple;\n var parsleyMultipleInstance;\n\n // Handle multiple name\n this.options.multiple = this.options.multiple ||\n (name = this.element.getAttribute('name')) ||\n this.element.getAttribute('id');\n\n // Special select multiple input\n if (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')) {\n this.options.multiple = this.options.multiple || this.__id__;\n return this.bind('parsleyFieldMultiple');\n\n // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n } else if (!this.options.multiple) {\n Utils.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n return this;\n }\n\n // Remove special chars\n this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, '');\n\n // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n if (name) {\n $('input[name=\"' + name + '\"]').each((i, input) => {\n var type = Utils.getType(input);\n if ((type === 'radio' || type === 'checkbox'))\n input.setAttribute(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('FieldMultiple')) {\n parsleyMultipleInstance.addElement(this.$element);\n }\n\n break;\n }\n }\n\n // Create a secret Field instance for every multiple field. It will be stored in `data('FieldMultiple')`\n // And will be useful later to access classic `Field` stuff while being in a `FieldMultiple` instance\n this.bind('parsleyField', true);\n\n return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n },\n\n // Return proper `Form`, `Field` or `FieldMultiple`\n bind: function (type, doNotStore) {\n var parsleyInstance;\n\n switch (type) {\n case 'parsleyForm':\n parsleyInstance = $.extend(\n new Form(this.element, this.domOptions, this.options),\n new Base(),\n window.ParsleyExtend\n )._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(\n new parsley_field(this.element, this.domOptions, this.options, this.parent),\n new Base(),\n window.ParsleyExtend\n );\n break;\n case 'parsleyFieldMultiple':\n parsleyInstance = $.extend(\n new parsley_field(this.element, this.domOptions, this.options, this.parent),\n new Multiple(),\n new Base(),\n window.ParsleyExtend\n )._init();\n break;\n default:\n throw new Error(type + 'is not a supported Parsley type');\n }\n\n if (this.options.multiple)\n Utils.setAttr(this.element, this.options.namespace, 'multiple', this.options.multiple);\n\n if ('undefined' !== typeof doNotStore) {\n this.$element.data('FieldMultiple', parsleyInstance);\n\n return parsleyInstance;\n }\n\n // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n this.$element.data('Parsley', parsleyInstance);\n\n // Tell the world we have a new Form or Field instance!\n parsleyInstance._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n };\n\n var vernums = $.fn.jquery.split('.');\n if (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n }\n if (!vernums.forEach) {\n Utils.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n }\n // Inherit `on`, `off` & `trigger` to Parsley:\n var Parsley = Object.assign(new Base(), {\n element: document,\n $element: $(document),\n actualizeOptions: null,\n _resetOptions: null,\n Factory: Factory,\n version: '2.8.1'\n });\n\n // Supplement Field and Form with Base\n // This way, the constructors will have access to those methods\n Object.assign(parsley_field.prototype, UI.Field, Base.prototype);\n Object.assign(Form.prototype, UI.Form, Base.prototype);\n // Inherit actualizeOptions and _resetOptions:\n Object.assign(Factory.prototype, Base.prototype);\n\n // ### jQuery API\n // `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n $.fn.parsley = $.fn.psly = function (options) {\n if (this.length > 1) {\n var instances = [];\n\n this.each(function () {\n instances.push($(this).parsley(options));\n });\n\n return instances;\n }\n\n // Return undefined if applied to non existing DOM element\n if (this.length == 0) {\n return;\n }\n\n return new Factory(this[0], options);\n };\n\n // ### Field and Form extension\n // Ensure the extension is now defined if it wasn't previously\n if ('undefined' === typeof window.ParsleyExtend)\n window.ParsleyExtend = {};\n\n // ### Parsley config\n // Inherit from ParsleyDefault, and copy over any existing values\n Parsley.options = Object.assign(Utils.objectCreate(Defaults), window.ParsleyConfig);\n window.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n // ### Globals\n window.Parsley = window.psly = Parsley;\n Parsley.Utils = Utils;\n window.ParsleyUtils = {};\n $.each(Utils, (key, value) => {\n if ('function' === typeof value) {\n window.ParsleyUtils[key] = (...args) => {\n Utils.warnOnce('Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.');\n return Utils[key](...args);\n };\n }\n });\n\n // ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\n var registry = window.Parsley._validatorRegistry = new ValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\n window.ParsleyValidator = {};\n $.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator hasValidator'.split(' '), function (i, method) {\n window.Parsley[method] = (...args) => registry[method](...args);\n window.ParsleyValidator[method] = function () {\n Utils.warnOnce(`Accessing the method '${method}' through Validator is deprecated. Simply call 'window.Parsley.${method}(...)'`);\n return window.Parsley[method](...arguments);\n };\n });\n\n // ### UI\n // Deprecated global object\n window.Parsley.UI = UI;\n window.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce(`Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n Utils.warnOnce(`Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n };\n $.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce(`Accessing UI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n });\n\n // ### PARSLEY auto-binding\n // Prevent it by setting `ParsleyConfig.autoBind` to `false`\n if (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n }\n\n var o = $({});\n var deprecated = function () {\n Utils.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n };\n\n // Returns an event handler that calls `fn` with the arguments it expects\n function adapt(fn, context) {\n // Store to allow unbinding\n if (!fn.parsleyAdaptedCallback) {\n fn.parsleyAdaptedCallback = function () {\n var args = Array.prototype.slice.call(arguments, 0);\n args.unshift(this);\n fn.apply(context || o, args);\n };\n }\n return fn.parsleyAdaptedCallback;\n }\n\n var eventPrefix = 'parsley:';\n // Converts 'parsley:form:validate' into 'form:validate'\n function eventName(name) {\n if (name.lastIndexOf(eventPrefix, 0) === 0)\n return name.substr(eventPrefix.length);\n return name;\n }\n\n // $.listen is deprecated. Use Parsley.on instead.\n $.listen = function (name, callback) {\n var context;\n deprecated();\n if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n context = arguments[1];\n callback = arguments[2];\n }\n\n if ('function' !== typeof callback)\n throw new Error('Wrong parameters');\n\n window.Parsley.on(eventName(name), adapt(callback, context));\n };\n\n $.listenTo = function (instance, name, fn) {\n deprecated();\n if (!(instance instanceof parsley_field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong parameters');\n\n instance.on(eventName(name), adapt(fn));\n };\n\n $.unsubscribe = function (name, fn) {\n deprecated();\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong arguments');\n window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n };\n\n $.unsubscribeTo = function (instance, name) {\n deprecated();\n if (!(instance instanceof parsley_field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n instance.off(eventName(name));\n };\n\n $.unsubscribeAll = function (name) {\n deprecated();\n window.Parsley.off(eventName(name));\n $('form,input,textarea,select').each(function () {\n var instance = $(this).data('Parsley');\n if (instance) {\n instance.off(eventName(name));\n }\n });\n };\n\n // $.emit is deprecated. Use jQuery events instead.\n $.emit = function (name, instance) {\n deprecated();\n var instanceGiven = (instance instanceof parsley_field) || (instance instanceof Form);\n var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n args.unshift(eventName(name));\n if (!instanceGiven) {\n instance = window.Parsley;\n }\n instance.trigger(...args);\n };\n\n var pubsub = {};\n\n $.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n });\n\n Parsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.element.getAttribute('name') || instance.element.getAttribute('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n });\n\n Parsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n });\n\n Base.prototype.addAsyncValidator = function () {\n Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n };\n\n // This is included with the Parsley library itself,\n // thus there is no use in adding it to your project.\n Parsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n });\n\n Parsley.setLocale('en');\n\n /**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune <github@marc-andre.ca>\n * @license MIT\n */\n\n function InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n Object.assign(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n };\n\n var inputevent = new InputEvent();\n\n inputevent.install();\n\n var parsley = Parsley;\n\n return parsley;\n\n}));\n","import $ from 'jquery';\nimport Field from './field';\nimport Form from './form';\nimport Utils from './utils';\n\nvar o = $({});\nvar deprecated = function () {\n Utils.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n};\n\n// Returns an event handler that calls `fn` with the arguments it expects\nfunction adapt(fn, context) {\n // Store to allow unbinding\n if (!fn.parsleyAdaptedCallback) {\n fn.parsleyAdaptedCallback = function () {\n var args = Array.prototype.slice.call(arguments, 0);\n args.unshift(this);\n fn.apply(context || o, args);\n };\n }\n return fn.parsleyAdaptedCallback;\n}\n\nvar eventPrefix = 'parsley:';\n// Converts 'parsley:form:validate' into 'form:validate'\nfunction eventName(name) {\n if (name.lastIndexOf(eventPrefix, 0) === 0)\n return name.substr(eventPrefix.length);\n return name;\n}\n\n// $.listen is deprecated. Use Parsley.on instead.\n$.listen = function (name, callback) {\n var context;\n deprecated();\n if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n context = arguments[1];\n callback = arguments[2];\n }\n\n if ('function' !== typeof callback)\n throw new Error('Wrong parameters');\n\n window.Parsley.on(eventName(name), adapt(callback, context));\n};\n\n$.listenTo = function (instance, name, fn) {\n deprecated();\n if (!(instance instanceof Field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong parameters');\n\n instance.on(eventName(name), adapt(fn));\n};\n\n$.unsubscribe = function (name, fn) {\n deprecated();\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong arguments');\n window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n};\n\n$.unsubscribeTo = function (instance, name) {\n deprecated();\n if (!(instance instanceof Field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n instance.off(eventName(name));\n};\n\n$.unsubscribeAll = function (name) {\n deprecated();\n window.Parsley.off(eventName(name));\n $('form,input,textarea,select').each(function () {\n var instance = $(this).data('Parsley');\n if (instance) {\n instance.off(eventName(name));\n }\n });\n};\n\n// $.emit is deprecated. Use jQuery events instead.\n$.emit = function (name, instance) {\n deprecated();\n var instanceGiven = (instance instanceof Field) || (instance instanceof Form);\n var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n args.unshift(eventName(name));\n if (!instanceGiven) {\n instance = window.Parsley;\n }\n instance.trigger(...args);\n};\n\nexport default {};\n","/**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune <github@marc-andre.ca>\n * @license MIT\n */\n\nimport $ from 'jquery';\n\nfunction InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n Object.assign(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n};\n\nexport default new InputEvent();\n","import $ from 'jquery';\n\nvar globalID = 1;\nvar pastWarnings = {};\n\nvar Utils = {\n // Parsley DOM-API\n // returns object from dom attributes and values\n attr: function (element, namespace, obj) {\n var i;\n var attribute;\n var attributes;\n var regex = new RegExp('^' + namespace, 'i');\n\n if ('undefined' === typeof obj)\n obj = {};\n else {\n // Clear all own properties. This won't affect prototype's values\n for (i in obj) {\n if (obj.hasOwnProperty(i))\n delete obj[i];\n }\n }\n\n if (!element)\n return obj;\n\n attributes = element.attributes;\n for (i = attributes.length; i--; ) {\n attribute = attributes[i];\n\n if (attribute && attribute.specified && regex.test(attribute.name)) {\n obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n }\n }\n\n return obj;\n },\n\n checkAttr: function (element, namespace, checkAttr) {\n return element.hasAttribute(namespace + checkAttr);\n },\n\n setAttr: function (element, namespace, attr, value) {\n element.setAttribute(this.dasherize(namespace + attr), String(value));\n },\n\n getType: function(element) {\n return element.getAttribute('type') || 'text';\n },\n\n generateID: function () {\n return '' + globalID++;\n },\n\n /** Third party functions **/\n deserializeValue: function (value) {\n var num;\n\n try {\n return value ?\n value == \"true\" ||\n (value == \"false\" ? false :\n value == \"null\" ? null :\n !isNaN(num = Number(value)) ? num :\n /^[\\[\\{]/.test(value) ? JSON.parse(value) :\n value)\n : value;\n } catch (e) { return value; }\n },\n\n // Zepto camelize function\n camelize: function (str) {\n return str.replace(/-+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n });\n },\n\n // Zepto dasherize function\n dasherize: function (str) {\n return str.replace(/::/g, '/')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n .replace(/_/g, '-')\n .toLowerCase();\n },\n\n warn: function () {\n if (window.console && 'function' === typeof window.console.warn)\n window.console.warn(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n parse: {\n date: function(string) {\n let parsed = string.match(/^(\\d{4,})-(\\d\\d)-(\\d\\d)$/);\n if (!parsed)\n return null;\n let [_, year, month, day] = parsed.map(x => parseInt(x, 10));\n let date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day)\n return null;\n return date;\n },\n string: function(string) {\n return string;\n },\n integer: function(string) {\n if (isNaN(string))\n return null;\n return parseInt(string, 10);\n },\n number: function(string) {\n if (isNaN(string))\n throw null;\n return parseFloat(string);\n },\n 'boolean': function _boolean(string) {\n return !(/^\\s*false\\s*$/i.test(string));\n },\n object: function(string) {\n return Utils.deserializeValue(string);\n },\n regexp: function(regexp) {\n var flags = '';\n\n // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n if (/^\\/.*\\/(?:[gimy]*)$/.test(regexp)) {\n // Replace the regexp literal string with the first match group: ([gimy]*)\n // If no flag is present, this will be a blank string\n flags = regexp.replace(/.*\\/([gimy]*)$/, '$1');\n // Again, replace the regexp literal string with the first match group:\n // everything excluding the opening and closing slashes and the flags\n regexp = regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n } else {\n // Anchor regexp:\n regexp = '^' + regexp + '$';\n }\n return new RegExp(regexp, flags);\n }\n },\n\n parseRequirement: function(requirementType, string) {\n var converter = this.parse[requirementType || 'string'];\n if (!converter)\n throw 'Unknown requirement specification: \"' + requirementType + '\"';\n let converted = converter(string);\n if (converted === null)\n throw `Requirement is not a ${requirementType}: \"${string}\"`;\n return converted;\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })(),\n\n _SubmitSelector: 'input[type=\"submit\"], button:submit'\n};\n\nexport default Utils;\n","// All these options could be overriden and specified directly in DOM using\n// `data-parsley-` default DOM-API\n// eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n// eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n\nvar Defaults = {\n // ### General\n\n // Default data-namespace for DOM API\n namespace: 'data-parsley-',\n\n // Supported inputs by default\n inputs: 'input, textarea, select',\n\n // Excluded inputs by default\n excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n\n // Stop validating field on highest priority failing constraint\n priorityEnabled: true,\n\n // ### Field only\n\n // identifier used to group together inputs (e.g. radio buttons...)\n multiple: null,\n\n // identifier (or array of identifiers) used to validate only a select group of inputs\n group: null,\n\n // ### UI\n // Enable\\Disable error messages\n uiEnabled: true,\n\n // Key events threshold before validation\n validationThreshold: 3,\n\n // Focused field on form validation error. 'first'|'last'|'none'\n focus: 'first',\n\n // event(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (Field) {},\n\n // Return the `$element` where errors will be appended\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n errorsContainer: function (Field) {},\n\n // ul elem that would receive errors' list\n errorsWrapper: '<ul class=\"parsley-errors-list\"></ul>',\n\n // li elem that would receive error message\n errorTemplate: '<li></li>'\n};\n\nexport default Defaults;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar Base = function () {\n this.__id__ = Utils.generateID();\n};\n\nBase.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n Utils.attr(this.element, this.options.namespace, this.domOptions);\n if (this.parent && this.parent.actualizeOptions)\n this.parent.actualizeOptions();\n return this;\n },\n\n _resetOptions: function (initOptions) {\n this.domOptions = Utils.objectCreate(this.parent.options);\n this.options = Utils.objectCreate(this.domOptions);\n // Shallow copy of ownProperties of initOptions:\n for (var i in initOptions) {\n if (initOptions.hasOwnProperty(i))\n this.options[i] = initOptions[i];\n }\n this.actualizeOptions();\n },\n\n _listeners: null,\n\n // Register a callback for the given event name\n // Callback is called with context as the first argument and the `this`\n // The context is the current parsley instance, or window.Parsley if global\n // A return value of `false` will interrupt the calls\n on: function (name, fn) {\n this._listeners = this._listeners || {};\n var queue = this._listeners[name] = this._listeners[name] || [];\n queue.push(fn);\n\n return this;\n },\n\n // Deprecated. Use `on` instead\n subscribe: function(name, fn) {\n $.listenTo(this, name.toLowerCase(), fn);\n },\n\n // Unregister a callback (or all if none is given) for the given event name\n off: function (name, fn) {\n var queue = this._listeners && this._listeners[name];\n if (queue) {\n if (!fn) {\n delete this._listeners[name];\n } else {\n for (var i = queue.length; i--; )\n if (queue[i] === fn)\n queue.splice(i, 1);\n }\n }\n return this;\n },\n\n // Deprecated. Use `off`\n unsubscribe: function(name, fn) {\n $.unsubscribeTo(this, name.toLowerCase());\n },\n\n // Trigger an event of the given name\n // A return value of `false` interrupts the callback chain\n // Returns false if execution was interrupted\n trigger: function (name, target, extraArg) {\n target = target || this;\n var queue = this._listeners && this._listeners[name];\n var result;\n var parentResult;\n if (queue) {\n for (var i = queue.length; i--; ) {\n result = queue[i].call(target, target, extraArg);\n if (result === false) return result;\n }\n }\n if (this.parent) {\n return this.parent.trigger(name, target, extraArg);\n }\n return true;\n },\n\n asyncIsValid: function (group, force) {\n Utils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n $(this.parent.element.querySelectorAll(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`))\n : this.$element;\n }\n};\n\nexport default Base;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar convertArrayRequirement = function(string, length) {\n var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n if (!m)\n throw 'Requirement is not an array: \"' + string + '\"';\n var values = m[1].split(',').map(Utils.trimString);\n if (values.length !== length)\n throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n return values;\n};\n\nvar convertExtraOptionRequirement = function(requirementSpec, string, extraOptionReader) {\n var main = null;\n var extra = {};\n for (var key in requirementSpec) {\n if (key) {\n var value = extraOptionReader(key);\n if ('string' === typeof value)\n value = Utils.parseRequirement(requirementSpec[key], value);\n extra[key] = value;\n } else {\n main = Utils.parseRequirement(requirementSpec[key], string);\n }\n }\n return [main, extra];\n};\n\n// A Validator needs to implement the methods `validate` and `parseRequirements`\n\nvar Validator = function(spec) {\n $.extend(true, this, spec);\n};\n\nValidator.prototype = {\n // Returns `true` iff the given `value` is valid according the given requirements.\n validate: function(value, requirementFirstArg) {\n if (this.fn) { // Legacy style validator\n\n if (arguments.length > 3) // If more args then value, requirement, instance...\n requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest\n return this.fn(value, requirementFirstArg);\n }\n\n if (Array.isArray(value)) {\n if (!this.validateMultiple)\n throw 'Validator `' + this.name + '` does not handle multiple values';\n return this.validateMultiple(...arguments);\n } else {\n let instance = arguments[arguments.length - 1];\n if (this.validateDate && instance._isDateInput()) {\n arguments[0] = Utils.parse.date(arguments[0]);\n if (arguments[0] === null)\n return false;\n return this.validateDate(...arguments);\n }\n if (this.validateNumber) {\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return Array.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if (Array.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = Utils.parseRequirement(type[i], values[i]);\n return values;\n } else if ($.isPlainObject(type)) {\n return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n } else {\n return [Utils.parseRequirement(type, requirements)];\n }\n },\n // Defaults:\n requirementType: 'string',\n\n priority: 2\n\n};\n\nexport default Validator;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Defaults from './defaults';\nimport Validator from './validator';\n\nvar ValidatorRegistry = function (validators, catalog) {\n this.__class__ = 'ValidatorRegistry';\n\n // Default Parsley locale is en\n this.locale = 'en';\n\n this.init(validators || {}, catalog || {});\n};\n\nvar typeTesters = {\n email: /^((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n date: {\n test: value => Utils.parse.date(value) !== null\n },\n\n url: new RegExp(\n \"^\" +\n // protocol identifier\n \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\" +\n // IP address exclusion\n // private & local networks\n // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" + // ** mod: allow local networks\n // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n \"|\" +\n // host name\n \"(?:(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)\" +\n // domain name\n \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)*\" +\n // TLD identifier\n \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff]{2,}))\" +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:/\\\\S*)?\" +\n \"$\"\n )\n};\ntypeTesters.range = typeTesters.number;\n\n// See http://stackoverflow.com/a/10454560/8279\nvar decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n};\n\n// parseArguments('number', ['1', '2']) => [1, 2]\nlet parseArguments = (type, args) => args.map(Utils.parse[type]);\n// operatorToValidator returns a validating function for an operator function, applied to the given type\nlet operatorToValidator = (type, operator) => {\n return (value, ...requirementsAndInput) => {\n requirementsAndInput.pop(); // Get rid of `input` argument\n return operator(value, ...parseArguments(type, requirementsAndInput));\n };\n};\n\nlet comparisonOperator = operator => ({\n validateDate: operatorToValidator('date', operator),\n validateNumber: operatorToValidator('number', operator),\n requirementType: operator.length <= 2 ? 'string' : ['string', 'string'], // Support operators with a 1 or 2 requirement(s)\n priority: 30\n});\n\nValidatorRegistry.prototype = {\n init: function (validators, catalog) {\n this.catalog = catalog;\n // Copy prototype's validators:\n this.validators = Object.assign({}, this.validators);\n\n for (var name in validators)\n this.addValidator(name, validators[name].fn, validators[name].priority);\n\n window.Parsley.trigger('parsley:validator:init');\n },\n\n // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n setLocale: function (locale) {\n if ('undefined' === typeof this.catalog[locale])\n throw new Error(locale + ' is not available in the catalog');\n\n this.locale = locale;\n\n return this;\n },\n\n // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n addCatalog: function (locale, messages, set) {\n if ('object' === typeof messages)\n this.catalog[locale] = messages;\n\n if (true === set)\n return this.setLocale(locale);\n\n return this;\n },\n\n // Add a specific message for a given constraint in a given locale\n addMessage: function (locale, name, message) {\n if ('undefined' === typeof this.catalog[locale])\n this.catalog[locale] = {};\n\n this.catalog[locale][name] = message;\n\n return this;\n },\n\n // Add messages for a given locale\n addMessages: function (locale, nameMessageObject) {\n for (var name in nameMessageObject)\n this.addMessage(locale, name, nameMessageObject[name]);\n\n return this;\n },\n\n // Add a new validator\n //\n // addValidator('custom', {\n // requirementType: ['integer', 'integer'],\n // validateString: function(value, from, to) {},\n // priority: 22,\n // messages: {\n // en: \"Hey, that's no good\",\n // fr: \"Aye aye, pas bon du tout\",\n // }\n // })\n //\n // Old API was addValidator(name, function, priority)\n //\n addValidator: function (name, arg1, arg2) {\n if (this.validators[name])\n Utils.warn('Validator \"' + name + '\" is already defined.');\n else if (Defaults.hasOwnProperty(name)) {\n Utils.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n return;\n }\n return this._setValidator(...arguments);\n },\n\n hasValidator: function (name) {\n return !!this.validators[name];\n },\n\n updateValidator: function (name, arg1, arg2) {\n if (!this.validators[name]) {\n Utils.warn('Validator \"' + name + '\" is not already defined.');\n return this.addValidator(...arguments);\n }\n return this._setValidator(...arguments);\n },\n\n removeValidator: function (name) {\n if (!this.validators[name])\n Utils.warn('Validator \"' + name + '\" is not defined.');\n\n delete this.validators[name];\n\n return this;\n },\n\n _setValidator: function (name, validator, priority) {\n if ('object' !== typeof validator) {\n // Old style validator, with `fn` and `priority`\n validator = {\n fn: validator,\n priority: priority\n };\n }\n if (!validator.validate) {\n validator = new Validator(validator);\n }\n this.validators[name] = validator;\n\n for (var locale in validator.messages || {})\n this.addMessage(locale, name, validator.messages[locale]);\n\n return this;\n },\n\n getErrorMessage: function (constraint) {\n var message;\n\n // Type constraints are a bit different, we have to match their requirements too to find right error message\n if ('type' === constraint.name) {\n var typeMessages = this.catalog[this.locale][constraint.name] || {};\n message = typeMessages[constraint.requirements];\n } else\n message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n },\n\n // Kind of light `sprintf()` implementation\n formatMessage: function (string, parameters) {\n if ('object' === typeof parameters) {\n for (var i in parameters)\n string = this.formatMessage(string, parameters[i]);\n\n return string;\n }\n\n return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = 'any', base = 0} = {}) {\n var tester = typeTesters[type];\n if (!tester) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!tester.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: comparisonOperator((value, requirement) => value >= requirement),\n max: comparisonOperator((value, requirement) => value <= requirement),\n range: comparisonOperator((value, min, max) => value >= min && value <= max),\n equalto: {\n validateString: function (value, refOrValue) {\n var $reference = $(refOrValue);\n if ($reference.length)\n return value === $reference.val();\n else\n return value === refOrValue;\n },\n priority: 256\n }\n }\n};\n\nexport default ValidatorRegistry;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar UI = {};\n\nvar diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n};\n\nUI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', Utils._SubmitSelector, evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.element.setAttribute('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n};\n\nUI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorClassHandler\n .attr('aria-describedby', this._ui.errorsWrapperId);\n this._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorClassHandler\n .removeAttr('aria-describedby');\n this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.element.setAttribute(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // Class handled could also be determined by function given in Parsley options\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handlerFunction = this.options.classHandler;\n\n // It might also be the function name of a global function\n if ('string' === typeof this.options.classHandler && 'function' === typeof window[this.options.classHandler])\n $handlerFunction = window[this.options.classHandler];\n\n if ('function' === typeof $handlerFunction) {\n var $handler = $handlerFunction.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n } else if ('object' === typeof $handlerFunction && $handlerFunction instanceof jQuery && $handlerFunction.length) {\n return $handlerFunction;\n } else if ($handlerFunction) {\n Utils.warn('The class handler `' + $handlerFunction + '` does not exist in DOM nor as a global JS function');\n }\n\n return this._inputHolder();\n },\n\n _inputHolder: function() {\n // if simple element (input, texatrea, select...) it will perfectly host the classes and precede the error container\n if (!this.options.multiple || this.element.nodeName === 'SELECT')\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer = this.options.errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof $errorsContainer) {\n if ($($errorsContainer).length)\n return $($errorsContainer).append(this._ui.$errorsWrapper);\n else if ('function' === typeof window[$errorsContainer])\n $errorsContainer = window[$errorsContainer];\n else\n Utils.warn('The errors container `' + $errorsContainer + '` does not exist in DOM nor as a global JS function');\n }\n\n if ('function' === typeof $errorsContainer)\n $errorsContainer = $errorsContainer.call(this, this);\n\n if ('object' === typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n return this._inputHolder().after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(Utils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this._validateIfNeeded();\n });\n else if (trigger = Utils.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._validateIfNeeded(event);\n });\n }\n },\n\n _validateIfNeeded: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (event && /key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n if (this.options.debounce) {\n window.clearTimeout(this._debounced);\n this._debounced = window.setTimeout(() => this.validate(), this.options.debounce);\n } else\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n};\n\nexport default UI;\n","import $ from 'jquery';\nimport Base from './base';\nimport Utils from './utils';\n\nvar Form = function (element, domOptions, options) {\n this.__class__ = 'Form';\n\n this.element = element;\n this.$element = $(element);\n this.domOptions = domOptions;\n this.options = options;\n this.parent = window.Parsley;\n\n this.fields = [];\n this.validationResult = null;\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nForm.prototype = {\n onSubmitValidate: function (event) {\n // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var submitSource = this._submitSource || this.$element.find(Utils._SubmitSelector)[0];\n this._submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if (submitSource && null !== submitSource.getAttribute('formnovalidate'))\n return;\n\n window.Parsley._remoteCache = {};\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit(submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._submitSource = event.currentTarget;\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function (submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if (submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('<input class=\"parsley-synthetic-submit-button\" type=\"hidden\">').appendTo(this.$element);\n $synthetic.attr({\n name: submitSource.getAttribute('name'),\n value: submitSource.getAttribute('value')\n });\n }\n\n this.$element.trigger(Object.assign($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = Object.assign({}, event, {preventDefault: () => {\n Utils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return Utils.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return Utils.all(promises);\n },\n\n refresh: function() {\n this._refreshFields();\n return this;\n },\n\n // Reset UI\n reset: function () {\n // Form case: emit a reset event for each field\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n\n // Form case: destroy all its fields and then destroy stored instance\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].destroy();\n\n this.$element.removeData('Parsley');\n this._trigger('destroy');\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `Field` and `FieldMultiple` children\n if (('Field' === fieldInstance.__class__ || 'FieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded)) {\n let uniqueId = fieldInstance.__class__ + '-' + fieldInstance.__id__;\n if ('undefined' === typeof this.fieldsMappedById[uniqueId]) {\n this.fieldsMappedById[uniqueId] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n }\n });\n\n $.each(Utils.difference(oldFields, this.fields), (_, field) => {\n field.reset();\n });\n });\n return this;\n },\n\n // Internal only.\n // Looping on a form's fields to do validation or similar\n // will trigger reactualizing options on all of them, which\n // in turn will reactualize the form's options.\n // To avoid calling actualizeOptions so many times on the form\n // for nothing, _withoutReactualizingFormOptions temporarily disables\n // the method actualizeOptions on this form while `fn` is called.\n _withoutReactualizingFormOptions: function (fn) {\n var oldActualizeOptions = this.actualizeOptions;\n this.actualizeOptions = function () { return this; };\n var result = fn();\n this.actualizeOptions = oldActualizeOptions;\n return result;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n // Returns true iff event is not interrupted and default not prevented.\n _trigger: function (eventName) {\n return this.trigger('form:' + eventName);\n }\n\n};\n\nexport default Form;\n","import Utils from './utils';\nimport Validator from './validator';\n\nconst Constraint = function(parsleyField, name, requirements, priority, isDomConstraint) {\n const validatorSpec = window.Parsley._validatorRegistry.validators[name];\n const validator = new Validator(validatorSpec);\n priority = priority || parsleyField.options[name + 'Priority'] || validator.priority;\n isDomConstraint = (true === isDomConstraint);\n\n Object.assign(this, {\n validator,\n name,\n requirements,\n priority,\n isDomConstraint\n });\n this._parseRequirements(parsleyField.options);\n};\n\nconst capitalize = function(str) {\n const cap = str[0].toUpperCase();\n return cap + str.slice(1);\n};\n\nConstraint.prototype = {\n validate: function(value, instance) {\n return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n};\n\nexport default Constraint;\n","import $ from 'jquery';\nimport Constraint from './constraint';\nimport UI from './ui';\nimport Utils from './utils';\n\nvar Field = function (field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'Field';\n\n this.element = field;\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nField.prototype = {\n // # Public API\n // Validate field and trigger some events for mainly `UI`\n // @returns `true`, an array of the validators that failed, or\n // `null` if validation is not finished. Prefer using whenValidate\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `UI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refresh();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if (Array.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refresh();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = Utils.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return Utils.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return Utils.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // Reset UI\n reset: function () {\n this._resetUI();\n return this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n this.$element.removeData('Parsley');\n this.$element.removeData('FieldMultiple');\n this._trigger('destroy');\n },\n\n // Actualize options and rebind constraints\n refresh: function () {\n this._refreshConstraints();\n return this;\n },\n\n _refreshConstraints: function () {\n return this.actualizeOptions()._bindConstraints();\n },\n\n refreshConstraints: function() {\n Utils.warnOnce(\"Parsley's refreshConstraints is deprecated. Please use refresh\");\n return this.refresh();\n },\n\n /**\n * Add a new constraint to a field\n *\n * @param {String} name\n * @param {Mixed} requirements optional\n * @param {Number} priority optional\n * @param {Boolean} isDomConstraint optional\n */\n addConstraint: function (name, requirements, priority, isDomConstraint) {\n\n if (window.Parsley._validatorRegistry.validators[name]) {\n var constraint = new Constraint(this, name, requirements, priority, isDomConstraint);\n\n // if constraint already exist, delete it and push new version\n if ('undefined' !== this.constraintsByName[constraint.name])\n this.removeConstraint(constraint.name);\n\n this.constraints.push(constraint);\n this.constraintsByName[constraint.name] = constraint;\n }\n\n return this;\n },\n\n // Remove a constraint\n removeConstraint: function (name) {\n for (var i = 0; i < this.constraints.length; i++)\n if (name === this.constraints[i].name) {\n this.constraints.splice(i, 1);\n break;\n }\n delete this.constraintsByName[name];\n return this;\n },\n\n // Update a constraint (Remove + re-add)\n updateConstraint: function (name, parameters, priority) {\n return this.removeConstraint(name)\n .addConstraint(name, parameters, priority);\n },\n\n // # Internals\n\n // Internal only.\n // Bind constraints from config + options + DOM\n _bindConstraints: function () {\n var constraints = [];\n var constraintsByName = {};\n\n // clean all existing DOM constraints to only keep javascript user constraints\n for (var i = 0; i < this.constraints.length; i++)\n if (false === this.constraints[i].isDomConstraint) {\n constraints.push(this.constraints[i]);\n constraintsByName[this.constraints[i].name] = this.constraints[i];\n }\n\n this.constraints = constraints;\n this.constraintsByName = constraintsByName;\n\n // then re-add Parsley DOM-API constraints\n for (var name in this.options)\n this.addConstraint(name, this.options[name], undefined, true);\n\n // finally, bind special HTML5 constraints\n return this._bindHtml5Constraints();\n },\n\n // Internal only.\n // Bind specific HTML5 constraints to be HTML5 compliant\n _bindHtml5Constraints: function () {\n // html5 required\n if (null !== this.element.getAttribute('required'))\n this.addConstraint('required', true, undefined, true);\n\n // html5 pattern\n if (null !== this.element.getAttribute('pattern'))\n this.addConstraint('pattern', this.element.getAttribute('pattern'), undefined, true);\n\n // range\n let min = this.element.getAttribute('min');\n let max = this.element.getAttribute('max');\n if (null !== min && null !== max)\n this.addConstraint('range', [min, max], undefined, true);\n\n // HTML5 min\n else if (null !== min)\n this.addConstraint('min', min, undefined, true);\n\n // HTML5 max\n else if (null !== max)\n this.addConstraint('max', max, undefined, true);\n\n\n // length\n if (null !== this.element.getAttribute('minlength') && null !== this.element.getAttribute('maxlength'))\n this.addConstraint('length', [this.element.getAttribute('minlength'), this.element.getAttribute('maxlength')], undefined, true);\n\n // HTML5 minlength\n else if (null !== this.element.getAttribute('minlength'))\n this.addConstraint('minlength', this.element.getAttribute('minlength'), undefined, true);\n\n // HTML5 maxlength\n else if (null !== this.element.getAttribute('maxlength'))\n this.addConstraint('maxlength', this.element.getAttribute('maxlength'), undefined, true);\n\n\n // html5 types\n var type = Utils.getType(this.element);\n\n // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n if ('number' === type) {\n return this.addConstraint('type', ['number', {\n step: this.element.getAttribute('step') || '1',\n base: min || this.element.getAttribute('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range|date)$/i.test(type)) {\n return this.addConstraint('type', type, undefined, true);\n }\n return this;\n },\n\n // Internal only.\n // Field is required if have required constraint without `false` value\n _isRequired: function () {\n if ('undefined' === typeof this.constraintsByName.required)\n return false;\n\n return false !== this.constraintsByName.required.requirements;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n _trigger: function (eventName) {\n return this.trigger('field:' + eventName);\n },\n\n // Internal only\n // Handles whitespace in a value\n // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n _handleWhitespace: function (value) {\n if (true === this.options.trimValue)\n Utils.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n if ('squish' === this.options.whitespace)\n value = value.replace(/\\s{2,}/g, ' ');\n\n if (('trim' === this.options.whitespace) || ('squish' === this.options.whitespace) || (true === this.options.trimValue))\n value = Utils.trimString(value);\n\n return value;\n },\n\n _isDateInput: function() {\n var c = this.constraintsByName.type;\n return c && c.requirements === 'date';\n },\n\n // Internal only.\n // Returns the constraints, grouped by descending priority.\n // The result is thus an array of arrays of constraints.\n _getGroupedConstraints: function () {\n if (false === this.options.priorityEnabled)\n return [this.constraints];\n\n var groupedConstraints = [];\n var index = {};\n\n // Create array unique of priorities\n for (var i = 0; i < this.constraints.length; i++) {\n var p = this.constraints[i].priority;\n if (!index[p])\n groupedConstraints.push(index[p] = []);\n index[p].push(this.constraints[i]);\n }\n // Sort them by priority DESC\n groupedConstraints.sort(function (a, b) { return b[0].priority - a[0].priority; });\n\n return groupedConstraints;\n }\n\n};\n\nexport default Field;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar Multiple = function () {\n this.__class__ = 'FieldMultiple';\n};\n\nMultiple.prototype = {\n // Add new `$element` sibling for multiple field\n addElement: function ($element) {\n this.$elements.push($element);\n\n return this;\n },\n\n // See `Field._refreshConstraints()`\n _refreshConstraints: function () {\n var fieldConstraints;\n\n this.constraints = [];\n\n // Select multiple special treatment\n if (this.element.nodeName === 'SELECT') {\n this.actualizeOptions()._bindConstraints();\n\n return this;\n }\n\n // Gather all constraints for each input in the multiple group\n for (var i = 0; i < this.$elements.length; i++) {\n\n // Check if element have not been dynamically removed since last binding\n if (!$('html').has(this.$elements[i]).length) {\n this.$elements.splice(i, 1);\n continue;\n }\n\n fieldConstraints = this.$elements[i].data('FieldMultiple')._refreshConstraints().constraints;\n\n for (var j = 0; j < fieldConstraints.length; j++)\n this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n }\n\n return this;\n },\n\n // See `Field.getValue()`\n getValue: function () {\n // Value could be overriden in DOM\n if ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.element.nodeName === 'INPUT') {\n var type = Utils.getType(this.element);\n if (type === 'radio')\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (type === 'checkbox') {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n }\n\n // Select multiple case\n if (this.element.nodeName === 'SELECT' && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n};\n\nexport default Multiple;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Base from './base';\nimport Form from './form';\nimport Field from './field';\nimport Multiple from './multiple';\n\nvar Factory = function (element, options, parsleyFormInstance) {\n this.element = element;\n this.$element = $(element);\n\n // If the element has already been bound, returns its saved Parsley instance\n var savedparsleyFormInstance = this.$element.data('Parsley');\n if (savedparsleyFormInstance) {\n\n // If the saved instance has been bound without a Form parent and there is one given in this call, add it\n if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n savedparsleyFormInstance.parent = parsleyFormInstance;\n savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n }\n\n if ('object' === typeof options) {\n Object.assign(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && 'Form' !== parsleyFormInstance.__class__)\n throw new Error('Parent instance must be a Form instance');\n\n this.parent = parsleyFormInstance || window.Parsley;\n return this.init(options);\n};\n\nFactory.prototype = {\n init: function (options) {\n this.__class__ = 'Parsley';\n this.__version__ = '@@version';\n this.__id__ = Utils.generateID();\n\n // Pre-compute options\n this._resetOptions(options);\n\n // A Form instance is obviously a `<form>` element but also every node that is not an input and has the `data-parsley-validate` attribute\n if (this.element.nodeName === 'FORM' || (Utils.checkAttr(this.element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)))\n return this.bind('parsleyForm');\n\n // Every other element is bound as a `Field` or `FieldMultiple`\n return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n },\n\n isMultiple: function () {\n var type = Utils.getType(this.element);\n return ((type === 'radio' || type === 'checkbox') ||\n (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')));\n },\n\n // Multiples fields are a real nightmare :(\n // Maybe some refactoring would be appreciated here...\n handleMultiple: function () {\n var name;\n var multiple;\n var parsleyMultipleInstance;\n\n // Handle multiple name\n this.options.multiple = this.options.multiple ||\n (name = this.element.getAttribute('name')) ||\n this.element.getAttribute('id');\n\n // Special select multiple input\n if (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')) {\n this.options.multiple = this.options.multiple || this.__id__;\n return this.bind('parsleyFieldMultiple');\n\n // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n } else if (!this.options.multiple) {\n Utils.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n return this;\n }\n\n // Remove special chars\n this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, '');\n\n // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n if (name) {\n $('input[name=\"' + name + '\"]').each((i, input) => {\n var type = Utils.getType(input);\n if ((type === 'radio' || type === 'checkbox'))\n input.setAttribute(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('FieldMultiple')) {\n parsleyMultipleInstance.addElement(this.$element);\n }\n\n break;\n }\n }\n\n // Create a secret Field instance for every multiple field. It will be stored in `data('FieldMultiple')`\n // And will be useful later to access classic `Field` stuff while being in a `FieldMultiple` instance\n this.bind('parsleyField', true);\n\n return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n },\n\n // Return proper `Form`, `Field` or `FieldMultiple`\n bind: function (type, doNotStore) {\n var parsleyInstance;\n\n switch (type) {\n case 'parsleyForm':\n parsleyInstance = $.extend(\n new Form(this.element, this.domOptions, this.options),\n new Base(),\n window.ParsleyExtend\n )._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(\n new Field(this.element, this.domOptions, this.options, this.parent),\n new Base(),\n window.ParsleyExtend\n );\n break;\n case 'parsleyFieldMultiple':\n parsleyInstance = $.extend(\n new Field(this.element, this.domOptions, this.options, this.parent),\n new Multiple(),\n new Base(),\n window.ParsleyExtend\n )._init();\n break;\n default:\n throw new Error(type + 'is not a supported Parsley type');\n }\n\n if (this.options.multiple)\n Utils.setAttr(this.element, this.options.namespace, 'multiple', this.options.multiple);\n\n if ('undefined' !== typeof doNotStore) {\n this.$element.data('FieldMultiple', parsleyInstance);\n\n return parsleyInstance;\n }\n\n // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n this.$element.data('Parsley', parsleyInstance);\n\n // Tell the world we have a new Form or Field instance!\n parsleyInstance._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n};\n\nexport default Factory;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Defaults from './defaults';\nimport Base from './base';\nimport ValidatorRegistry from './validator_registry';\nimport UI from './ui';\nimport Form from './form';\nimport Field from './field';\nimport Multiple from './multiple';\nimport Factory from './factory';\n\nvar vernums = $.fn.jquery.split('.');\nif (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n}\nif (!vernums.forEach) {\n Utils.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n}\n// Inherit `on`, `off` & `trigger` to Parsley:\nvar Parsley = Object.assign(new Base(), {\n element: document,\n $element: $(document),\n actualizeOptions: null,\n _resetOptions: null,\n Factory: Factory,\n version: '@@version'\n });\n\n// Supplement Field and Form with Base\n// This way, the constructors will have access to those methods\nObject.assign(Field.prototype, UI.Field, Base.prototype);\nObject.assign(Form.prototype, UI.Form, Base.prototype);\n// Inherit actualizeOptions and _resetOptions:\nObject.assign(Factory.prototype, Base.prototype);\n\n// ### jQuery API\n// `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n$.fn.parsley = $.fn.psly = function (options) {\n if (this.length > 1) {\n var instances = [];\n\n this.each(function () {\n instances.push($(this).parsley(options));\n });\n\n return instances;\n }\n\n // Return undefined if applied to non existing DOM element\n if (this.length == 0) {\n return;\n }\n\n return new Factory(this[0], options);\n};\n\n// ### Field and Form extension\n// Ensure the extension is now defined if it wasn't previously\nif ('undefined' === typeof window.ParsleyExtend)\n window.ParsleyExtend = {};\n\n// ### Parsley config\n// Inherit from ParsleyDefault, and copy over any existing values\nParsley.options = Object.assign(Utils.objectCreate(Defaults), window.ParsleyConfig);\nwindow.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n// ### Globals\nwindow.Parsley = window.psly = Parsley;\nParsley.Utils = Utils;\nwindow.ParsleyUtils = {};\n$.each(Utils, (key, value) => {\n if ('function' === typeof value) {\n window.ParsleyUtils[key] = (...args) => {\n Utils.warnOnce('Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.');\n return Utils[key](...args);\n };\n }\n});\n\n// ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\nvar registry = window.Parsley._validatorRegistry = new ValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\nwindow.ParsleyValidator = {};\n$.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator hasValidator'.split(' '), function (i, method) {\n window.Parsley[method] = (...args) => registry[method](...args);\n window.ParsleyValidator[method] = function () {\n Utils.warnOnce(`Accessing the method '${method}' through Validator is deprecated. Simply call 'window.Parsley.${method}(...)'`);\n return window.Parsley[method](...arguments);\n };\n});\n\n// ### UI\n// Deprecated global object\nwindow.Parsley.UI = UI;\nwindow.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce(`Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n Utils.warnOnce(`Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n};\n$.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce(`Accessing UI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n});\n\n// ### PARSLEY auto-binding\n// Prevent it by setting `ParsleyConfig.autoBind` to `false`\nif (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n}\n\nexport default Parsley;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Base from './base';\n\nimport Parsley from './main';\n\n$.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n});\n\nParsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.element.getAttribute('name') || instance.element.getAttribute('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n});\n\nParsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n});\n\nBase.prototype.addAsyncValidator = function () {\n Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n};\n","// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\nimport Parsley from '../parsley/main';\n\nParsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n});\n\nParsley.setLocale('en');\n","import $ from 'jquery';\nimport Parsley from './parsley/main';\nimport './parsley/pubsub';\nimport './parsley/remote';\nimport './i18n/en';\nimport inputevent from './vendor/inputevent';\n\ninputevent.install();\n\nexport default Parsley;\n"]}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parsley-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.0.0
4
+ version: 2.8.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jiri Pospisil
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-22 00:00:00.000000000 Z
11
+ date: 2018-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -54,6 +54,7 @@ files:
54
54
  - vendor/assets/javascripts/parsley.i18n.en.extra.js
55
55
  - vendor/assets/javascripts/parsley.i18n.en.js
56
56
  - vendor/assets/javascripts/parsley.i18n.es.js
57
+ - vendor/assets/javascripts/parsley.i18n.et.js
57
58
  - vendor/assets/javascripts/parsley.i18n.eu.js
58
59
  - vendor/assets/javascripts/parsley.i18n.fa.js
59
60
  - vendor/assets/javascripts/parsley.i18n.fi.extra.js
@@ -99,6 +100,7 @@ files:
99
100
  - vendor/assets/javascripts/parsley.i18n.sv.extra.js
100
101
  - vendor/assets/javascripts/parsley.i18n.sv.js
101
102
  - vendor/assets/javascripts/parsley.i18n.th.js
103
+ - vendor/assets/javascripts/parsley.i18n.tk.js
102
104
  - vendor/assets/javascripts/parsley.i18n.tr.js
103
105
  - vendor/assets/javascripts/parsley.i18n.ua.extra.js
104
106
  - vendor/assets/javascripts/parsley.i18n.ua.js
@@ -137,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
137
139
  version: '0'
138
140
  requirements: []
139
141
  rubyforge_project:
140
- rubygems_version: 2.5.2
142
+ rubygems_version: 2.7.6
141
143
  signing_key:
142
144
  specification_version: 4
143
145
  summary: Parsley.js bundled for Rails Asset Pipeline