{"version":3,"sources":["/source/parsley.js","/source/src/parsley/pubsub.js","/source/src/parsley/utils.js","/source/src/parsley/defaults.js","/source/src/parsley/abstract.js","/source/src/parsley/validator.js","/source/src/parsley/validator_registry.js","/source/src/parsley/ui.js","/source/src/parsley/form.js","/source/src/parsley/factory/constraint.js","/source/src/parsley/field.js","/source/src/parsley/multiple.js","/source/src/parsley/factory.js","/source/src/parsley/main.js","/source/src/parsley/remote.js","/source/src/i18n/en.js","/source/src/parsley.js"],"names":["global","factory","exports","module","require","define","amd","parsley","jQuery","this","$","adapt","fn","context","parsleyAdaptedCallback","args","Array","prototype","slice","call","arguments","unshift","apply","o","eventName","name","lastIndexOf","eventPrefix","substr","length","globalID","pastWarnings","ParsleyUtils__ParsleyUtils","attr","$element","namespace","obj","i","attribute","attributes","regex","RegExp","hasOwnProperty","specified","test","camelize","deserializeValue","value","checkAttr","_checkAttr","is","setAttr","setAttribute","dasherize","String","generateID","num","isNaN","Number","parseJSON","e","str","replace","match","chr","toUpperCase","toLowerCase","warn","window","console","warnOnce","msg","_resetWarnings","trimString","string","objectCreate","Object","create","Error","TypeError","result","ParsleyUtils__default","ParsleyDefaults","inputs","excluded","priorityEnabled","multiple","group","uiEnabled","validationThreshold","focus","trigger","errorClass","successClass","classHandler","ParsleyField","errorsContainer","errorsWrapper","errorTemplate","ParsleyAbstract","asyncSupport","actualizeOptions","options","domOptions","parent","_resetOptions","initOptions","_listeners","on","queue","push","subscribe","listenTo","off","splice","unsubscribe","unsubscribeTo","target","extraArg","reset","__class__","_trigger","fields","destroy","removeData","asyncIsValid","whenValid","_findRelatedMultiple","find","requirementConverters","_string","integer","parseInt","number","parseFloat","reference","boolean","object","regexp","_regexp","flags","convertArrayRequirement","m","values","split","map","convertRequirement","requirementType","converter","convertExtraOptionRequirement","requirementSpec","extraOptionReader","main","extra","key","ParsleyValidator","spec","extend","validate","requirementFirstArg","isArray","validateMultiple","validateNumber","validateString","parseRequirements","requirements","type","isPlainObject","priority","ParsleyValidatorRegistry","validators","catalog","locale","init","typeRegexes","email","digits","alphanum","url","range","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","pattern","minlength","requirement","maxlength","min","max","mincheck","maxcheck","check","equalto","refOrValue","$reference","val","ParsleyUI","listen","that","setupForm","setupField","reflow","fieldInstance","_ui","active","diff","_diff","validationResult","lastValidationResult","validatedOnce","manageStatusClass","manageErrorsMessages","actualizeTriggers","kept","added","failedOnce","manageFailingFieldTrigger","getErrorsMessages","errorMessage","_getErrorMessage","assert","hasConstraints","needsValidation","_successClass","_errorClass","_resetClass","errorsMessagesDisabled","_insertErrorWrapper","$errorsWrapper","append","addClass","html","removeClass","remove","removed","removeError","addError","updateError","doNotUpdateClass","formInstance","_focusedField","field","noFocus","customConstraintErrorMessage","newResult","oldResult","deep","found","j","proxy","onSubmitValidate","onSubmitButton","__id__","$errorClassHandler","_manageClassHandler","errorsWrapperId","validationInformationVisible","$handler","$errorsContainer","$from","after","$toBind","triggers","join","eventValidate","event","getValue","each","parsleyInstance","children","ParsleyForm","element","ParsleyForm__statusMapping","pending","resolved","rejected","_$submitSource","first","stopImmediatePropagation","preventDefault","whenValidate","undefined","done","_submit","always","appendTo","Event","force","state","submitEvent","_refreshFields","promises","_withoutReactualizingFormOptions","_isFieldInGroup","promiseBasedOnValidationResult","r","Deferred","reject","resolve","promise","when","fail","pipe","isValid","inArray","_bindFields","self","oldFields","fieldsMappedById","not","Factory","oldActualizeOptions","ConstraintFactory","parsleyField","isDomConstraint","validatorSpec","_validatorRegistry","_parseRequirements","capitalize","cap","instance","requirementList","parsleyFormInstance","constraints","constraintsByName","_bindConstraints","parsley_field__statusMapping","_isRequired","validateIfEmpty","refreshConstraints","groupedConstraints","_getGroupedConstraints","_","_validateConstraint","_handleWhitespace","addConstraint","removeConstraint","updateConstraint","_bindHtml5Constraints","hasClass","trimValue","whitespace","index","p","sort","a","b","parsley_field","ParsleyMultiple","addElement","$elements","fieldConstraints","has","data","filter","_init","ParsleyFactory","savedparsleyFormInstance","__version__","bind","isMultiple","handleMultiple","parsleyMultipleInstance","$previouslyRelated","get","doNotStore","ParsleyExtend","vernums","jquery","forEach","document","version","psly","instances","ParsleyConfig","ParsleyUtils","registry","i18n","method","autoBind","deprecated","callback","unsubscribeAll","emit","instanceGiven","asyncValidators","default","xhr","status","reverse","addAsyncValidator","ajaxOptions","csr","indexOf","encodeURIComponent","remoteOptions","param","_remoteCache","ajax","handleXhr","then"],"mappings":"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","file":"parsley.min.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 ParsleyUtils__ParsleyUtils = {\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.apply(window.console, arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn.apply(this, 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 // 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\n var ParsleyUtils__default = ParsleyUtils__ParsleyUtils;\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 ParsleyDefaults = {\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()` that will trigger validation. eg: `keyup`, `change`...\n trigger: false,\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 (ParsleyField) {},\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 (ParsleyField) {},\n\n // ul elem that would receive errors' list\n errorsWrapper: '',\n\n // li elem that would receive error message\n errorTemplate: '
  • '\n };\n\n var ParsleyAbstract = function () {};\n\n ParsleyAbstract.prototype = {\n asyncSupport: true, // Deprecated\n\n actualizeOptions: function () {\n ParsleyUtils__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 = ParsleyUtils__default.objectCreate(this.parent.options);\n this.options = ParsleyUtils__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 // Reset UI\n reset: function () {\n // Field case: just emit a reset event for UI\n if ('ParsleyForm' !== this.__class__)\n return this._trigger('reset');\n\n // Form case: emit a reset event for each field\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i]._trigger('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 if ('ParsleyForm' !== this.__class__) {\n this.$element.removeData('Parsley');\n this.$element.removeData('ParsleyFieldMultiple');\n this._trigger('destroy');\n\n return;\n }\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 asyncIsValid: function () {\n ParsleyUtils__default.warnOnce(\"asyncIsValid is deprecated; please use whenIsValid instead\");\n return this.whenValid.apply(this, arguments);\n },\n\n _findRelatedMultiple: function () {\n return this.parent.$element.find(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`);\n }\n };\n\n var requirementConverters = {\n string: function(string) {\n return string;\n },\n integer: function(string) {\n if (isNaN(string))\n throw 'Requirement is not an integer: \"' + string + '\"';\n return parseInt(string, 10);\n },\n number: function(string) {\n if (isNaN(string))\n throw 'Requirement is not a number: \"' + string + '\"';\n return parseFloat(string);\n },\n reference: function(string) { // Unused for now\n var result = $(string);\n if (result.length === 0)\n throw 'No such reference: \"' + string + '\"';\n return result;\n },\n boolean: function(string) {\n return string !== 'false';\n },\n object: function(string) {\n return ParsleyUtils__default.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 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(ParsleyUtils__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 convertRequirement = function(requirementType, string) {\n var converter = requirementConverters[requirementType || 'string'];\n if (!converter)\n throw 'Unknown requirement specification: \"' + requirementType + '\"';\n return converter(string);\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 = convertRequirement(requirementSpec[key], value);\n extra[key] = value;\n } else {\n main = convertRequirement(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 ParsleyValidator = function(spec) {\n $.extend(true, this, spec);\n };\n\n ParsleyValidator.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.call(this, 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.apply(this, arguments);\n } else {\n if (this.validateNumber) {\n if (isNaN(value))\n 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(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] = convertRequirement(type[i], values[i]);\n return values;\n } else if ($.isPlainObject(type)) {\n return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n } else {\n return [convertRequirement(type, requirements)];\n }\n },\n // Defaults:\n requirementType: 'string',\n\n priority: 2\n\n };\n\n var ParsleyValidatorRegistry = function (validators, catalog) {\n this.__class__ = 'ParsleyValidatorRegistry';\n\n // Default Parsley locale is en\n this.locale = 'en';\n\n this.init(validators || {}, catalog || {});\n };\n\n var typeRegexes = {\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 number: /^-?(?:\\d+|\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\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 typeRegexes.range = typeRegexes.number;\n\n ParsleyValidatorRegistry.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 ParsleyUtils__default.warn('Validator \"' + name + '\" is already defined.');\n else if (ParsleyDefaults.hasOwnProperty(name)) {\n ParsleyUtils__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 (name, arg1, arg2) {\n if (!this.validators[name]) {\n ParsleyUtils__default.warn('Validator \"' + name + '\" is not already defined.');\n return this.addValidator.apply(this, arguments);\n }\n return this._setValidator(this, arguments);\n },\n\n removeValidator: function (name) {\n if (!this.validators[name])\n ParsleyUtils__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 ParsleyValidator(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(new RegExp('%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) {\n var regex = typeRegexes[type];\n if (!regex)\n throw new Error('validator type `' + type + '` is not supported');\n return regex.test(value);\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: {\n validateNumber: function (value, requirement) {\n return value >= requirement;\n },\n requirementType: 'number',\n priority: 30\n },\n max: {\n validateNumber: function (value, requirement) {\n return value <= requirement;\n },\n requirementType: 'number',\n priority: 30\n },\n range: {\n validateNumber: function (value, min, max) {\n return value >= min && value <= max;\n },\n requirementType: ['number', 'number'],\n priority: 30\n },\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 ParsleyUI = function (options) {\n this.__class__ = 'ParsleyUI';\n };\n\n ParsleyUI.prototype = {\n listen: function () {\n var that = this;\n window.Parsley\n .on('form:init', function () { that.setupForm (this); } )\n .on('field:init', function () { that.setupField(this); } )\n .on('field:validated', function () { that.reflow (this); } )\n .on('form:validated', function () { that.focus (this); } )\n .on('field:reset', function () { that.reset (this); } )\n .on('form:destroy', function () { that.destroy (this); } )\n .on('field:destroy', function () { that.destroy (this); } );\n\n return this;\n },\n\n reflow: function (fieldInstance) {\n // If this field has not an active UI (case for multiples) don't bother doing something\n if ('undefined' === typeof fieldInstance._ui || false === fieldInstance._ui.active)\n return;\n\n // Diff between two validation results\n var diff = this._diff(fieldInstance.validationResult, fieldInstance._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n fieldInstance._ui.lastValidationResult = fieldInstance.validationResult;\n\n // Field have been validated at least once if here. Useful for binded key events...\n fieldInstance._ui.validatedOnce = true;\n\n // Handle valid / invalid / none field class\n this.manageStatusClass(fieldInstance);\n\n // Add, remove, updated errors messages\n this.manageErrorsMessages(fieldInstance, diff);\n\n // Triggers impl\n this.actualizeTriggers(fieldInstance);\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) && true !== fieldInstance._ui.failedOnce)\n this.manageFailingFieldTrigger(fieldInstance);\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function (fieldInstance) {\n // No error message, field is valid\n if (true === fieldInstance.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < fieldInstance.validationResult.length; i++)\n messages.push(fieldInstance.validationResult[i].errorMessage ||\n this._getErrorMessage(fieldInstance, fieldInstance.validationResult[i].assert));\n\n return messages;\n },\n\n manageStatusClass: function (fieldInstance) {\n if (fieldInstance.hasConstraints() && fieldInstance.needsValidation() && true === fieldInstance.validationResult)\n this._successClass(fieldInstance);\n else if (fieldInstance.validationResult.length > 0)\n this._errorClass(fieldInstance);\n else\n this._resetClass(fieldInstance);\n },\n\n manageErrorsMessages: function (fieldInstance, diff) {\n if ('undefined' !== typeof fieldInstance.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 fieldInstance.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper(fieldInstance);\n\n if (0 === fieldInstance._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n fieldInstance._ui.$errorsWrapper\n .append(\n $(fieldInstance.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return fieldInstance._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(fieldInstance.options.errorMessage);\n }\n\n return fieldInstance._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(fieldInstance, diff.removed[i].assert.name, true);\n\n for (i = 0; i < diff.added.length; i++)\n this.addError(fieldInstance, diff.added[i].assert.name, diff.added[i].errorMessage, diff.added[i].assert, true);\n\n for (i = 0; i < diff.kept.length; i++)\n this.updateError(fieldInstance, diff.kept[i].assert.name, diff.kept[i].errorMessage, diff.kept[i].assert, true);\n },\n\n // TODO: strange API here, intuitive for manual usage with addError(pslyInstance, 'foo', 'bar')\n // but a little bit complex for above internal usage, with forced undefined parameter...\n addError: function (fieldInstance, name, message, assert, doNotUpdateClass) {\n this._insertErrorWrapper(fieldInstance);\n fieldInstance._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(fieldInstance.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(fieldInstance, assert))\n );\n\n if (true !== doNotUpdateClass)\n this._errorClass(fieldInstance);\n },\n\n // Same as above\n updateError: function (fieldInstance, name, message, assert, doNotUpdateClass) {\n fieldInstance._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(fieldInstance, assert));\n\n if (true !== doNotUpdateClass)\n this._errorClass(fieldInstance);\n },\n\n // Same as above twice\n removeError: function (fieldInstance, name, doNotUpdateClass) {\n fieldInstance._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n\n // edge case possible here: remove a standard Parsley error that is still failing in fieldInstance.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (true !== doNotUpdateClass)\n this.manageStatusClass(fieldInstance);\n },\n\n focus: function (formInstance) {\n formInstance._focusedField = null;\n\n if (true === formInstance.validationResult || 'none' === formInstance.options.focus)\n return null;\n\n for (var i = 0; i < formInstance.fields.length; i++) {\n var field = formInstance.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n formInstance._focusedField = field.$element;\n if ('first' === formInstance.options.focus)\n break;\n }\n }\n\n if (null === formInstance._focusedField)\n return null;\n\n return formInstance._focusedField.focus();\n },\n\n _getErrorMessage: function (fieldInstance, constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof fieldInstance.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(fieldInstance.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _diff: 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 ? this._diff(oldResult, newResult, true).added : []\n };\n },\n\n setupForm: function (formInstance) {\n formInstance.$element.on('submit.Parsley', false, $.proxy(formInstance.onSubmitValidate, formInstance));\n formInstance.$element.on('click.Parsley', 'input[type=\"submit\"], button[type=\"submit\"]', $.proxy(formInstance.onSubmitButton, formInstance));\n\n // UI could be disabled\n if (false === formInstance.options.uiEnabled)\n return;\n\n formInstance.$element.attr('novalidate', '');\n },\n\n setupField: function (fieldInstance) {\n var _ui = {active: false};\n\n // UI could be disabled\n if (false === fieldInstance.options.uiEnabled)\n return;\n\n _ui.active = true;\n\n // Give field its Parsley id in DOM\n fieldInstance.$element.attr(fieldInstance.options.namespace + 'id', fieldInstance.__id__);\n\n /** Generate important UI elements and store them in fieldInstance **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler(fieldInstance);\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (fieldInstance.options.multiple ? 'multiple-' + fieldInstance.options.multiple : fieldInstance.__id__);\n _ui.$errorsWrapper = $(fieldInstance.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.validatedOnce = false;\n _ui.validationInformationVisible = false;\n\n // Store it in fieldInstance for later\n fieldInstance._ui = _ui;\n\n // Bind triggers first time\n this.actualizeTriggers(fieldInstance);\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function (fieldInstance) {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof fieldInstance.options.classHandler && $(fieldInstance.options.classHandler).length)\n return $(fieldInstance.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = fieldInstance.options.classHandler(fieldInstance);\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 // Otherwise, if simple element (input, texatrea, select...) it will perfectly host the classes\n if (!fieldInstance.options.multiple || fieldInstance.$element.is('select'))\n return fieldInstance.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return fieldInstance.$element.parent();\n },\n\n _insertErrorWrapper: function (fieldInstance) {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== fieldInstance._ui.$errorsWrapper.parent().length)\n return fieldInstance._ui.$errorsWrapper.parent();\n\n if ('string' === typeof fieldInstance.options.errorsContainer) {\n if ($(fieldInstance.options.errorsContainer).length)\n return $(fieldInstance.options.errorsContainer).append(fieldInstance._ui.$errorsWrapper);\n else\n ParsleyUtils__default.warn('The errors container `' + fieldInstance.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof fieldInstance.options.errorsContainer)\n $errorsContainer = fieldInstance.options.errorsContainer(fieldInstance);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(fieldInstance._ui.$errorsWrapper);\n\n var $from = fieldInstance.$element;\n if (fieldInstance.options.multiple)\n $from = $from.parent();\n return $from.after(fieldInstance._ui.$errorsWrapper);\n },\n\n actualizeTriggers: function (fieldInstance) {\n var $toBind = fieldInstance.$element;\n if (fieldInstance.options.multiple)\n $toBind = $('[' + fieldInstance.options.namespace + 'multiple=\"' + fieldInstance.options.multiple + '\"]');\n\n // Remove Parsley events already binded on this field\n $toBind.off('.Parsley');\n\n // If no trigger is set, all good\n if (false === fieldInstance.options.trigger)\n return;\n\n var triggers = fieldInstance.options.trigger.replace(/^\\s+/g , '').replace(/\\s+$/g , '');\n\n if ('' === triggers)\n return;\n\n // Bind fieldInstance.eventValidate if exists (for parsley.ajax for example), ParsleyUI.eventValidate otherwise\n $toBind.on(\n triggers.split(' ').join('.Parsley ') + '.Parsley',\n $.proxy('function' === typeof fieldInstance.eventValidate ? fieldInstance.eventValidate : this.eventValidate, fieldInstance));\n },\n\n // Called through $.proxy with fieldInstance. `this` context is ParsleyField\n eventValidate: function (event) {\n // For keyup, keypress, keydown... 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 (new RegExp('key').test(event.type))\n if (!this._ui.validationInformationVisible && this.getValue().length <= this.options.validationThreshold)\n return;\n\n this._ui.validatedOnce = true;\n this.validate();\n },\n\n manageFailingFieldTrigger: function (fieldInstance) {\n fieldInstance._ui.failedOnce = true;\n\n // Radio and checkboxes fields must bind every field multiple\n if (fieldInstance.options.multiple)\n $('[' + fieldInstance.options.namespace + 'multiple=\"' + fieldInstance.options.multiple + '\"]').each(function () {\n if (!new RegExp('change', 'i').test($(this).parsley().options.trigger || ''))\n return $(this).on('change.ParsleyFailedOnce', false, $.proxy(fieldInstance.validate, fieldInstance));\n });\n\n // Select case\n if (fieldInstance.$element.is('select'))\n if (!new RegExp('change', 'i').test(fieldInstance.options.trigger || ''))\n return fieldInstance.$element.on('change.ParsleyFailedOnce', false, $.proxy(fieldInstance.validate, fieldInstance));\n\n // All other inputs fields\n if (!new RegExp('keyup', 'i').test(fieldInstance.options.trigger || ''))\n return fieldInstance.$element.on('keyup.ParsleyFailedOnce', false, $.proxy(fieldInstance.validate, fieldInstance));\n },\n\n reset: function (parsleyInstance) {\n // Reset all event listeners\n this.actualizeTriggers(parsleyInstance);\n parsleyInstance.$element.off('.ParsleyFailedOnce');\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof parsleyInstance._ui)\n return;\n\n if ('ParsleyForm' === parsleyInstance.__class__)\n return;\n\n // Reset all errors' li\n parsleyInstance._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass(parsleyInstance);\n\n // Reset validation flags and last validation result\n parsleyInstance._ui.validatedOnce = false;\n parsleyInstance._ui.lastValidationResult = [];\n parsleyInstance._ui.validationInformationVisible = false;\n parsleyInstance._ui.failedOnce = false;\n },\n\n destroy: function (parsleyInstance) {\n this.reset(parsleyInstance);\n\n if ('ParsleyForm' === parsleyInstance.__class__)\n return;\n\n if ('undefined' !== typeof parsleyInstance._ui)\n parsleyInstance._ui.$errorsWrapper.remove();\n\n delete parsleyInstance._ui;\n },\n\n _successClass: function (fieldInstance) {\n fieldInstance._ui.validationInformationVisible = true;\n fieldInstance._ui.$errorClassHandler.removeClass(fieldInstance.options.errorClass).addClass(fieldInstance.options.successClass);\n },\n _errorClass: function (fieldInstance) {\n fieldInstance._ui.validationInformationVisible = true;\n fieldInstance._ui.$errorClassHandler.removeClass(fieldInstance.options.successClass).addClass(fieldInstance.options.errorClass);\n },\n _resetClass: function (fieldInstance) {\n fieldInstance._ui.$errorClassHandler.removeClass(fieldInstance.options.successClass).removeClass(fieldInstance.options.errorClass);\n }\n };\n\n var ParsleyForm = function (element, domOptions, options) {\n this.__class__ = 'ParsleyForm';\n this.__id__ = ParsleyUtils__default.generateID();\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 ParsleyForm__statusMapping = {pending: null, resolved: true, rejected: false};\n\n ParsleyForm.prototype = {\n onSubmitValidate: function (event) {\n var that = 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)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n this._$submitSource = this._$submitSource || this.$element.find('input[type=\"submit\"], button[type=\"submit\"]').first();\n\n if (this._$submitSource.is('[formnovalidate]')) {\n this._$submitSource = null;\n return;\n }\n\n // Because some validations might be asynchroneous,\n // we cancel this submit and will fake it after validation.\n event.stopImmediatePropagation();\n event.preventDefault();\n\n this.whenValidate(undefined, undefined, event)\n .done(function () { that._submit(); })\n .always(function () { that._$submitSource = null; });\n\n return this;\n },\n\n onSubmitButton: function(event) {\n this._$submitSource = $(event.target);\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 () {\n if (false === this._trigger('submit'))\n return;\n this.$element.find('.parsley_synthetic_submit_button').remove();\n // Add submit button's data\n if (this._$submitSource) {\n $('')\n .attr('name', this._$submitSource.attr('name'))\n .attr('value', this._$submitSource.attr('value'))\n .appendTo(this.$element);\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 al validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Prefer `whenValidate`.\n validate: function (group, force, event) {\n return ParsleyForm__statusMapping[ this.whenValidate(group, force, event).state() ];\n },\n\n whenValidate: function (group, force, event) {\n var that = this;\n this.submitEvent = event;\n this.validationResult = true;\n\n // fire validate event to eventually modify things before very 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(this.fields, function(field) {\n // do not validate a field if not the same as given validation group\n if (!group || that._isFieldInGroup(field, group))\n return field.whenValidate(force);\n });\n });\n\n var promiseBasedOnValidationResult = function () {\n var r = $.Deferred();\n if (false === that.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n\n return $.when.apply($, promises)\n .done( function () { that._trigger('success'); })\n .fail( function () { that.validationResult = false; that._trigger('error'); })\n .always(function () { that._trigger('validated'); })\n .pipe( promiseBasedOnValidationResult, promiseBasedOnValidationResult);\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 (group, force) {\n return ParsleyForm__statusMapping[ this.whenValid(group, force).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 var that = this;\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(function () {\n return $.map(this.fields, function(field) {\n // do not validate a field if not the same as given validation group\n if (!group || that._isFieldInGroup(field, group))\n return field.whenValid(force);\n });\n });\n return $.when.apply($, promises);\n },\n\n _isFieldInGroup: function (field, group) {\n if ($.isArray(field.options.group))\n return -1 !== $.inArray(group, field.options.group);\n return field.options.group === group;\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var self = this;\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(function () {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each(function () {\n var fieldInstance = new window.Parsley.Factory(this, {}, self);\n\n // Only add valid and not excluded `ParsleyField` and `ParsleyFieldMultiple` children\n if (('ParsleyField' === fieldInstance.__class__ || 'ParsleyFieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded))\n if ('undefined' === typeof self.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__]) {\n self.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__] = fieldInstance;\n self.fields.push(fieldInstance);\n }\n });\n\n $(oldFields).not(self.fields).each(function () {\n this._trigger('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.call(this); // Keep the current `this`.\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 ConstraintFactory = function (parsleyField, name, requirements, priority, isDomConstraint) {\n if (!new RegExp('ParsleyField').test(parsleyField.__class__))\n throw new Error('ParsleyField or ParsleyFieldMultiple instance expected');\n\n var validatorSpec = window.Parsley._validatorRegistry.validators[name];\n var validator = new ParsleyValidator(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 ConstraintFactory.prototype = {\n validate: function(value, instance) {\n var args = this.requirementList.slice(0); // Make copy\n args.unshift(value);\n args.push(instance);\n return this.validator.validate.apply(this.validator, args);\n },\n\n _parseRequirements: function(options) {\n var that = this;\n this.requirementList = this.validator.parseRequirements(this.requirements, function(key) {\n return options[that.name + capitalize(key)];\n });\n }\n };\n\n var ParsleyField = function (field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'ParsleyField';\n this.__id__ = ParsleyUtils__default.generateID();\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 = [];\n\n // Bind constraints\n this._bindConstraints();\n };\n\n var parsley_field__statusMapping = {pending: null, resolved: true, rejected: false};\n\n ParsleyField.prototype = {\n // # Public API\n // Validate field and trigger some events for mainly `ParsleyUI`\n // @returns `true`, an array of the validators that failed, or\n // `null` if validation is not finished. Prefer using whenValidate\n validate: function (force) {\n var promise = this.whenValidate(force);\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 `ParsleyUI`\n // @returns a promise that succeeds only when all validations do.\n whenValidate: function (force) {\n var that = this;\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, this.value)\n .done(function () { that._trigger('success'); })\n .fail(function () { that._trigger('error'); })\n .always(function () { that._trigger('validated'); });\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 // 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 (force, value) {\n return parsley_field__statusMapping[this.whenValid(force, value).state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do.\n // The argument `force` is optional, defaults to `false`.\n // The argument `value` is optional. If given, it will be validated instead of the value of the input.\n whenValid: function (force, value) {\n // Recompute options and rebind constraints to have latest changes\n this.refreshConstraints();\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Make `force` argument optional\n if ('boolean' !== typeof force && 'undefined' === typeof value) {\n value = force;\n force = false;\n }\n // Value could be passed as argument, needed to add more power to 'parsley: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 var that = this;\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 = $.when.apply($,\n $.map(constraints, $.proxy(that, '_validateConstraint', value))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return $.when.apply($, promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var that = this;\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 $.when(result).fail(function(errorMessage) {\n if (true === that.validationResult)\n that.validationResult = [];\n that.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 // 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 ConstraintFactory(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.hasClass('required') || 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 if (('undefined' === typeof this.$element.attr('step')) || (0 === parseFloat(this.$element.attr('step')) % 1)) {\n return this.addConstraint('type', 'integer', undefined, true);\n } else {\n return this.addConstraint('type', 'number', undefined, true);\n }\n // Regular other HTML5 supported types\n } else if (/^(email|url|range)$/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 ParsleyUtils__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 = ParsleyUtils__default.trimString(value);\n\n return value;\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 = ParsleyField;\n\n var ParsleyMultiple = function () {\n this.__class__ = 'ParsleyFieldMultiple';\n };\n\n ParsleyMultiple.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 `ParsleyField.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('ParsleyFieldMultiple').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 `ParsleyField.getValue()`\n getValue: function () {\n // Value could be overriden in DOM\n 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._findRelatedMultiple().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelatedMultiple().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 ParsleyFactory = 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 ParsleyForm 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 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 && 'ParsleyForm' !== parsleyFormInstance.__class__)\n throw new Error('Parent instance must be a ParsleyForm instance');\n\n this.parent = parsleyFormInstance || window.Parsley;\n return this.init(options);\n };\n\n ParsleyFactory.prototype = {\n init: function (options) {\n this.__class__ = 'Parsley';\n this.__version__ = '@@version';\n this.__id__ = ParsleyUtils__default.generateID();\n\n // Pre-compute options\n this._resetOptions(options);\n\n // A ParsleyForm instance is obviously a `
    ` element but also every node that is not an input and has the `data-parsley-validate` attribute\n if (this.$element.is('form') || (ParsleyUtils__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 `ParsleyField` or `ParsleyFieldMultiple`\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 that = this;\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 ParsleyUtils__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 () {\n if ($(this).is('input[type=radio], input[type=checkbox]'))\n $(this).attr(that.options.namespace + 'multiple', that.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelatedMultiple();\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('ParsleyFieldMultiple')) {\n parsleyMultipleInstance.addElement(this.$element);\n }\n\n break;\n }\n }\n\n // Create a secret ParsleyField instance for every multiple field. It will be stored in `data('ParsleyFieldMultiple')`\n // And will be useful later to access classic `ParsleyField` stuff while being in a `ParsleyFieldMultiple` instance\n this.bind('parsleyField', true);\n\n return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n },\n\n // Return proper `ParsleyForm`, `ParsleyField` or `ParsleyFieldMultiple`\n bind: function (type, doNotStore) {\n var parsleyInstance;\n\n switch (type) {\n case 'parsleyForm':\n parsleyInstance = $.extend(\n new ParsleyForm(this.$element, this.domOptions, this.options),\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 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 ParsleyMultiple(),\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 ParsleyUtils__default.setAttr(this.$element, this.options.namespace, 'multiple', this.options.multiple);\n\n if ('undefined' !== typeof doNotStore) {\n this.$element.data('ParsleyFieldMultiple', 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 ParsleyForm or ParsleyField instance!\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 ParsleyUtils__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 ParsleyAbstract(), {\n $element: $(document),\n actualizeOptions: null,\n _resetOptions: null,\n Factory: ParsleyFactory,\n version: '@@version'\n });\n\n // Supplement ParsleyField and Form with ParsleyAbstract\n // This way, the constructors will have access to those methods\n $.extend(parsley_field.prototype, ParsleyAbstract.prototype);\n $.extend(ParsleyForm.prototype, ParsleyAbstract.prototype);\n // Inherit actualizeOptions and _resetOptions:\n $.extend(ParsleyFactory.prototype, ParsleyAbstract.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 ParsleyUtils__default.warn('You must bind Parsley on an existing element.');\n\n return;\n }\n\n return new ParsleyFactory(this, options);\n };\n\n // ### ParsleyField and ParsleyForm 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(ParsleyUtils__default.objectCreate(ParsleyDefaults), window.ParsleyConfig);\n window.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n // ### Globals\n window.Parsley = window.psly = Parsley;\n window.ParsleyUtils = ParsleyUtils__default;\n\n // ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\n var registry = window.Parsley._validatorRegistry = new ParsleyValidatorRegistry(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 ParsleyUtils__default.warnOnce(`Accessing the method '${method}' through ParsleyValidator is deprecated. Simply call 'window.Parsley.${method}(...)'`);\n return window.Parsley[method].apply(window.Parsley, arguments);\n };\n });\n\n // ### ParsleyUI\n // UI is a separate class that only listens to some events and then modifies the DOM accordingly\n // Could be overriden by defining a `window.ParsleyConfig.ParsleyUI` appropriate class (with `listen()` method basically)\n window.ParsleyUI = 'function' === typeof window.ParsleyConfig.ParsleyUI ?\n new window.ParsleyConfig.ParsleyUI().listen() : new ParsleyUI().listen();\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 ParsleyUtils__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 ParsleyForm))\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 ParsleyForm))\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 ParsleyForm);\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.apply(instance, 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 eventValidate: function (event) {\n // For keyup, keypress, keydown.. 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 (new RegExp('key').test(event.type))\n if (!this._ui.validationInformationVisible && this.getValue().length <= this.options.validationThreshold)\n return;\n\n this._ui.validatedOnce = true;\n this.whenValidate();\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 ParsleyUtils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.apply(Parsley.addAsyncValidator, arguments);\n };\n\n // This is bundled with the Parsley library\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 var parsley = Parsley;\n\n return parsley;\n\n}));\n","import $ from 'jquery';\nimport ParsleyField from './field';\nimport ParsleyForm from './form';\nimport ParsleyUtils from './utils';\n\nvar o = $({});\nvar deprecated = function () {\n ParsleyUtils.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 ParsleyField) && !(instance instanceof ParsleyForm))\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 ParsleyField) && !(instance instanceof ParsleyForm))\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 ParsleyField) || (instance instanceof ParsleyForm);\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.apply(instance, args);\n};\n\nexport default {};\n","import $ from 'jquery';\n\nvar globalID = 1;\nvar pastWarnings = {};\n\nvar ParsleyUtils = {\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.apply(window.console, arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn.apply(this, 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 // 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\nexport default ParsleyUtils;\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 ParsleyDefaults = {\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()` that will trigger validation. eg: `keyup`, `change`...\n trigger: false,\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 (ParsleyField) {},\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 (ParsleyField) {},\n\n // ul elem that would receive errors' list\n errorsWrapper: '',\n\n // li elem that would receive error message\n errorTemplate: '
  • '\n};\n\nexport default ParsleyDefaults;\n","import $ from 'jquery';\nimport ParsleyUtils from './utils';\n\nvar ParsleyAbstract = function () {};\n\nParsleyAbstract.prototype = {\n asyncSupport: true, // Deprecated\n\n actualizeOptions: function () {\n ParsleyUtils.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 = ParsleyUtils.objectCreate(this.parent.options);\n this.options = ParsleyUtils.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 // Reset UI\n reset: function () {\n // Field case: just emit a reset event for UI\n if ('ParsleyForm' !== this.__class__)\n return this._trigger('reset');\n\n // Form case: emit a reset event for each field\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i]._trigger('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 if ('ParsleyForm' !== this.__class__) {\n this.$element.removeData('Parsley');\n this.$element.removeData('ParsleyFieldMultiple');\n this._trigger('destroy');\n\n return;\n }\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 asyncIsValid: function () {\n ParsleyUtils.warnOnce(\"asyncIsValid is deprecated; please use whenIsValid instead\");\n return this.whenValid.apply(this, arguments);\n },\n\n _findRelatedMultiple: function () {\n return this.parent.$element.find(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`);\n }\n};\n\nexport default ParsleyAbstract;\n","import $ from 'jquery';\nimport ParsleyUtils from './utils';\n\nvar requirementConverters = {\n string: function(string) {\n return string;\n },\n integer: function(string) {\n if (isNaN(string))\n throw 'Requirement is not an integer: \"' + string + '\"';\n return parseInt(string, 10);\n },\n number: function(string) {\n if (isNaN(string))\n throw 'Requirement is not a number: \"' + string + '\"';\n return parseFloat(string);\n },\n reference: function(string) { // Unused for now\n var result = $(string);\n if (result.length === 0)\n throw 'No such reference: \"' + string + '\"';\n return result;\n },\n boolean: function(string) {\n return string !== 'false';\n },\n object: function(string) {\n return ParsleyUtils.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\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(ParsleyUtils.trimString);\n if (values.length !== length)\n throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n return values;\n};\n\nvar convertRequirement = function(requirementType, string) {\n var converter = requirementConverters[requirementType || 'string'];\n if (!converter)\n throw 'Unknown requirement specification: \"' + requirementType + '\"';\n return converter(string);\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 = convertRequirement(requirementSpec[key], value);\n extra[key] = value;\n } else {\n main = convertRequirement(requirementSpec[key], string);\n }\n }\n return [main, extra];\n};\n\n// A Validator needs to implement the methods `validate` and `parseRequirements`\n\nvar ParsleyValidator = function(spec) {\n $.extend(true, this, spec);\n};\n\nParsleyValidator.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.call(this, 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.apply(this, arguments);\n } else {\n if (this.validateNumber) {\n if (isNaN(value))\n 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(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] = convertRequirement(type[i], values[i]);\n return values;\n } else if ($.isPlainObject(type)) {\n return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n } else {\n return [convertRequirement(type, requirements)];\n }\n },\n // Defaults:\n requirementType: 'string',\n\n priority: 2\n\n};\n\nexport default ParsleyValidator;\n","import $ from 'jquery';\nimport ParsleyUtils from './utils';\nimport ParsleyDefaults from './defaults';\nimport ParsleyValidator from './validator';\n\nvar ParsleyValidatorRegistry = function (validators, catalog) {\n this.__class__ = 'ParsleyValidatorRegistry';\n\n // Default Parsley locale is en\n this.locale = 'en';\n\n this.init(validators || {}, catalog || {});\n};\n\nvar typeRegexes = {\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 number: /^-?(?:\\d+|\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\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};\ntypeRegexes.range = typeRegexes.number;\n\nParsleyValidatorRegistry.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 ParsleyUtils.warn('Validator \"' + name + '\" is already defined.');\n else if (ParsleyDefaults.hasOwnProperty(name)) {\n ParsleyUtils.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 (name, arg1, arg2) {\n if (!this.validators[name]) {\n ParsleyUtils.warn('Validator \"' + name + '\" is not already defined.');\n return this.addValidator.apply(this, arguments);\n }\n return this._setValidator(this, arguments);\n },\n\n removeValidator: function (name) {\n if (!this.validators[name])\n ParsleyUtils.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 ParsleyValidator(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(new RegExp('%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) {\n var regex = typeRegexes[type];\n if (!regex)\n throw new Error('validator type `' + type + '` is not supported');\n return regex.test(value);\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: {\n validateNumber: function (value, requirement) {\n return value >= requirement;\n },\n requirementType: 'number',\n priority: 30\n },\n max: {\n validateNumber: function (value, requirement) {\n return value <= requirement;\n },\n requirementType: 'number',\n priority: 30\n },\n range: {\n validateNumber: function (value, min, max) {\n return value >= min && value <= max;\n },\n requirementType: ['number', 'number'],\n priority: 30\n },\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 ParsleyValidatorRegistry;\n","import $ from 'jquery';\nimport ParsleyUtils from './utils';\n\nvar ParsleyUI = function (options) {\n this.__class__ = 'ParsleyUI';\n};\n\nParsleyUI.prototype = {\n listen: function () {\n var that = this;\n window.Parsley\n .on('form:init', function () { that.setupForm (this); } )\n .on('field:init', function () { that.setupField(this); } )\n .on('field:validated', function () { that.reflow (this); } )\n .on('form:validated', function () { that.focus (this); } )\n .on('field:reset', function () { that.reset (this); } )\n .on('form:destroy', function () { that.destroy (this); } )\n .on('field:destroy', function () { that.destroy (this); } );\n\n return this;\n },\n\n reflow: function (fieldInstance) {\n // If this field has not an active UI (case for multiples) don't bother doing something\n if ('undefined' === typeof fieldInstance._ui || false === fieldInstance._ui.active)\n return;\n\n // Diff between two validation results\n var diff = this._diff(fieldInstance.validationResult, fieldInstance._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n fieldInstance._ui.lastValidationResult = fieldInstance.validationResult;\n\n // Field have been validated at least once if here. Useful for binded key events...\n fieldInstance._ui.validatedOnce = true;\n\n // Handle valid / invalid / none field class\n this.manageStatusClass(fieldInstance);\n\n // Add, remove, updated errors messages\n this.manageErrorsMessages(fieldInstance, diff);\n\n // Triggers impl\n this.actualizeTriggers(fieldInstance);\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) && true !== fieldInstance._ui.failedOnce)\n this.manageFailingFieldTrigger(fieldInstance);\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function (fieldInstance) {\n // No error message, field is valid\n if (true === fieldInstance.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < fieldInstance.validationResult.length; i++)\n messages.push(fieldInstance.validationResult[i].errorMessage ||\n this._getErrorMessage(fieldInstance, fieldInstance.validationResult[i].assert));\n\n return messages;\n },\n\n manageStatusClass: function (fieldInstance) {\n if (fieldInstance.hasConstraints() && fieldInstance.needsValidation() && true === fieldInstance.validationResult)\n this._successClass(fieldInstance);\n else if (fieldInstance.validationResult.length > 0)\n this._errorClass(fieldInstance);\n else\n this._resetClass(fieldInstance);\n },\n\n manageErrorsMessages: function (fieldInstance, diff) {\n if ('undefined' !== typeof fieldInstance.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 fieldInstance.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper(fieldInstance);\n\n if (0 === fieldInstance._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n fieldInstance._ui.$errorsWrapper\n .append(\n $(fieldInstance.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return fieldInstance._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(fieldInstance.options.errorMessage);\n }\n\n return fieldInstance._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(fieldInstance, diff.removed[i].assert.name, true);\n\n for (i = 0; i < diff.added.length; i++)\n this.addError(fieldInstance, diff.added[i].assert.name, diff.added[i].errorMessage, diff.added[i].assert, true);\n\n for (i = 0; i < diff.kept.length; i++)\n this.updateError(fieldInstance, diff.kept[i].assert.name, diff.kept[i].errorMessage, diff.kept[i].assert, true);\n },\n\n // TODO: strange API here, intuitive for manual usage with addError(pslyInstance, 'foo', 'bar')\n // but a little bit complex for above internal usage, with forced undefined parameter...\n addError: function (fieldInstance, name, message, assert, doNotUpdateClass) {\n this._insertErrorWrapper(fieldInstance);\n fieldInstance._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(fieldInstance.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(fieldInstance, assert))\n );\n\n if (true !== doNotUpdateClass)\n this._errorClass(fieldInstance);\n },\n\n // Same as above\n updateError: function (fieldInstance, name, message, assert, doNotUpdateClass) {\n fieldInstance._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(fieldInstance, assert));\n\n if (true !== doNotUpdateClass)\n this._errorClass(fieldInstance);\n },\n\n // Same as above twice\n removeError: function (fieldInstance, name, doNotUpdateClass) {\n fieldInstance._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n\n // edge case possible here: remove a standard Parsley error that is still failing in fieldInstance.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (true !== doNotUpdateClass)\n this.manageStatusClass(fieldInstance);\n },\n\n focus: function (formInstance) {\n formInstance._focusedField = null;\n\n if (true === formInstance.validationResult || 'none' === formInstance.options.focus)\n return null;\n\n for (var i = 0; i < formInstance.fields.length; i++) {\n var field = formInstance.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n formInstance._focusedField = field.$element;\n if ('first' === formInstance.options.focus)\n break;\n }\n }\n\n if (null === formInstance._focusedField)\n return null;\n\n return formInstance._focusedField.focus();\n },\n\n _getErrorMessage: function (fieldInstance, constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof fieldInstance.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(fieldInstance.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _diff: 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 ? this._diff(oldResult, newResult, true).added : []\n };\n },\n\n setupForm: function (formInstance) {\n formInstance.$element.on('submit.Parsley', false, $.proxy(formInstance.onSubmitValidate, formInstance));\n formInstance.$element.on('click.Parsley', 'input[type=\"submit\"], button[type=\"submit\"]', $.proxy(formInstance.onSubmitButton, formInstance));\n\n // UI could be disabled\n if (false === formInstance.options.uiEnabled)\n return;\n\n formInstance.$element.attr('novalidate', '');\n },\n\n setupField: function (fieldInstance) {\n var _ui = {active: false};\n\n // UI could be disabled\n if (false === fieldInstance.options.uiEnabled)\n return;\n\n _ui.active = true;\n\n // Give field its Parsley id in DOM\n fieldInstance.$element.attr(fieldInstance.options.namespace + 'id', fieldInstance.__id__);\n\n /** Generate important UI elements and store them in fieldInstance **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler(fieldInstance);\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (fieldInstance.options.multiple ? 'multiple-' + fieldInstance.options.multiple : fieldInstance.__id__);\n _ui.$errorsWrapper = $(fieldInstance.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.validatedOnce = false;\n _ui.validationInformationVisible = false;\n\n // Store it in fieldInstance for later\n fieldInstance._ui = _ui;\n\n // Bind triggers first time\n this.actualizeTriggers(fieldInstance);\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function (fieldInstance) {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof fieldInstance.options.classHandler && $(fieldInstance.options.classHandler).length)\n return $(fieldInstance.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = fieldInstance.options.classHandler(fieldInstance);\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 // Otherwise, if simple element (input, texatrea, select...) it will perfectly host the classes\n if (!fieldInstance.options.multiple || fieldInstance.$element.is('select'))\n return fieldInstance.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return fieldInstance.$element.parent();\n },\n\n _insertErrorWrapper: function (fieldInstance) {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== fieldInstance._ui.$errorsWrapper.parent().length)\n return fieldInstance._ui.$errorsWrapper.parent();\n\n if ('string' === typeof fieldInstance.options.errorsContainer) {\n if ($(fieldInstance.options.errorsContainer).length)\n return $(fieldInstance.options.errorsContainer).append(fieldInstance._ui.$errorsWrapper);\n else\n ParsleyUtils.warn('The errors container `' + fieldInstance.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof fieldInstance.options.errorsContainer)\n $errorsContainer = fieldInstance.options.errorsContainer(fieldInstance);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(fieldInstance._ui.$errorsWrapper);\n\n var $from = fieldInstance.$element;\n if (fieldInstance.options.multiple)\n $from = $from.parent();\n return $from.after(fieldInstance._ui.$errorsWrapper);\n },\n\n actualizeTriggers: function (fieldInstance) {\n var $toBind = fieldInstance.$element;\n if (fieldInstance.options.multiple)\n $toBind = $('[' + fieldInstance.options.namespace + 'multiple=\"' + fieldInstance.options.multiple + '\"]');\n\n // Remove Parsley events already binded on this field\n $toBind.off('.Parsley');\n\n // If no trigger is set, all good\n if (false === fieldInstance.options.trigger)\n return;\n\n var triggers = fieldInstance.options.trigger.replace(/^\\s+/g , '').replace(/\\s+$/g , '');\n\n if ('' === triggers)\n return;\n\n // Bind fieldInstance.eventValidate if exists (for parsley.ajax for example), ParsleyUI.eventValidate otherwise\n $toBind.on(\n triggers.split(' ').join('.Parsley ') + '.Parsley',\n $.proxy('function' === typeof fieldInstance.eventValidate ? fieldInstance.eventValidate : this.eventValidate, fieldInstance));\n },\n\n // Called through $.proxy with fieldInstance. `this` context is ParsleyField\n eventValidate: function (event) {\n // For keyup, keypress, keydown... 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 (new RegExp('key').test(event.type))\n if (!this._ui.validationInformationVisible && this.getValue().length <= this.options.validationThreshold)\n return;\n\n this._ui.validatedOnce = true;\n this.validate();\n },\n\n manageFailingFieldTrigger: function (fieldInstance) {\n fieldInstance._ui.failedOnce = true;\n\n // Radio and checkboxes fields must bind every field multiple\n if (fieldInstance.options.multiple)\n $('[' + fieldInstance.options.namespace + 'multiple=\"' + fieldInstance.options.multiple + '\"]').each(function () {\n if (!new RegExp('change', 'i').test($(this).parsley().options.trigger || ''))\n return $(this).on('change.ParsleyFailedOnce', false, $.proxy(fieldInstance.validate, fieldInstance));\n });\n\n // Select case\n if (fieldInstance.$element.is('select'))\n if (!new RegExp('change', 'i').test(fieldInstance.options.trigger || ''))\n return fieldInstance.$element.on('change.ParsleyFailedOnce', false, $.proxy(fieldInstance.validate, fieldInstance));\n\n // All other inputs fields\n if (!new RegExp('keyup', 'i').test(fieldInstance.options.trigger || ''))\n return fieldInstance.$element.on('keyup.ParsleyFailedOnce', false, $.proxy(fieldInstance.validate, fieldInstance));\n },\n\n reset: function (parsleyInstance) {\n // Reset all event listeners\n this.actualizeTriggers(parsleyInstance);\n parsleyInstance.$element.off('.ParsleyFailedOnce');\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof parsleyInstance._ui)\n return;\n\n if ('ParsleyForm' === parsleyInstance.__class__)\n return;\n\n // Reset all errors' li\n parsleyInstance._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass(parsleyInstance);\n\n // Reset validation flags and last validation result\n parsleyInstance._ui.validatedOnce = false;\n parsleyInstance._ui.lastValidationResult = [];\n parsleyInstance._ui.validationInformationVisible = false;\n parsleyInstance._ui.failedOnce = false;\n },\n\n destroy: function (parsleyInstance) {\n this.reset(parsleyInstance);\n\n if ('ParsleyForm' === parsleyInstance.__class__)\n return;\n\n if ('undefined' !== typeof parsleyInstance._ui)\n parsleyInstance._ui.$errorsWrapper.remove();\n\n delete parsleyInstance._ui;\n },\n\n _successClass: function (fieldInstance) {\n fieldInstance._ui.validationInformationVisible = true;\n fieldInstance._ui.$errorClassHandler.removeClass(fieldInstance.options.errorClass).addClass(fieldInstance.options.successClass);\n },\n _errorClass: function (fieldInstance) {\n fieldInstance._ui.validationInformationVisible = true;\n fieldInstance._ui.$errorClassHandler.removeClass(fieldInstance.options.successClass).addClass(fieldInstance.options.errorClass);\n },\n _resetClass: function (fieldInstance) {\n fieldInstance._ui.$errorClassHandler.removeClass(fieldInstance.options.successClass).removeClass(fieldInstance.options.errorClass);\n }\n};\n\nexport default ParsleyUI;\n","import $ from 'jquery';\nimport ParsleyAbstract from './abstract';\nimport ParsleyUtils from './utils';\n\nvar ParsleyForm = function (element, domOptions, options) {\n this.__class__ = 'ParsleyForm';\n this.__id__ = ParsleyUtils.generateID();\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\nParsleyForm.prototype = {\n onSubmitValidate: function (event) {\n var that = 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)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n this._$submitSource = this._$submitSource || this.$element.find('input[type=\"submit\"], button[type=\"submit\"]').first();\n\n if (this._$submitSource.is('[formnovalidate]')) {\n this._$submitSource = null;\n return;\n }\n\n // Because some validations might be asynchroneous,\n // we cancel this submit and will fake it after validation.\n event.stopImmediatePropagation();\n event.preventDefault();\n\n this.whenValidate(undefined, undefined, event)\n .done(function () { that._submit(); })\n .always(function () { that._$submitSource = null; });\n\n return this;\n },\n\n onSubmitButton: function(event) {\n this._$submitSource = $(event.target);\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 () {\n if (false === this._trigger('submit'))\n return;\n this.$element.find('.parsley_synthetic_submit_button').remove();\n // Add submit button's data\n if (this._$submitSource) {\n $('')\n .attr('name', this._$submitSource.attr('name'))\n .attr('value', this._$submitSource.attr('value'))\n .appendTo(this.$element);\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 al validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Prefer `whenValidate`.\n validate: function (group, force, event) {\n return statusMapping[ this.whenValidate(group, force, event).state() ];\n },\n\n whenValidate: function (group, force, event) {\n var that = this;\n this.submitEvent = event;\n this.validationResult = true;\n\n // fire validate event to eventually modify things before very 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(this.fields, function(field) {\n // do not validate a field if not the same as given validation group\n if (!group || that._isFieldInGroup(field, group))\n return field.whenValidate(force);\n });\n });\n\n var promiseBasedOnValidationResult = function () {\n var r = $.Deferred();\n if (false === that.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n\n return $.when.apply($, promises)\n .done( function () { that._trigger('success'); })\n .fail( function () { that.validationResult = false; that._trigger('error'); })\n .always(function () { that._trigger('validated'); })\n .pipe( promiseBasedOnValidationResult, promiseBasedOnValidationResult);\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 (group, force) {\n return statusMapping[ this.whenValid(group, force).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 var that = this;\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(function () {\n return $.map(this.fields, function(field) {\n // do not validate a field if not the same as given validation group\n if (!group || that._isFieldInGroup(field, group))\n return field.whenValid(force);\n });\n });\n return $.when.apply($, promises);\n },\n\n _isFieldInGroup: function (field, group) {\n if ($.isArray(field.options.group))\n return -1 !== $.inArray(group, field.options.group);\n return field.options.group === group;\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var self = this;\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(function () {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each(function () {\n var fieldInstance = new window.Parsley.Factory(this, {}, self);\n\n // Only add valid and not excluded `ParsleyField` and `ParsleyFieldMultiple` children\n if (('ParsleyField' === fieldInstance.__class__ || 'ParsleyFieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded))\n if ('undefined' === typeof self.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__]) {\n self.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__] = fieldInstance;\n self.fields.push(fieldInstance);\n }\n });\n\n $(oldFields).not(self.fields).each(function () {\n this._trigger('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.call(this); // Keep the current `this`.\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 ParsleyForm;\n","import $ from 'jquery';\nimport ParsleyUtils from '../utils';\nimport ParsleyValidator from '../validator';\n\n\nvar ConstraintFactory = function (parsleyField, name, requirements, priority, isDomConstraint) {\n if (!new RegExp('ParsleyField').test(parsleyField.__class__))\n throw new Error('ParsleyField or ParsleyFieldMultiple instance expected');\n\n var validatorSpec = window.Parsley._validatorRegistry.validators[name];\n var validator = new ParsleyValidator(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\nConstraintFactory.prototype = {\n validate: function(value, instance) {\n var args = this.requirementList.slice(0); // Make copy\n args.unshift(value);\n args.push(instance);\n return this.validator.validate.apply(this.validator, args);\n },\n\n _parseRequirements: function(options) {\n var that = this;\n this.requirementList = this.validator.parseRequirements(this.requirements, function(key) {\n return options[that.name + capitalize(key)];\n });\n }\n};\n\nexport default ConstraintFactory;\n\n","import $ from 'jquery';\nimport ConstraintFactory from './factory/constraint';\nimport ParsleyUI from './ui';\nimport ParsleyUtils from './utils';\n\nvar ParsleyField = function (field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'ParsleyField';\n this.__id__ = ParsleyUtils.generateID();\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 = [];\n\n // Bind constraints\n this._bindConstraints();\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nParsleyField.prototype = {\n // # Public API\n // Validate field and trigger some events for mainly `ParsleyUI`\n // @returns `true`, an array of the validators that failed, or\n // `null` if validation is not finished. Prefer using whenValidate\n validate: function (force) {\n var promise = this.whenValidate(force);\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 `ParsleyUI`\n // @returns a promise that succeeds only when all validations do.\n whenValidate: function (force) {\n var that = this;\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, this.value)\n .done(function () { that._trigger('success'); })\n .fail(function () { that._trigger('error'); })\n .always(function () { that._trigger('validated'); });\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 // 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 (force, value) {\n return statusMapping[this.whenValid(force, value).state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do.\n // The argument `force` is optional, defaults to `false`.\n // The argument `value` is optional. If given, it will be validated instead of the value of the input.\n whenValid: function (force, value) {\n // Recompute options and rebind constraints to have latest changes\n this.refreshConstraints();\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Make `force` argument optional\n if ('boolean' !== typeof force && 'undefined' === typeof value) {\n value = force;\n force = false;\n }\n // Value could be passed as argument, needed to add more power to 'parsley: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 var that = this;\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 = $.when.apply($,\n $.map(constraints, $.proxy(that, '_validateConstraint', value))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return $.when.apply($, promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var that = this;\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 $.when(result).fail(function(errorMessage) {\n if (true === that.validationResult)\n that.validationResult = [];\n that.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 // 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 ConstraintFactory(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.hasClass('required') || 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 if (('undefined' === typeof this.$element.attr('step')) || (0 === parseFloat(this.$element.attr('step')) % 1)) {\n return this.addConstraint('type', 'integer', undefined, true);\n } else {\n return this.addConstraint('type', 'number', undefined, true);\n }\n // Regular other HTML5 supported types\n } else if (/^(email|url|range)$/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 ParsleyUtils.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 = ParsleyUtils.trimString(value);\n\n return value;\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 ParsleyField;\n","import $ from 'jquery';\n\nvar ParsleyMultiple = function () {\n this.__class__ = 'ParsleyFieldMultiple';\n};\n\nParsleyMultiple.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 `ParsleyField.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('ParsleyFieldMultiple').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 `ParsleyField.getValue()`\n getValue: function () {\n // Value could be overriden in DOM\n 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._findRelatedMultiple().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelatedMultiple().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 ParsleyMultiple;\n","import $ from 'jquery';\nimport ParsleyUtils from './utils';\nimport ParsleyAbstract from './abstract';\nimport ParsleyForm from './form';\nimport ParsleyField from './field';\nimport ParsleyMultiple from './multiple';\n\nvar ParsleyFactory = 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 ParsleyForm 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 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 && 'ParsleyForm' !== parsleyFormInstance.__class__)\n throw new Error('Parent instance must be a ParsleyForm instance');\n\n this.parent = parsleyFormInstance || window.Parsley;\n return this.init(options);\n};\n\nParsleyFactory.prototype = {\n init: function (options) {\n this.__class__ = 'Parsley';\n this.__version__ = '@@version';\n this.__id__ = ParsleyUtils.generateID();\n\n // Pre-compute options\n this._resetOptions(options);\n\n // A ParsleyForm instance is obviously a `` element but also every node that is not an input and has the `data-parsley-validate` attribute\n if (this.$element.is('form') || (ParsleyUtils.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 `ParsleyField` or `ParsleyFieldMultiple`\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 that = this;\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 ParsleyUtils.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 () {\n if ($(this).is('input[type=radio], input[type=checkbox]'))\n $(this).attr(that.options.namespace + 'multiple', that.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelatedMultiple();\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('ParsleyFieldMultiple')) {\n parsleyMultipleInstance.addElement(this.$element);\n }\n\n break;\n }\n }\n\n // Create a secret ParsleyField instance for every multiple field. It will be stored in `data('ParsleyFieldMultiple')`\n // And will be useful later to access classic `ParsleyField` stuff while being in a `ParsleyFieldMultiple` instance\n this.bind('parsleyField', true);\n\n return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n },\n\n // Return proper `ParsleyForm`, `ParsleyField` or `ParsleyFieldMultiple`\n bind: function (type, doNotStore) {\n var parsleyInstance;\n\n switch (type) {\n case 'parsleyForm':\n parsleyInstance = $.extend(\n new ParsleyForm(this.$element, this.domOptions, this.options),\n window.ParsleyExtend\n )._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(\n new ParsleyField(this.$element, this.domOptions, this.options, this.parent),\n window.ParsleyExtend\n );\n break;\n case 'parsleyFieldMultiple':\n parsleyInstance = $.extend(\n new ParsleyField(this.$element, this.domOptions, this.options, this.parent),\n new ParsleyMultiple(),\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 ParsleyUtils.setAttr(this.$element, this.options.namespace, 'multiple', this.options.multiple);\n\n if ('undefined' !== typeof doNotStore) {\n this.$element.data('ParsleyFieldMultiple', 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 ParsleyForm or ParsleyField instance!\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n};\n\nexport default ParsleyFactory;\n","import $ from 'jquery';\nimport ParsleyUtils from './utils';\nimport ParsleyDefaults from './defaults';\nimport ParsleyAbstract from './abstract';\nimport ParsleyValidatorRegistry from './validator_registry';\nimport ParsleyUI from './ui';\nimport ParsleyForm from './form';\nimport ParsleyField from './field';\nimport ParsleyMultiple from './multiple';\nimport ParsleyFactory 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 ParsleyUtils.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 ParsleyAbstract(), {\n $element: $(document),\n actualizeOptions: null,\n _resetOptions: null,\n Factory: ParsleyFactory,\n version: '@@version'\n });\n\n// Supplement ParsleyField and Form with ParsleyAbstract\n// This way, the constructors will have access to those methods\n$.extend(ParsleyField.prototype, ParsleyAbstract.prototype);\n$.extend(ParsleyForm.prototype, ParsleyAbstract.prototype);\n// Inherit actualizeOptions and _resetOptions:\n$.extend(ParsleyFactory.prototype, ParsleyAbstract.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 ParsleyUtils.warn('You must bind Parsley on an existing element.');\n\n return;\n }\n\n return new ParsleyFactory(this, options);\n};\n\n// ### ParsleyField and ParsleyForm 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(ParsleyUtils.objectCreate(ParsleyDefaults), window.ParsleyConfig);\nwindow.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n// ### Globals\nwindow.Parsley = window.psly = Parsley;\nwindow.ParsleyUtils = ParsleyUtils;\n\n// ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\nvar registry = window.Parsley._validatorRegistry = new ParsleyValidatorRegistry(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 ParsleyUtils.warnOnce(`Accessing the method '${method}' through ParsleyValidator is deprecated. Simply call 'window.Parsley.${method}(...)'`);\n return window.Parsley[method].apply(window.Parsley, arguments);\n };\n});\n\n// ### ParsleyUI\n// UI is a separate class that only listens to some events and then modifies the DOM accordingly\n// Could be overriden by defining a `window.ParsleyConfig.ParsleyUI` appropriate class (with `listen()` method basically)\nwindow.ParsleyUI = 'function' === typeof window.ParsleyConfig.ParsleyUI ?\n new window.ParsleyConfig.ParsleyUI().listen() : new ParsleyUI().listen();\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 eventValidate: function (event) {\n // For keyup, keypress, keydown.. 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 (new RegExp('key').test(event.type))\n if (!this._ui.validationInformationVisible && this.getValue().length <= this.options.validationThreshold)\n return;\n\n this._ui.validatedOnce = true;\n this.whenValidate();\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 ParsleyUtils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.apply(Parsley.addAsyncValidator, arguments);\n};\n","// This is bundled with the Parsley library\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';\n\nexport default Parsley;\n"],"sourceRoot":"/source/"}