From 102408d43bcbbd5140468a26fed8e325df467ccb Mon Sep 17 00:00:00 2001 From: "yasuhiro.sakamoto" <> Date: Fri, 6 May 2022 16:21:18 +0900 Subject: [PATCH] 2.4.3-patch --- dist/i18n/hu.extra.js | 14 +++ dist/i18n/hu.js | 30 ++++++ dist/i18n/sl.extra.js | 14 +++ dist/i18n/sl.js | 30 ++++++ dist/parsley.js | 5 +- dist/parsley.js.map | 2 +- dist/parsley.min.js | 8 +- dist/parsley.min.js.map | 2 +- doc/annotated-source/validator_registry.html | 106 +++++++++++-------- src/parsley/validator_registry.js | 3 +- 10 files changed, 159 insertions(+), 55 deletions(-) create mode 100644 dist/i18n/hu.extra.js create mode 100644 dist/i18n/hu.js create mode 100644 dist/i18n/sl.extra.js create mode 100644 dist/i18n/sl.js diff --git a/dist/i18n/hu.extra.js b/dist/i18n/hu.extra.js new file mode 100644 index 000000000..08ca74b9f --- /dev/null +++ b/dist/i18n/hu.extra.js @@ -0,0 +1,14 @@ +// Validation errors messages for Parsley +// Load this after Parsley + +Parsley.addMessages('hu', { + dateiso: "A mező értéke csak érvényes dátum lehet (YYYY-MM-DD).", + minwords: "Minimum %s szó megadása szükséges.", + maxwords: "Maximum %s szó megadása engedélyezett.", + words: "Minimum %s, maximum %s szó megadása szükséges.", + gt: "A mező értéke nagyobb kell legyen.", + gte: "A mező értéke nagyobb vagy egyenlő kell legyen.", + lt: "A mező értéke kevesebb kell legyen.", + lte: "A mező értéke kevesebb vagy egyenlő kell legyen.", + notequalto: "Az érték különböző kell legyen." +}); diff --git a/dist/i18n/hu.js b/dist/i18n/hu.js new file mode 100644 index 000000000..0fe38fdb7 --- /dev/null +++ b/dist/i18n/hu.js @@ -0,0 +1,30 @@ +// This is included with the Parsley library itself, +// thus there is no use in adding it to your project. + + +Parsley.addMessages('hu', { + defaultMessage: "Érvénytelen mező.", + type: { + email: "Érvénytelen email cím.", + url: "Érvénytelen URL cím.", + number: "Érvénytelen szám.", + integer: "Érvénytelen egész szám.", + digits: "Érvénytelen szám.", + alphanum: "Érvénytelen alfanumerikus érték." + }, + notblank: "Ez a mező nem maradhat üresen.", + required: "A mező kitöltése kötelező.", + pattern: "Érvénytelen érték.", + min: "A mező értéke nagyobb vagy egyenlő kell legyen mint %s.", + max: "A mező értéke kisebb vagy egyenlő kell legyen mint %s.", + range: "A mező értéke %s és %s közé kell essen.", + minlength: "Legalább %s karakter megadása szükséges.", + maxlength: "Legfeljebb %s karakter megadása engedélyezett.", + length: "Nem megfelelő karakterszám. Minimum %s, maximum %s karakter adható meg.", + mincheck: "Legalább %s értéket kell kiválasztani.", + maxcheck: "Maximum %s értéket lehet kiválasztani.", + check: "Legalább %s, legfeljebb %s értéket kell kiválasztani.", + equalto: "A mező értéke nem egyező." +}); + +Parsley.setLocale('hu'); diff --git a/dist/i18n/sl.extra.js b/dist/i18n/sl.extra.js new file mode 100644 index 000000000..94d31b377 --- /dev/null +++ b/dist/i18n/sl.extra.js @@ -0,0 +1,14 @@ +// Validation errors messages for Parsley +// Load this after Parsley + +Parsley.addMessages('sl', { + dateiso: "Vnesite datum v ISO obliki (YYYY-MM-DD).", + minwords: "Vpis je prekratek. Vpisati morate najmnaj %s besed.", + maxwords: "Vpis je predolg. Vpišete lahko največ %s besed.", + words: "Dolžina vpisa je napačna. Dolžina je lahko samo med %s in %s besed.", + gt: "Vpisani podatek mora biti večji.", + gte: "Vpisani podatek mora biti enak ali večji.", + lt: "Vpisani podatek mora biti manjši.", + lte: "Vpisani podatek mora biti enak ali manjši.", + notequalto: "Vpisana vrednost mora biti drugačna." +}); diff --git a/dist/i18n/sl.js b/dist/i18n/sl.js new file mode 100644 index 000000000..e2918170b --- /dev/null +++ b/dist/i18n/sl.js @@ -0,0 +1,30 @@ +// This is included with the Parsley library itself, +// thus there is no use in adding it to your project. + + +Parsley.addMessages('sl', { + defaultMessage: "Podatek ne ustreza vpisnim kriterijem.", + type: { + email: "Vpišite pravilen email.", + url: "Vpišite pravilen url naslov.", + number: "Vpišite številko.", + integer: "Vpišite celo število brez decimalnih mest.", + digits: "Vpišite samo cifre.", + alphanum: "Vpišite samo alfanumerične znake (cifre in črke)." + }, + notblank: "To polje ne sme biti prazno.", + required: "To polje je obvezno.", + pattern: "Podatek ne ustreza vpisnim kriterijem.", + min: "Vrednost mora biti višja ali enaka kot %s.", + max: "Vrednost mora biti nižja ali enaka kot %s.", + range: "Vrednost mora biti med %s in %s.", + minlength: "Vpis je prekratek. Mora imeti najmanj %s znakov.", + maxlength: "Vpis je predolg. Lahko ima največ %s znakov.", + length: "Število vpisanih znakov je napačno. Število znakov je lahko samo med %s in %s.", + mincheck: "Izbrati morate vsaj %s možnosti.", + maxcheck: "Izberete lahko največ %s možnosti.", + check: "Število izbranih možnosti je lahko samo med %s in %s.", + equalto: "Vnos mora biti enak." +}); + +Parsley.setLocale('sl'); diff --git a/dist/parsley.js b/dist/parsley.js index 3497968c8..c45970764 100644 --- a/dist/parsley.js +++ b/dist/parsley.js @@ -1,6 +1,6 @@ /*! * Parsley.js -* Version 2.4.3 - built Sat, Jun 18th 2016, 9:01 pm +* Version 2.4.3 - built Mon, Jul 25th 2016, 8:48 pm * http://parsleyjs.org * Guillaume Potier - * Marc-Andre Lafortune - @@ -492,7 +492,8 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr }; var typeRegexes = { - 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, + // @See: http://qiita.com/sakuro/items/1eaa307609ceaaf51123 + email: /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/i, // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers number: /^-?(\d*\.)?\d+(e[-+]?\d+)?$/i, diff --git a/dist/parsley.js.map b/dist/parsley.js.map index a89b9b17c..f95accd0a 100644 --- a/dist/parsley.js.map +++ b/dist/parsley.js.map @@ -1 +1 @@ -{"version":3,"sources":["parsley.js","src/parsley/utils.js","src/parsley/defaults.js","src/parsley/abstract.js","src/parsley/validator.js","src/parsley/validator_registry.js","src/parsley/ui.js","src/parsley/form.js","src/parsley/factory/constraint.js","src/parsley/field.js","src/parsley/multiple.js","src/parsley/factory.js","src/parsley/main.js","src/parsley/pubsub.js","src/parsley/remote.js","src/i18n/en.js","src/vendor/inputevent.js","src/parsley.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,AAAC,CAAA,UAAU,MAAM,EAAE,OAAO,EAAE;AAC1B,SAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAC1G,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,GACxE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;CACnC,CAAA,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE;AAAE,cAAY,CAAC;;ACFpC,MAAI,QAAA,GAAW,CAAA,CAAA;AACf,MAAI,YAAA,GAAe,EAAA,CAAA;;AAEnB,MALA,0BAKgB,GAAG;;;AAGjB,QAAA,EAAM,cAAU,QAAA,EAAU,SAAA,EAAW,GAAA,EAAK;AACxC,UAAI,CAAA,CAAA;AACJ,UAAI,SAAA,CAAA;AACJ,UAAI,UAAA,CAAA;AACJ,UAAI,KAAA,GAAQ,IAAI,MAAA,CAAO,GAAA,GAAM,SAAA,EAAW,GAAA,CAAA,CAAA;;AAExC,UAAI,WAAA,KAAgB,OAAO,GAAA,EACzB,GAAA,GAAM,EAAA,CAAA,KACH;;AAEH,aAAK,CAAA,IAAK,GAAA,EAAK;AACb,cAAI,GAAA,CAAI,cAAA,CAAe,CAAA,CAAA,EACrB,OAAO,GAAA,CAAI,CAAA,CAAA,CAAA;SACrB;OACA;;AAEI,UAAI,WAAA,KAAgB,OAAO,QAAA,IAAY,WAAA,KAAgB,OAAO,QAAA,CAAS,CAAA,CAAA,EACrE,OAAO,GAAA,CAAA;;AAET,gBAAA,GAAa,QAAA,CAAS,CAAA,CAAA,CAAG,UAAA,CAAA;AACzB,WAAK,CAAA,GAAI,UAAA,CAAW,MAAA,EAAQ,CAAA,EAAA,GAAO;AACjC,iBAAA,GAAY,UAAA,CAAW,CAAA,CAAA,CAAA;;AAEvB,YAAI,SAAA,IAAa,SAAA,CAAU,SAAA,IAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAA,EAAO;AAClE,aAAA,CAAI,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAA,CAAA,CAAA,CAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,SAAA,CAAU,KAAA,CAAA,CAAA;SACrG;OACA;;AAEI,aAAO,GAAA,CAAA;KACX;;AAEE,aAAA,EAAW,mBAAU,QAAA,EAAU,SAAA,EAAW,UAAA,EAAW;AACnD,aAAO,QAAA,CAAS,EAAA,CAAG,GAAA,GAAM,SAAA,GAAY,UAAA,GAAY,GAAA,CAAA,CAAA;KACrD;;AAEE,WAAA,EAAS,iBAAU,QAAA,EAAU,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO;AACnD,cAAA,CAAS,CAAA,CAAA,CAAG,YAAA,CAAa,IAAA,CAAK,SAAA,CAAU,SAAA,GAAY,IAAA,CAAA,EAAO,MAAA,CAAO,KAAA,CAAA,CAAA,CAAA;KACtE;;AAEE,cAAA,EAAY,sBAAY;AACtB,aAAO,EAAA,GAAK,QAAA,EAAA,CAAA;KAChB;;;;AAIE,oBAAA,EAAkB,0BAAU,KAAA,EAAO;AACjC,UAAI,GAAA,CAAA;;AAEJ,UAAI;AACF,eAAO,KAAA,GACL,KAAA,IAAS,MAAA,KACR,KAAA,IAAS,OAAA,GAAU,KAAA,GACpB,KAAA,IAAS,MAAA,GAAS,IAAA,GAClB,CAAC,KAAA,CAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAA,CAAA,GAAU,GAAA,GAC9B,SAAA,CAAU,IAAA,CAAK,KAAA,CAAA,GAAS,CAAA,CAAE,SAAA,CAAU,KAAA,CAAA,GACpC,KAAA,CAAA,GACE,KAAA,CAAA;OACV,CAAM,OAAO,CAAA,EAAG;AAAE,eAAO,KAAA,CAAA;OAAA;KACzB;;;AAGE,YAAA,EAAU,kBAAU,GAAA,EAAK;AACvB,aAAO,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,UAAU,KAAA,EAAO,GAAA,EAAK;AAClD,eAAO,GAAA,GAAM,GAAA,CAAI,WAAA,EAAA,GAAgB,EAAA,CAAA;OACvC,CAAA,CAAA;KACA;;;AAGE,aAAA,EAAW,mBAAU,GAAA,EAAK;AACxB,aAAO,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,GAAA,CAAA,CACvB,OAAA,CAAQ,uBAAA,EAAyB,OAAA,CAAA,CACjC,OAAA,CAAQ,mBAAA,EAAqB,OAAA,CAAA,CAC7B,OAAA,CAAQ,IAAA,EAAM,GAAA,CAAA,CACd,WAAA,EAAA,CAAA;KACP;;AAEE,QAAA,EAAM,gBAAY;;;AAChB,UAAI,MAAA,CAAO,OAAA,IAAW,UAAA,KAAe,OAAO,MAAA,CAAO,OAAA,CAAQ,IAAA,EACzD,mBAAA,MAAA,CAAO,OAAA,EAAQ,IAAA,MAAA,kBAAQ,SAAA,CAAA,CAAA;KAC7B;;AAEE,YAAA,EAAU,kBAAS,GAAA,EAAK;AACtB,UAAI,CAAC,YAAA,CAAa,GAAA,CAAA,EAAM;AACtB,oBAAA,CAAa,GAAA,CAAA,GAAO,IAAA,CAAA;AACpB,YAAA,CAAK,IAAA,MAAA,CAAL,IAAA,EAAa,SAAA,CAAA,CAAA;OACnB;KACA;;AAEE,kBAAA,EAAgB,0BAAY;AAC1B,kBAAA,GAAe,EAAA,CAAA;KACnB;;AAEE,cAAA,EAAY,oBAAS,MAAA,EAAQ;AAC3B,aAAO,MAAA,CAAO,OAAA,CAAQ,YAAA,EAAc,EAAA,CAAA,CAAA;KACxC;;AAEE,mBAAA,EAAiB,yBAAS,MAAA,EAAQ,SAAA,EAAW;AAC3C,YAAA,GAAS,IAAA,CAAK,UAAA,CAAW,MAAA,IAAU,EAAA,CAAA,CAAI,KAAA,CAAM,KAAA,CAAA,CAAA;AAC7C,UAAI,CAAC,MAAA,CAAO,CAAA,CAAA,EACV,OAAO,EAAA,CAAA;AACT,aAAO,CAAA,CAAE,GAAA,CAAI,MAAA,EAAQ,UAAA,GAAA;eAAU,GAAA,SAAO,SAAA;OAAU,CAAA,CAAG,IAAA,CAAK,GAAA,CAAA,CAAA;KAC5D;;AAEE,cAAA,EAAY,oBAAS,KAAA,EAAO,MAAA,EAAQ;;AAElC,UAAI,MAAA,GAAS,EAAA,CAAA;AACb,OAAA,CAAE,IAAA,CAAK,KAAA,EAAO,UAAC,CAAA,EAAG,IAAA,EAAS;AACzB,YAAI,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAA,IAAS,CAAC,CAAA,EAC3B,MAAA,CAAO,IAAA,CAAK,IAAA,CAAA,CAAA;OACpB,CAAA,CAAA;AACI,aAAO,MAAA,CAAA;KACX;;;AAGE,OAAA,EAAK,aAAS,QAAA,EAAU;;AAEtB,aAAO,CAAA,CAAE,IAAA,MAAA,CAAF,CAAA,qBAAU,QAAA,UAAU,EAAA,EAAI,EAAA,GAAA,CAAA;KACnC;;;AAGE,gBAAA,EAAc,MAAA,CAAO,MAAA,IAAU,CAAC,YAAY;AAC1C,UAAI,MAAA,GAAS,SAAT,MAAA,GAAqB,EAAA,CAAA;AACzB,aAAO,UAAU,SAAA,EAAW;AAC1B,YAAI,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AACxB,gBAAM,KAAA,CAAM,+BAAA,CAAA,CAAA;SACpB;AACM,YAAI,OAAO,SAAA,IAAa,QAAA,EAAU;AAChC,gBAAM,SAAA,CAAU,4BAAA,CAAA,CAAA;SACxB;AACM,cAAA,CAAO,SAAA,GAAY,SAAA,CAAA;AACnB,YAAI,MAAA,GAAS,IAAI,MAAA,EAAA,CAAA;AACjB,cAAA,CAAO,SAAA,GAAY,IAAA,CAAA;AACnB,eAAO,MAAA,CAAA;OACb,CAAA;KACA,CAAA,EAAA;GA9IA,CAAA;;AAAA,MAAA,qBAAA,GAAA,0BAAA,CAAA;;;;;;;ACKA,MAAI,eAAA,GAAkB;;;;AAIpB,aAAA,EAAW,eAAA;;;AAGX,UAAA,EAAQ,yBAAA;;;AAGR,YAAA,EAAU,+EAAA;;;AAGV,mBAAA,EAAiB,IAAA;;;;;AAKjB,YAAA,EAAU,IAAA;;;AAGV,SAAA,EAAO,IAAA;;;;AAIP,aAAA,EAAW,IAAA;;;AAGX,uBAAA,EAAqB,CAAA;;;AAGrB,SAAA,EAAO,OAAA;;;AAGP,WAAA,EAAS,KAAA;;;AAGT,uBAAA,EAAqB,OAAA;;;AAGrB,cAAA,EAAY,eAAA;;;AAGZ,gBAAA,EAAc,iBAAA;;;;AAId,gBAAA,EAAc,sBAAU,YAAA,EAAc,EAAA;;;;AAItC,mBAAA,EAAiB,yBAAU,YAAA,EAAc,EAAA;;;AAGzC,iBAAA,EAAe,uCAAA;;;AAGf,iBAAA,EAAe,WAAA;GACjB,CAAA;;AC5DA,MAAI,eAAA,GAAkB,SAAlB,eAAA,GAA8B;AAChC,QAAA,CAAK,MAAA,GAJP,qBAI4B,CAAC,UAAA,EAAA,CAAA;GAC7B,CAAA;;AAEA,iBAAA,CAAgB,SAAA,GAAY;AAC1B,gBAAA,EAAc,IAAA;;AAEd,oCAAA,EAAkC,4CAAY;;;AAC5C,UAAI,IAAA,GAAO,SAAP,IAAA,GAAa;AACf,YAAI,CAAA,GAAI,CAAA,CAAE,QAAA,EAAA,CAAA;AACV,YAAI,IAAA,KAAS,MAAK,gBAAA,EAChB,CAAA,CAAE,MAAA,EAAA,CAAA;AACJ,eAAO,CAAA,CAAE,OAAA,EAAA,CAAU,OAAA,EAAA,CAAA;OACzB,CAAA;AACI,aAAO,CAAC,IAAA,EAAM,IAAA,CAAA,CAAA;KAClB;;AAEE,oBAAA,EAAkB,4BAAY;AApBhC,2BAqBgB,CAAC,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,UAAA,CAAA,CAAA;AAC9D,UAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,gBAAA,EAC7B,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAA,CAAA;AACd,aAAO,IAAA,CAAA;KACX;;AAEE,iBAAA,EAAe,uBAAU,WAAA,EAAa;AACpC,UAAA,CAAK,UAAA,GA5BT,qBA4BkC,CAAC,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,OAAA,CAAA,CAAA;AACxD,UAAA,CAAK,OAAA,GA7BT,qBA6B+B,CAAC,YAAA,CAAa,IAAA,CAAK,UAAA,CAAA,CAAA;;AAE9C,WAAK,IAAI,CAAA,IAAK,WAAA,EAAa;AACzB,YAAI,WAAA,CAAY,cAAA,CAAe,CAAA,CAAA,EAC7B,IAAA,CAAK,OAAA,CAAQ,CAAA,CAAA,GAAK,WAAA,CAAY,CAAA,CAAA,CAAA;OACtC;AACI,UAAA,CAAK,gBAAA,EAAA,CAAA;KACT;;AAEE,cAAA,EAAY,IAAA;;;;;;AAMZ,MAAA,EAAI,YAAU,IAAA,EAAM,EAAA,EAAI;AACtB,UAAA,CAAK,UAAA,GAAa,IAAA,CAAK,UAAA,IAAc,EAAA,CAAA;AACrC,UAAI,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,IAAA,CAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,IAAA,CAAA,IAAS,EAAA,CAAA;AAC7D,WAAA,CAAM,IAAA,CAAK,EAAA,CAAA,CAAA;;AAEX,aAAO,IAAA,CAAA;KACX;;;AAGE,aAAA,EAAW,mBAAS,IAAA,EAAM,EAAA,EAAI;AAC5B,OAAA,CAAE,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,WAAA,EAAA,EAAe,EAAA,CAAA,CAAA;KACzC;;;AAGE,OAAA,EAAK,aAAU,IAAA,EAAM,EAAA,EAAI;AACvB,UAAI,KAAA,GAAQ,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,UAAA,CAAW,IAAA,CAAA,CAAA;AAC/C,UAAI,KAAA,EAAO;AACT,YAAI,CAAC,EAAA,EAAI;AACP,iBAAO,IAAA,CAAK,UAAA,CAAW,IAAA,CAAA,CAAA;SAC/B,MAAa;AACL,eAAK,IAAI,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAA,GACzB,IAAI,KAAA,CAAM,CAAA,CAAA,KAAO,EAAA,EACf,KAAA,CAAM,MAAA,CAAO,CAAA,EAAG,CAAA,CAAA,CAAA;SAC5B;OACA;AACI,aAAO,IAAA,CAAA;KACX;;;AAGE,eAAA,EAAa,qBAAS,IAAA,EAAM,EAAA,EAAI;AAC9B,OAAA,CAAE,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,WAAA,EAAA,CAAA,CAAA;KAC/B;;;;;AAKE,WAAA,EAAS,iBAAU,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU;AACzC,YAAA,GAAS,MAAA,IAAU,IAAA,CAAA;AACnB,UAAI,KAAA,GAAQ,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,UAAA,CAAW,IAAA,CAAA,CAAA;AAC/C,UAAI,MAAA,CAAA;AACJ,UAAI,YAAA,CAAA;AACJ,UAAI,KAAA,EAAO;AACT,aAAK,IAAI,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAA,GAAO;AAChC,gBAAA,GAAS,KAAA,CAAM,CAAA,CAAA,CAAG,IAAA,CAAK,MAAA,EAAQ,MAAA,EAAQ,QAAA,CAAA,CAAA;AACvC,cAAI,MAAA,KAAW,KAAA,EAAO,OAAO,MAAA,CAAA;SACrC;OACA;AACI,UAAI,IAAA,CAAK,MAAA,EAAQ;AACf,eAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,MAAA,EAAQ,QAAA,CAAA,CAAA;OAC/C;AACI,aAAO,IAAA,CAAA;KACX;;;AAGE,SAAA,EAAO,iBAAY;;AAEjB,UAAI,aAAA,KAAkB,IAAA,CAAK,SAAA,EAAW;AACpC,YAAA,CAAK,QAAA,EAAA,CAAA;AACL,eAAO,IAAA,CAAK,QAAA,CAAS,OAAA,CAAA,CAAA;OAC3B;;;AAGI,WAAK,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,EAAA,EACtC,IAAA,CAAK,MAAA,CAAO,CAAA,CAAA,CAAG,KAAA,EAAA,CAAA;;AAEjB,UAAA,CAAK,QAAA,CAAS,OAAA,CAAA,CAAA;KAClB;;;AAGE,WAAA,EAAS,mBAAY;;AAEnB,UAAA,CAAK,UAAA,EAAA,CAAA;AACL,UAAI,aAAA,KAAkB,IAAA,CAAK,SAAA,EAAW;AACpC,YAAA,CAAK,QAAA,CAAS,UAAA,CAAW,SAAA,CAAA,CAAA;AACzB,YAAA,CAAK,QAAA,CAAS,UAAA,CAAW,sBAAA,CAAA,CAAA;AACzB,YAAA,CAAK,QAAA,CAAS,SAAA,CAAA,CAAA;;AAEd,eAAA;OACN;;;AAGI,WAAK,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,EAAA,EACtC,IAAA,CAAK,MAAA,CAAO,CAAA,CAAA,CAAG,OAAA,EAAA,CAAA;;AAEjB,UAAA,CAAK,QAAA,CAAS,UAAA,CAAW,SAAA,CAAA,CAAA;AACzB,UAAA,CAAK,QAAA,CAAS,SAAA,CAAA,CAAA;KAClB;;AAEE,gBAAA,EAAc,sBAAU,KAAA,EAAO,KAAA,EAAO;AApIxC,2BAqIgB,CAAC,QAAA,CAAS,0DAAA,CAAA,CAAA;AACtB,aAAO,IAAA,CAAK,SAAA,CAAU,EAAC,KAAA,EAAA,KAAA,EAAO,KAAA,EAAA,KAAA,EAAA,CAAA,CAAA;KAClC;;AAEE,gBAAA,EAAc,wBAAY;AACxB,aAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,GAClB,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA,OAAS,IAAA,CAAK,OAAA,CAAQ,SAAA,kBAAsB,IAAA,CAAK,OAAA,CAAQ,QAAA,QAAS,GACvF,IAAA,CAAK,QAAA,CAAA;KACX;GACA,CAAA;;AC3IA,MAAI,qBAAA,GAAwB;AAC1B,UAAA,EAAQ,gBAAS,OAAA,EAAQ;AACvB,aAAO,OAAA,CAAA;KACX;AACE,WAAA,EAAS,iBAAS,MAAA,EAAQ;AACxB,UAAI,KAAA,CAAM,MAAA,CAAA,EACR,MAAM,kCAAA,GAAqC,MAAA,GAAS,GAAA,CAAA;AACtD,aAAO,QAAA,CAAS,MAAA,EAAQ,EAAA,CAAA,CAAA;KAC5B;AACE,UAAA,EAAQ,gBAAS,MAAA,EAAQ;AACvB,UAAI,KAAA,CAAM,MAAA,CAAA,EACR,MAAM,gCAAA,GAAmC,MAAA,GAAS,GAAA,CAAA;AACpD,aAAO,UAAA,CAAW,MAAA,CAAA,CAAA;KACtB;AACE,aAAA,EAAW,mBAAS,MAAA,EAAQ;;AAC1B,UAAI,MAAA,GAAS,CAAA,CAAE,MAAA,CAAA,CAAA;AACf,UAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EACpB,MAAM,sBAAA,GAAyB,MAAA,GAAS,GAAA,CAAA;AAC1C,aAAO,MAAA,CAAA;KACX;AACE,WAAA,EAAS,iBAAS,MAAA,EAAQ;AACxB,aAAO,MAAA,KAAW,OAAA,CAAA;KACtB;AACE,UAAA,EAAQ,gBAAS,MAAA,EAAQ;AACvB,aA3BJ,qBA2BuB,CAAC,gBAAA,CAAiB,MAAA,CAAA,CAAA;KACzC;AACE,UAAA,EAAQ,gBAAS,OAAA,EAAQ;AACvB,UAAI,KAAA,GAAQ,EAAA,CAAA;;;AAGZ,UAAI,qBAAA,CAAsB,IAAA,CAAK,OAAA,CAAA,EAAS;;;AAGtC,aAAA,GAAQ,OAAA,CAAO,OAAA,CAAQ,gBAAA,EAAkB,IAAA,CAAA,CAAA;;;AAGzC,eAAA,GAAS,OAAA,CAAO,OAAA,CAAQ,IAAI,MAAA,CAAO,UAAA,GAAa,KAAA,GAAQ,GAAA,CAAA,EAAM,IAAA,CAAA,CAAA;OACpE,MAAW;;AAEL,eAAA,GAAS,GAAA,GAAM,OAAA,GAAS,GAAA,CAAA;OAC9B;AACI,aAAO,IAAI,MAAA,CAAO,OAAA,EAAQ,KAAA,CAAA,CAAA;KAC9B;GACA,CAAA;;AAEA,MAAI,uBAAA,GAA0B,SAA1B,uBAAA,CAAmC,MAAA,EAAQ,MAAA,EAAQ;AACrD,QAAI,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,kBAAA,CAAA,CAAA;AACrB,QAAI,CAAC,CAAA,EACH,MAAM,gCAAA,GAAmC,MAAA,GAAS,GAAA,CAAA;AACpD,QAAI,MAAA,GAAS,CAAA,CAAE,CAAA,CAAA,CAAG,KAAA,CAAM,GAAA,CAAA,CAAK,GAAA,CApD/B,qBAoD+C,CAAC,UAAA,CAAA,CAAA;AAC9C,QAAI,MAAA,CAAO,MAAA,KAAW,MAAA,EACpB,MAAM,kBAAA,GAAqB,MAAA,CAAO,MAAA,GAAS,eAAA,GAAkB,MAAA,GAAS,aAAA,CAAA;AACxE,WAAO,MAAA,CAAA;GACT,CAAA;;AAEA,MAAI,kBAAA,GAAqB,SAArB,kBAAA,CAA8B,eAAA,EAAiB,MAAA,EAAQ;AACzD,QAAI,SAAA,GAAY,qBAAA,CAAsB,eAAA,IAAmB,QAAA,CAAA,CAAA;AACzD,QAAI,CAAC,SAAA,EACH,MAAM,sCAAA,GAAyC,eAAA,GAAkB,GAAA,CAAA;AACnE,WAAO,SAAA,CAAU,MAAA,CAAA,CAAA;GACnB,CAAA;;AAEA,MAAI,6BAAA,GAAgC,SAAhC,6BAAA,CAAyC,eAAA,EAAiB,MAAA,EAAQ,iBAAA,EAAmB;AACvF,QAAI,IAAA,GAAO,IAAA,CAAA;AACX,QAAI,KAAA,GAAQ,EAAA,CAAA;AACZ,SAAK,IAAI,GAAA,IAAO,eAAA,EAAiB;AAC/B,UAAI,GAAA,EAAK;AACP,YAAI,KAAA,GAAQ,iBAAA,CAAkB,GAAA,CAAA,CAAA;AAC9B,YAAI,QAAA,KAAa,OAAO,KAAA,EACtB,KAAA,GAAQ,kBAAA,CAAmB,eAAA,CAAgB,GAAA,CAAA,EAAM,KAAA,CAAA,CAAA;AACnD,aAAA,CAAM,GAAA,CAAA,GAAO,KAAA,CAAA;OACnB,MAAW;AACL,YAAA,GAAO,kBAAA,CAAmB,eAAA,CAAgB,GAAA,CAAA,EAAM,MAAA,CAAA,CAAA;OACtD;KACA;AACE,WAAO,CAAC,IAAA,EAAM,KAAA,CAAA,CAAA;GAChB,CAAA;;;;AAIA,MAAI,gBAAA,GAAmB,SAAnB,gBAAA,CAA4B,IAAA,EAAM;AACpC,KAAA,CAAE,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,IAAA,CAAA,CAAA;GACvB,CAAA;;AAEA,kBAAA,CAAiB,SAAA,GAAY;;AAE3B,YAAA,EAAU,kBAAS,KAAA,EAAO,mBAAA,EAAqB;AAC7C,UAAI,IAAA,CAAK,EAAA,EAAI;;;AAEX,YAAI,SAAA,CAAU,MAAA,GAAS,CAAA;AACrB,6BAAA,GAAsB,EAAA,CAAG,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,CAAA,EAAG,CAAC,CAAA,CAAA,CAAA;AACrD,eAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,mBAAA,CAAA,CAAA;OACvC;;AAEI,UAAI,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAA,EAAQ;AACpB,YAAI,CAAC,IAAA,CAAK,gBAAA,EACR,MAAM,aAAA,GAAgB,IAAA,CAAK,IAAA,GAAO,mCAAA,CAAA;AACpC,eAAO,IAAA,CAAK,gBAAA,MAAA,CAAL,IAAA,EAAyB,SAAA,CAAA,CAAA;OACtC,MAAW;AACL,YAAI,IAAA,CAAK,cAAA,EAAgB;AACvB,cAAI,KAAA,CAAM,KAAA,CAAA,EACR,OAAO,KAAA,CAAA;AACT,mBAAA,CAAU,CAAA,CAAA,GAAK,UAAA,CAAW,SAAA,CAAU,CAAA,CAAA,CAAA,CAAA;AACpC,iBAAO,IAAA,CAAK,cAAA,MAAA,CAAL,IAAA,EAAuB,SAAA,CAAA,CAAA;SACtC;AACM,YAAI,IAAA,CAAK,cAAA,EAAgB;AACvB,iBAAO,IAAA,CAAK,cAAA,MAAA,CAAL,IAAA,EAAuB,SAAA,CAAA,CAAA;SACtC;AACM,cAAM,aAAA,GAAgB,IAAA,CAAK,IAAA,GAAO,gCAAA,CAAA;OACxC;KACA;;;;AAIE,qBAAA,EAAmB,2BAAS,YAAA,EAAc,iBAAA,EAAmB;AAC3D,UAAI,QAAA,KAAa,OAAO,YAAA,EAAc;;;AAGpC,eAAO,CAAA,CAAE,OAAA,CAAQ,YAAA,CAAA,GAAgB,YAAA,GAAe,CAAC,YAAA,CAAA,CAAA;OACvD;AACI,UAAI,IAAA,GAAO,IAAA,CAAK,eAAA,CAAA;AAChB,UAAI,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAA,EAAO;AACnB,YAAI,MAAA,GAAS,uBAAA,CAAwB,YAAA,EAAc,IAAA,CAAK,MAAA,CAAA,CAAA;AACxD,aAAK,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,CAAA,EAAA,EACjC,MAAA,CAAO,CAAA,CAAA,GAAK,kBAAA,CAAmB,IAAA,CAAK,CAAA,CAAA,EAAI,MAAA,CAAO,CAAA,CAAA,CAAA,CAAA;AACjD,eAAO,MAAA,CAAA;OACb,MAAW,IAAI,CAAA,CAAE,aAAA,CAAc,IAAA,CAAA,EAAO;AAChC,eAAO,6BAAA,CAA8B,IAAA,EAAM,YAAA,EAAc,iBAAA,CAAA,CAAA;OAC/D,MAAW;AACL,eAAO,CAAC,kBAAA,CAAmB,IAAA,EAAM,YAAA,CAAA,CAAA,CAAA;OACvC;KACA;;AAEE,mBAAA,EAAiB,QAAA;;AAEjB,YAAA,EAAU,CAAA;;GAEZ,CAAA;;ACvIA,MAAI,wBAAA,GAA2B,SAA3B,wBAAA,CAAqC,UAAA,EAAY,OAAA,EAAS;AAC5D,QAAA,CAAK,SAAA,GAAY,0BAAA,CAAA;;;AAGjB,QAAA,CAAK,MAAA,GAAS,IAAA,CAAA;;AAEd,QAAA,CAAK,IAAA,CAAK,UAAA,IAAc,EAAA,EAAI,OAAA,IAAW,EAAA,CAAA,CAAA;GACzC,CAAA;;AAEA,MAAI,WAAA,GAAe;AACjB,SAAA,EAAO,y4BAAA;;;AAGP,UAAA,EAAQ,8BAAA;;AAER,WAAA,EAAS,SAAA;;AAET,UAAA,EAAQ,OAAA;;AAER,YAAA,EAAU,QAAA;;AAEV,OAAA,EAAK,IAAI,MAAA,CACL,GAAA;;AAEE,4BAAA;;AAEA,0BAAA,GACA,KAAA;;;;;;;;;;;AAWE,4CAAA,GACA,4CAAA,GACA,gDAAA,GACF,GAAA;;AAEE,gEAAA;;AAEA,oEAAA;;AAEA,yCAAA,GACF,GAAA;;AAEA,oBAAA;;AAEA,gBAAA,GACF,GAAA,EAAK,GAAA,CACX;GACA,CAAA;AACA,aAAA,CAAY,KAAA,GAAQ,WAAA,CAAY,MAAA,CAAA;;;AAGhC,MAAI,aAAA,GAAgB,SAAhB,aAAA,CAAgB,GAAA,EAAO;AACzB,QAAI,KAAA,GAAQ,CAAC,EAAA,GAAK,GAAA,CAAA,CAAK,KAAA,CAAM,kCAAA,CAAA,CAAA;AAC7B,QAAI,CAAC,KAAA,EAAO;AAAE,aAAO,CAAA,CAAA;KAAA;AACrB,WAAO,IAAA,CAAK,GAAA,CACP,CAAA;;AAEA,KAAC,KAAA,CAAM,CAAA,CAAA,GAAK,KAAA,CAAM,CAAA,CAAA,CAAG,MAAA,GAAS,CAAA,CAAA;;AAE7B,SAAA,CAAM,CAAA,CAAA,GAAK,CAAC,KAAA,CAAM,CAAA,CAAA,GAAK,CAAA,CAAA,CAAA,CAAA;GAC/B,CAAA;;AAEA,0BAAA,CAAyB,SAAA,GAAY;AACnC,QAAA,EAAM,cAAU,UAAA,EAAY,OAAA,EAAS;AACnC,UAAA,CAAK,OAAA,GAAU,OAAA,CAAA;;AAEf,UAAA,CAAK,UAAA,GAAa,CAAA,CAAE,MAAA,CAAO,EAAA,EAAI,IAAA,CAAK,UAAA,CAAA,CAAA;;AAEpC,WAAK,IAAI,IAAA,IAAQ,UAAA,EACf,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,UAAA,CAAW,IAAA,CAAA,CAAM,EAAA,EAAI,UAAA,CAAW,IAAA,CAAA,CAAM,QAAA,CAAA,CAAA;;AAEhE,YAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,wBAAA,CAAA,CAAA;KAC3B;;;AAGE,aAAA,EAAW,mBAAU,MAAA,EAAQ;AAC3B,UAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAA,EACtC,MAAM,IAAI,KAAA,CAAM,MAAA,GAAS,kCAAA,CAAA,CAAA;;AAE3B,UAAA,CAAK,MAAA,GAAS,MAAA,CAAA;;AAEd,aAAO,IAAA,CAAA;KACX;;;AAGE,cAAA,EAAY,oBAAU,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAK;AAC3C,UAAI,QAAA,KAAa,OAAO,QAAA,EACtB,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAA,GAAU,QAAA,CAAA;;AAEzB,UAAI,IAAA,KAAS,GAAA,EACX,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,CAAA,CAAA;;AAExB,aAAO,IAAA,CAAA;KACX;;;AAGE,cAAA,EAAY,oBAAU,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS;AAC3C,UAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAA,EACtC,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAA,GAAU,EAAA,CAAA;;AAEzB,UAAA,CAAK,OAAA,CAAQ,MAAA,CAAA,CAAQ,IAAA,CAAA,GAAQ,OAAA,CAAA;;AAE7B,aAAO,IAAA,CAAA;KACX;;;AAGE,eAAA,EAAa,qBAAU,MAAA,EAAQ,iBAAA,EAAmB;AAChD,WAAK,IAAI,IAAA,IAAQ,iBAAA,EACf,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,IAAA,EAAM,iBAAA,CAAkB,IAAA,CAAA,CAAA,CAAA;;AAElD,aAAO,IAAA,CAAA;KACX;;;;;;;;;;;;;;;;AAgBE,gBAAA,EAAc,sBAAU,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM;AACxC,UAAI,IAAA,CAAK,UAAA,CAAW,IAAA,CAAA,EA7IxB,qBA8IkB,CAAC,IAAA,CAAK,aAAA,GAAgB,IAAA,GAAO,uBAAA,CAAA,CAAA,KACtC,IAAI,eAAA,CAAgB,cAAA,CAAe,IAAA,CAAA,EAAO;AA/InD,6BAgJkB,CAAC,IAAA,CAAK,GAAA,GAAM,IAAA,GAAO,8DAAA,CAAA,CAAA;AAC/B,eAAA;OACN;AACI,aAAO,IAAA,CAAK,aAAA,MAAA,CAAL,IAAA,EAAsB,SAAA,CAAA,CAAA;KACjC;;AAEE,mBAAA,EAAiB,yBAAU,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM;AAC3C,UAAI,CAAC,IAAA,CAAK,UAAA,CAAW,IAAA,CAAA,EAAO;AAvJhC,6BAwJkB,CAAC,IAAA,CAAK,aAAA,GAAgB,IAAA,GAAO,2BAAA,CAAA,CAAA;AACzC,eAAO,IAAA,CAAK,YAAA,MAAA,CAAL,IAAA,EAAqB,SAAA,CAAA,CAAA;OAClC;AACI,aAAO,IAAA,CAAK,aAAA,MAAA,CAAL,IAAA,EAAsB,SAAA,CAAA,CAAA;KACjC;;AAEE,mBAAA,EAAiB,yBAAU,IAAA,EAAM;AAC/B,UAAI,CAAC,IAAA,CAAK,UAAA,CAAW,IAAA,CAAA,EA/JzB,qBAgKkB,CAAC,IAAA,CAAK,aAAA,GAAgB,IAAA,GAAO,mBAAA,CAAA,CAAA;;AAE3C,aAAO,IAAA,CAAK,UAAA,CAAW,IAAA,CAAA,CAAA;;AAEvB,aAAO,IAAA,CAAA;KACX;;AAEE,iBAAA,EAAe,uBAAU,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU;AAClD,UAAI,QAAA,KAAa,OAAO,SAAA,EAAW;;AAEjC,iBAAA,GAAY;AACV,YAAA,EAAI,SAAA;AACJ,kBAAA,EAAU,QAAA;SAClB,CAAA;OACA;AACI,UAAI,CAAC,SAAA,CAAU,QAAA,EAAU;AACvB,iBAAA,GAAY,IAAI,gBAAA,CAAiB,SAAA,CAAA,CAAA;OACvC;AACI,UAAA,CAAK,UAAA,CAAW,IAAA,CAAA,GAAQ,SAAA,CAAA;;AAExB,WAAK,IAAI,MAAA,IAAU,SAAA,CAAU,QAAA,IAAY,EAAA,EACvC,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,IAAA,EAAM,SAAA,CAAU,QAAA,CAAS,MAAA,CAAA,CAAA,CAAA;;AAEnD,aAAO,IAAA,CAAA;KACX;;AAEE,mBAAA,EAAiB,yBAAU,UAAA,EAAY;AACrC,UAAI,OAAA,CAAA;;;AAGJ,UAAI,MAAA,KAAW,UAAA,CAAW,IAAA,EAAM;AAC9B,YAAI,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAA,CAAQ,UAAA,CAAW,IAAA,CAAA,IAAS,EAAA,CAAA;AACjE,eAAA,GAAU,YAAA,CAAa,UAAA,CAAW,YAAA,CAAA,CAAA;OACxC,MACM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAA,CAAQ,UAAA,CAAW,IAAA,CAAA,EAAO,UAAA,CAAW,YAAA,CAAA,CAAA;;AAEtF,aAAO,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAA,CAAQ,cAAA,IAAkB,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,cAAA,CAAA;KAClF;;;AAGE,iBAAA,EAAe,uBAAU,MAAA,EAAQ,UAAA,EAAY;AAC3C,UAAI,QAAA,KAAa,OAAO,UAAA,EAAY;AAClC,aAAK,IAAI,CAAA,IAAK,UAAA,EACZ,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,UAAA,CAAW,CAAA,CAAA,CAAA,CAAA;;AAEjD,eAAO,MAAA,CAAA;OACb;;AAEI,aAAO,QAAA,KAAa,OAAO,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,UAAA,CAAA,GAAc,EAAA,CAAA;KAC5E;;;;;;;;;AASE,cAAA,EAAY;AACV,cAAA,EAAU;AACR,sBAAA,EAAgB,wBAAS,KAAA,EAAO;AAC9B,iBAAO,KAAA,CAAK,IAAA,CAAK,KAAA,CAAA;YAAA;SACzB;AACM,gBAAA,EAAU,CAAA;OAChB;AACI,cAAA,EAAU;AACR,wBAAA,EAAkB,0BAAS,MAAA,EAAQ;AACjC,iBAAO,MAAA,CAAO,MAAA,GAAS,CAAA,CAAA;SAC/B;AACM,sBAAA,EAAgB,wBAAS,KAAA,EAAO;AAC9B,iBAAO,KAAA,CAAK,IAAA,CAAK,KAAA,CAAA;YAAA;SACzB;AACM,gBAAA,EAAU,GAAA;OAChB;AACI,UAAA,EAAM;AACJ,sBAAA,EAAgB,wBAAS,KAAA,EAAO,IAAA,EAAmC;2EAAJ,EAAA;;+BAAxB,IAAA;cAAA,IAAA,6BAAO,GAAA;+BAAK,IAAA;cAAA,IAAA,6BAAO,CAAA;;AACxD,cAAI,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAA,CAAA;AACxB,cAAI,CAAC,KAAA,EAAO;AACV,kBAAM,IAAI,KAAA,CAAM,kBAAA,GAAqB,IAAA,GAAO,oBAAA,CAAA,CAAA;WACtD;AACQ,cAAI,CAAC,KAAA,CAAM,IAAA,CAAK,KAAA,CAAA,EACd,OAAO,KAAA,CAAA;AACT,cAAI,QAAA,KAAa,IAAA,EAAM;AACrB,gBAAI,CAAC,QAAA,CAAS,IAAA,CAAK,IAAA,IAAQ,EAAA,CAAA,EAAK;AAC9B,kBAAI,EAAA,GAAK,MAAA,CAAO,KAAA,CAAA,CAAA;AAChB,kBAAI,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,IAAA,CAAA,EAAO,aAAA,CAAc,IAAA,CAAA,CAAA,CAAA;AAC3D,kBAAI,aAAA,CAAc,EAAA,CAAA,GAAM,QAAA;AACtB,uBAAO,KAAA,CAAA;;AAET,kBAAI,KAAA,GAAQ,SAAR,KAAA,CAAQ,CAAA;uBAAK,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,QAAA,CAAA,CAAA;eAAA,CAAA;AAC7C,kBAAI,CAAC,KAAA,CAAM,EAAA,CAAA,GAAM,KAAA,CAAM,IAAA,CAAA,CAAA,GAAS,KAAA,CAAM,IAAA,CAAA,IAAS,CAAA,EAC7C,OAAO,KAAA,CAAA;aACrB;WACA;AACQ,iBAAO,IAAA,CAAA;SACf;AACM,uBAAA,EAAiB;AACf,YAAA,EAAI,QAAA;AACJ,cAAA,EAAM,QAAA;AACN,cAAA,EAAM,QAAA;SACd;AACM,gBAAA,EAAU,GAAA;OAChB;AACI,aAAA,EAAS;AACP,sBAAA,EAAgB,wBAAS,KAAA,EAAO,MAAA,EAAQ;AACtC,iBAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAA,CAAA;SAC3B;AACM,uBAAA,EAAiB,QAAA;AACjB,gBAAA,EAAU,EAAA;OAChB;AACI,eAAA,EAAW;AACT,sBAAA,EAAgB,wBAAU,KAAA,EAAO,WAAA,EAAa;AAC5C,iBAAO,KAAA,CAAM,MAAA,IAAU,WAAA,CAAA;SAC/B;AACM,uBAAA,EAAiB,SAAA;AACjB,gBAAA,EAAU,EAAA;OAChB;AACI,eAAA,EAAW;AACT,sBAAA,EAAgB,wBAAU,KAAA,EAAO,WAAA,EAAa;AAC5C,iBAAO,KAAA,CAAM,MAAA,IAAU,WAAA,CAAA;SAC/B;AACM,uBAAA,EAAiB,SAAA;AACjB,gBAAA,EAAU,EAAA;OAChB;AACI,YAAA,EAAQ;AACN,sBAAA,EAAgB,wBAAU,KAAA,EAAO,GAAA,EAAK,GAAA,EAAK;AACzC,iBAAO,KAAA,CAAM,MAAA,IAAU,GAAA,IAAO,KAAA,CAAM,MAAA,IAAU,GAAA,CAAA;SACtD;AACM,uBAAA,EAAiB,CAAC,SAAA,EAAW,SAAA,CAAA;AAC7B,gBAAA,EAAU,EAAA;OAChB;AACI,cAAA,EAAU;AACR,wBAAA,EAAkB,0BAAU,MAAA,EAAQ,WAAA,EAAa;AAC/C,iBAAO,MAAA,CAAO,MAAA,IAAU,WAAA,CAAA;SAChC;AACM,uBAAA,EAAiB,SAAA;AACjB,gBAAA,EAAU,EAAA;OAChB;AACI,cAAA,EAAU;AACR,wBAAA,EAAkB,0BAAU,MAAA,EAAQ,WAAA,EAAa;AAC/C,iBAAO,MAAA,CAAO,MAAA,IAAU,WAAA,CAAA;SAChC;AACM,uBAAA,EAAiB,SAAA;AACjB,gBAAA,EAAU,EAAA;OAChB;AACI,WAAA,EAAO;AACL,wBAAA,EAAkB,0BAAU,MAAA,EAAQ,GAAA,EAAK,GAAA,EAAK;AAC5C,iBAAO,MAAA,CAAO,MAAA,IAAU,GAAA,IAAO,MAAA,CAAO,MAAA,IAAU,GAAA,CAAA;SACxD;AACM,uBAAA,EAAiB,CAAC,SAAA,EAAW,SAAA,CAAA;AAC7B,gBAAA,EAAU,EAAA;OAChB;AACI,SAAA,EAAK;AACH,sBAAA,EAAgB,wBAAU,KAAA,EAAO,WAAA,EAAa;AAC5C,iBAAO,KAAA,IAAS,WAAA,CAAA;SACxB;AACM,uBAAA,EAAiB,QAAA;AACjB,gBAAA,EAAU,EAAA;OAChB;AACI,SAAA,EAAK;AACH,sBAAA,EAAgB,wBAAU,KAAA,EAAO,WAAA,EAAa;AAC5C,iBAAO,KAAA,IAAS,WAAA,CAAA;SACxB;AACM,uBAAA,EAAiB,QAAA;AACjB,gBAAA,EAAU,EAAA;OAChB;AACI,WAAA,EAAO;AACL,sBAAA,EAAgB,wBAAU,KAAA,EAAO,GAAA,EAAK,GAAA,EAAK;AACzC,iBAAO,KAAA,IAAS,GAAA,IAAO,KAAA,IAAS,GAAA,CAAA;SACxC;AACM,uBAAA,EAAiB,CAAC,QAAA,EAAU,QAAA,CAAA;AAC5B,gBAAA,EAAU,EAAA;OAChB;AACI,aAAA,EAAS;AACP,sBAAA,EAAgB,wBAAU,KAAA,EAAO,UAAA,EAAY;AAC3C,cAAI,UAAA,GAAa,CAAA,CAAE,UAAA,CAAA,CAAA;AACnB,cAAI,UAAA,CAAW,MAAA,EACb,OAAO,KAAA,KAAU,UAAA,CAAW,GAAA,EAAA,CAAA,KAE5B,OAAO,KAAA,KAAU,UAAA,CAAA;SAC3B;AACM,gBAAA,EAAU,GAAA;OAChB;KACA;GACA,CAAA;;ACrVA,MAAI,SAAA,GAAY,EAAA,CAAA;;AAEhB,MAAI,WAAA,GAAc,SAAd,WAAA,CAAwB,SAAA,EAAW,SAAA,EAAW,IAAA,EAAM;AACtD,QAAI,KAAA,GAAQ,EAAA,CAAA;AACZ,QAAI,IAAA,GAAO,EAAA,CAAA;;AAEX,SAAK,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAA,EAAK;AACzC,UAAI,KAAA,GAAQ,KAAA,CAAA;;AAEZ,WAAK,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAA,EACpC,IAAI,SAAA,CAAU,CAAA,CAAA,CAAG,MAAA,CAAO,IAAA,KAAS,SAAA,CAAU,CAAA,CAAA,CAAG,MAAA,CAAO,IAAA,EAAM;AACzD,aAAA,GAAQ,IAAA,CAAA;AACR,cAAA;OACR;;AAEI,UAAI,KAAA,EACF,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,CAAA,CAAA,CAAA,CAAA,KAEpB,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAA,CAAA,CAAA,CAAA;KAC3B;;AAEE,WAAO;AACL,UAAA,EAAM,IAAA;AACN,WAAA,EAAO,KAAA;AACP,aAAA,EAAS,CAAC,IAAA,GAAO,WAAA,CAAY,SAAA,EAAW,SAAA,EAAW,IAAA,CAAA,CAAM,KAAA,GAAQ,EAAA;KACrE,CAAA;GACA,CAAA;;AAEA,WAAA,CAAU,IAAA,GAAO;;AAEf,sBAAA,EAAoB,8BAAY;;;AAC9B,UAAA,CAAK,QAAA,CAAS,EAAA,CAAG,gBAAA,EAAkB,UAAA,GAAA,EAAO;AAAE,eAAK,gBAAA,CAAiB,GAAA,CAAA,CAAA;OAAA,CAAA,CAAA;AAClE,UAAA,CAAK,QAAA,CAAS,EAAA,CAAG,eAAA,EAAiB,6CAAA,EAA+C,UAAA,GAAA,EAAO;AAAE,eAAK,cAAA,CAAe,GAAA,CAAA,CAAA;OAAA,CAAA,CAAA;;;AAG9G,UAAI,KAAA,KAAU,IAAA,CAAK,OAAA,CAAQ,SAAA,EACzB,OAAA;;AAEF,UAAA,CAAK,QAAA,CAAS,IAAA,CAAK,YAAA,EAAc,EAAA,CAAA,CAAA;KACrC;;AAEE,SAAA,EAAO,iBAAY;AACjB,UAAA,CAAK,aAAA,GAAgB,IAAA,CAAA;;AAErB,UAAI,IAAA,KAAS,IAAA,CAAK,gBAAA,IAAoB,MAAA,KAAW,IAAA,CAAK,OAAA,CAAQ,KAAA,EAC5D,OAAO,IAAA,CAAA;;AAET,WAAK,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC3C,YAAI,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAA,CAAA,CAAA;AACxB,YAAI,IAAA,KAAS,KAAA,CAAM,gBAAA,IAAoB,KAAA,CAAM,gBAAA,CAAiB,MAAA,GAAS,CAAA,IAAK,WAAA,KAAgB,OAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS;AACxH,cAAA,CAAK,aAAA,GAAgB,KAAA,CAAM,QAAA,CAAA;AAC3B,cAAI,OAAA,KAAY,IAAA,CAAK,OAAA,CAAQ,KAAA,EAC3B,MAAA;SACV;OACA;;AAEI,UAAI,IAAA,KAAS,IAAA,CAAK,aAAA,EAChB,OAAO,IAAA,CAAA;;AAET,aAAO,IAAA,CAAK,aAAA,CAAc,KAAA,EAAA,CAAA;KAC9B;;AAEE,cAAA,EAAY,sBAAY;;AAEtB,UAAA,CAAK,QAAA,CAAS,GAAA,CAAI,UAAA,CAAA,CAAA;KACtB;;GAEA,CAAA;;AAEA,WAAA,CAAU,KAAA,GAAQ;;AAEhB,aAAA,EAAW,qBAAY;AACrB,UAAA,CAAK,QAAA,EAAA,CAAA;;;AAGL,UAAI,CAAC,IAAA,CAAK,GAAA,EACR,OAAA;;;AAGF,UAAI,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,gBAAA,EAAkB,IAAA,CAAK,GAAA,CAAI,oBAAA,CAAA,CAAA;;;AAGvD,UAAA,CAAK,GAAA,CAAI,oBAAA,GAAuB,IAAA,CAAK,gBAAA,CAAA;;;AAGrC,UAAA,CAAK,kBAAA,EAAA,CAAA;;;AAGL,UAAA,CAAK,qBAAA,CAAsB,IAAA,CAAA,CAAA;;;AAG3B,UAAA,CAAK,kBAAA,EAAA,CAAA;;;AAGL,UAAI,CAAC,IAAA,CAAK,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,MAAA,CAAA,IAAW,CAAC,IAAA,CAAK,WAAA,EAAa;AAChE,YAAA,CAAK,WAAA,GAAc,IAAA,CAAA;AACnB,YAAA,CAAK,kBAAA,EAAA,CAAA;OACX;KACA;;;AAGE,qBAAA,EAAmB,6BAAY;;AAE7B,UAAI,IAAA,KAAS,IAAA,CAAK,gBAAA,EAChB,OAAO,EAAA,CAAA;;AAET,UAAI,QAAA,GAAW,EAAA,CAAA;;AAEf,WAAK,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,CAAA,EAAA,EAChD,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,CAAA,CAAA,CAAG,YAAA,IACtC,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,gBAAA,CAAiB,CAAA,CAAA,CAAG,MAAA,CAAA,CAAA,CAAA;;AAElD,aAAO,QAAA,CAAA;KACX;;;AAGE,YAAA,EAAU,kBAAU,IAAA,EAAkD;wEAAJ,EAAA;;UAAvC,OAAA,SAAA,OAAA;UAAS,MAAA,SAAA,MAAA;oCAAQ,WAAA;UAAA,WAAA,qCAAc,IAAA;;AACxD,UAAA,CAAK,QAAA,EAAA,CAAA;AACL,UAAA,CAAK,SAAA,CAAU,IAAA,EAAM,EAAC,OAAA,EAAA,OAAA,EAAS,MAAA,EAAA,MAAA,EAAA,CAAA,CAAA;;AAE/B,UAAI,WAAA,EACF,IAAA,CAAK,WAAA,EAAA,CAAA;KACX;;;AAGE,eAAA,EAAa,qBAAU,IAAA,EAAkD;wEAAJ,EAAA;;UAAvC,OAAA,SAAA,OAAA;UAAS,MAAA,SAAA,MAAA;oCAAQ,WAAA;UAAA,WAAA,qCAAc,IAAA;;AAC3D,UAAA,CAAK,QAAA,EAAA,CAAA;AACL,UAAA,CAAK,YAAA,CAAa,IAAA,EAAM,EAAC,OAAA,EAAA,OAAA,EAAS,MAAA,EAAA,MAAA,EAAA,CAAA,CAAA;;AAElC,UAAI,WAAA,EACF,IAAA,CAAK,WAAA,EAAA,CAAA;KACX;;;AAGE,eAAA,EAAa,qBAAU,IAAA,EAAiC;wEAAJ,EAAA;;oCAAtB,WAAA;UAAA,WAAA,qCAAc,IAAA;;AAC1C,UAAA,CAAK,QAAA,EAAA,CAAA;AACL,UAAA,CAAK,YAAA,CAAa,IAAA,CAAA,CAAA;;;;AAIlB,UAAI,WAAA,EACF,IAAA,CAAK,kBAAA,EAAA,CAAA;KACX;;AAEE,sBAAA,EAAoB,8BAAY;AAC9B,UAAI,IAAA,CAAK,cAAA,EAAA,IAAoB,IAAA,CAAK,eAAA,EAAA,IAAqB,IAAA,KAAS,IAAA,CAAK,gBAAA,EACnE,IAAA,CAAK,aAAA,EAAA,CAAA,KACF,IAAI,IAAA,CAAK,gBAAA,CAAiB,MAAA,GAAS,CAAA,EACtC,IAAA,CAAK,WAAA,EAAA,CAAA,KAEL,IAAA,CAAK,WAAA,EAAA,CAAA;KACX;;AAEE,yBAAA,EAAuB,+BAAU,IAAA,EAAM;AACrC,UAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,OAAA,CAAQ,sBAAA,EACtC,OAAA;;;AAGF,UAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc;AACpD,YAAK,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,IAAA,CAAK,MAAA,EAAS;AAC3C,cAAA,CAAK,mBAAA,EAAA,CAAA;;AAEL,cAAI,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,cAAA,CAAe,IAAA,CAAK,+BAAA,CAAA,CAAiC,MAAA,EACtE,IAAA,CAAK,GAAA,CAAI,cAAA,CACN,MAAA,CACC,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAA,CACd,QAAA,CAAS,8BAAA,CAAA,CACxB,CAAA;;AAEQ,iBAAO,IAAA,CAAK,GAAA,CAAI,cAAA,CACb,QAAA,CAAS,QAAA,CAAA,CACT,IAAA,CAAK,+BAAA,CAAA,CACL,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAA,CAAA;SAC7B;;AAEM,eAAO,IAAA,CAAK,GAAA,CAAI,cAAA,CACb,WAAA,CAAY,QAAA,CAAA,CACZ,IAAA,CAAK,+BAAA,CAAA,CACL,MAAA,EAAA,CAAA;OACT;;;AAGI,WAAK,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,EAAA,EACvC,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,CAAA,CAAA,CAAG,MAAA,CAAO,IAAA,CAAA,CAAA;;AAE3C,WAAK,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAA,EACjC,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,CAAA,CAAA,CAAG,MAAA,CAAO,IAAA,EAAM,EAAC,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,CAAA,CAAA,CAAG,YAAA,EAAc,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,CAAA,CAAG,MAAA,EAAA,CAAA,CAAA;;AAExG,WAAK,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAA,EAChC,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,CAAA,CAAA,CAAG,MAAA,CAAO,IAAA,EAAM,EAAC,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,CAAA,CAAA,CAAG,YAAA,EAAc,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,CAAA,CAAA,CAAG,MAAA,EAAA,CAAA,CAAA;KAC5G;;AAGE,aAAA,EAAW,mBAAU,IAAA,EAAM,KAAU,EAAS;UAAlB,OAAA,GAAD,KAAU,CAAT,OAAA;UAAS,MAAA,GAAV,KAAU,CAAA,MAAA;;AACnC,UAAA,CAAK,mBAAA,EAAA,CAAA;AACL,UAAA,CAAK,GAAA,CAAI,cAAA,CACN,QAAA,CAAS,QAAA,CAAA,CACT,MAAA,CACC,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAA,CACd,QAAA,CAAS,UAAA,GAAa,IAAA,CAAA,CACtB,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAA,CAAA,CAC/C,CAAA;KACA;;AAEE,gBAAA,EAAc,sBAAU,IAAA,EAAM,KAAU,EAAS;UAAlB,OAAA,GAAD,KAAU,CAAT,OAAA;UAAS,MAAA,GAAV,KAAU,CAAA,MAAA;;AACtC,UAAA,CAAK,GAAA,CAAI,cAAA,CACN,QAAA,CAAS,QAAA,CAAA,CACT,IAAA,CAAK,WAAA,GAAc,IAAA,CAAA,CACnB,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAA,CAAA,CAAA;KAC7C;;AAEE,gBAAA,EAAc,sBAAU,IAAA,EAAM;AAC5B,UAAA,CAAK,GAAA,CAAI,cAAA,CACN,WAAA,CAAY,QAAA,CAAA,CACZ,IAAA,CAAK,WAAA,GAAc,IAAA,CAAA,CACnB,MAAA,EAAA,CAAA;KACP;;AAEE,oBAAA,EAAkB,0BAAU,UAAA,EAAY;AACtC,UAAI,4BAAA,GAA+B,UAAA,CAAW,IAAA,GAAO,SAAA,CAAA;;AAErD,UAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,OAAA,CAAQ,4BAAA,CAAA,EACtC,OAAO,MAAA,CAAO,OAAA,CAAQ,aAAA,CAAc,IAAA,CAAK,OAAA,CAAQ,4BAAA,CAAA,EAA+B,UAAA,CAAW,YAAA,CAAA,CAAA;;AAE7F,aAAO,MAAA,CAAO,OAAA,CAAQ,eAAA,CAAgB,UAAA,CAAA,CAAA;KAC1C;;AAEE,YAAA,EAAU,oBAAY;;AAEpB,UAAI,IAAA,CAAK,GAAA,IAAO,KAAA,KAAU,IAAA,CAAK,OAAA,CAAQ,SAAA,EACrC,OAAA;;AAEF,UAAI,GAAA,GAAM,EAAA,CAAA;;;AAGV,UAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,SAAA,GAAY,IAAA,EAAM,IAAA,CAAK,MAAA,CAAA,CAAA;;;;AAIvD,SAAA,CAAI,kBAAA,GAAqB,IAAA,CAAK,mBAAA,EAAA,CAAA;;;AAG9B,SAAA,CAAI,eAAA,GAAkB,aAAA,IAAiB,IAAA,CAAK,OAAA,CAAQ,QAAA,GAAW,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,MAAA,CAAA,CAAA;AAC1G,SAAA,CAAI,cAAA,GAAiB,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAA,CAAe,IAAA,CAAK,IAAA,EAAM,GAAA,CAAI,eAAA,CAAA,CAAA;;;AAGlE,SAAA,CAAI,oBAAA,GAAuB,EAAA,CAAA;AAC3B,SAAA,CAAI,4BAAA,GAA+B,KAAA,CAAA;;;AAGnC,UAAA,CAAK,GAAA,GAAM,GAAA,CAAA;KACf;;;AAGE,uBAAA,EAAqB,+BAAY;;AAE/B,UAAI,QAAA,KAAa,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,IAAgB,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAA,CAAc,MAAA,EAChF,OAAO,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAA,CAAA;;;AAGxB,UAAI,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,IAAA,CAAA,CAAA;;;AAGpD,UAAI,WAAA,KAAgB,OAAO,QAAA,IAAY,QAAA,CAAS,MAAA,EAC9C,OAAO,QAAA,CAAA;;;AAGT,UAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,QAAA,CAAA,EAC7C,OAAO,IAAA,CAAK,QAAA,CAAA;;;AAGd,aAAO,IAAA,CAAK,QAAA,CAAS,MAAA,EAAA,CAAA;KACzB;;AAEE,uBAAA,EAAqB,+BAAY;AAC/B,UAAI,gBAAA,CAAA;;;AAGJ,UAAI,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,cAAA,CAAe,MAAA,EAAA,CAAS,MAAA,EACzC,OAAO,IAAA,CAAK,GAAA,CAAI,cAAA,CAAe,MAAA,EAAA,CAAA;;AAEjC,UAAI,QAAA,KAAa,OAAO,IAAA,CAAK,OAAA,CAAQ,eAAA,EAAiB;AACpD,YAAI,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAA,CAAiB,MAAA,EAClC,OAAO,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAA,CAAiB,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,cAAA,CAAA,CAAA,KA9R/D,qBAgSoB,CAAC,IAAA,CAAK,wBAAA,GAA2B,IAAA,CAAK,OAAA,CAAQ,eAAA,GAAkB,yBAAA,CAAA,CAAA;OACpF,MAAW,IAAI,UAAA,KAAe,OAAO,IAAA,CAAK,OAAA,CAAQ,eAAA,EAC5C,gBAAA,GAAmB,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAA,CAAA;;AAE7D,UAAI,WAAA,KAAgB,OAAO,gBAAA,IAAoB,gBAAA,CAAiB,MAAA,EAC9D,OAAO,gBAAA,CAAiB,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,cAAA,CAAA,CAAA;;AAE1C,UAAI,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAA;AACjB,UAAI,IAAA,CAAK,OAAA,CAAQ,QAAA,EACf,KAAA,GAAQ,KAAA,CAAM,MAAA,EAAA,CAAA;AAChB,aAAO,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,cAAA,CAAA,CAAA;KAChC;;AAEE,sBAAA,EAAoB,8BAAY;;;AAC9B,UAAI,OAAA,GAAU,IAAA,CAAK,YAAA,EAAA,CAAA;AACnB,UAAI,OAAA,CAAA;;;AAGJ,aAAA,CAAQ,GAAA,CAAI,UAAA,CAAA,CAAA;AACZ,UAAI,IAAA,CAAK,WAAA,EACP,OAAA,CAAQ,EAAA,CApTd,qBAoT6B,CAAC,eAAA,CAAgB,IAAA,CAAK,OAAA,CAAQ,mBAAA,EAAqB,SAAA,CAAA,EAAY,YAAM;AAC1F,eAAK,QAAA,EAAA,CAAA;OACb,CAAA,CAAA,KACS,IAAI,OAAA,GAvTb,qBAuTmC,CAAC,eAAA,CAAgB,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,SAAA,CAAA,EAAY;AAChF,eAAA,CAAQ,EAAA,CAAG,OAAA,EAAS,UAAA,KAAA,EAAS;AAC3B,iBAAK,cAAA,CAAe,KAAA,CAAA,CAAA;SAC5B,CAAA,CAAA;OACA;KACA;;AAEE,kBAAA,EAAgB,wBAAU,KAAA,EAAO;;;;AAI/B,UAAI,WAAA,CAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAA,EACzB,IAAI,EAAE,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,4BAAA,CAAA,IAAiC,IAAA,CAAK,QAAA,EAAA,CAAW,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,mBAAA,EACjG,OAAA;;AAEJ,UAAA,CAAK,QAAA,EAAA,CAAA;KACT;;AAEE,YAAA,EAAU,oBAAY;;AAEpB,UAAA,CAAK,WAAA,GAAc,KAAA,CAAA;AACnB,UAAA,CAAK,kBAAA,EAAA,CAAA;;;AAGL,UAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,GAAA,EAC9B,OAAA;;;AAGF,UAAA,CAAK,GAAA,CAAI,cAAA,CACN,WAAA,CAAY,QAAA,CAAA,CACZ,QAAA,EAAA,CACA,MAAA,EAAA,CAAA;;;AAGH,UAAA,CAAK,WAAA,EAAA,CAAA;;;AAGL,UAAA,CAAK,GAAA,CAAI,oBAAA,GAAuB,EAAA,CAAA;AAChC,UAAA,CAAK,GAAA,CAAI,4BAAA,GAA+B,KAAA,CAAA;KAC5C;;AAEE,cAAA,EAAY,sBAAY;AACtB,UAAA,CAAK,QAAA,EAAA,CAAA;;AAEL,UAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,GAAA,EAC9B,IAAA,CAAK,GAAA,CAAI,cAAA,CAAe,MAAA,EAAA,CAAA;;AAE1B,aAAO,IAAA,CAAK,GAAA,CAAA;KAChB;;AAEE,iBAAA,EAAe,yBAAY;AACzB,UAAA,CAAK,GAAA,CAAI,4BAAA,GAA+B,IAAA,CAAA;AACxC,UAAA,CAAK,GAAA,CAAI,kBAAA,CAAmB,WAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAA,CAAY,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAA,CAAA;KAC3F;AACE,eAAA,EAAa,uBAAY;AACvB,UAAA,CAAK,GAAA,CAAI,4BAAA,GAA+B,IAAA,CAAA;AACxC,UAAA,CAAK,GAAA,CAAI,kBAAA,CAAmB,WAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAA,CAAc,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAA,CAAA;KAC7F;AACE,eAAA,EAAa,uBAAY;AACvB,UAAA,CAAK,GAAA,CAAI,kBAAA,CAAmB,WAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAA,CAAc,WAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAA,CAAA;KAChG;GACA,CAAA;;AChXA,MAAI,WAAA,GAAc,SAAd,WAAA,CAAwB,OAAA,EAAS,UAAA,EAAY,OAAA,EAAS;AACxD,QAAA,CAAK,SAAA,GAAY,aAAA,CAAA;;AAEjB,QAAA,CAAK,QAAA,GAAW,CAAA,CAAE,OAAA,CAAA,CAAA;AAClB,QAAA,CAAK,UAAA,GAAa,UAAA,CAAA;AAClB,QAAA,CAAK,OAAA,GAAU,OAAA,CAAA;AACf,QAAA,CAAK,MAAA,GAAS,MAAA,CAAO,OAAA,CAAA;;AAErB,QAAA,CAAK,MAAA,GAAS,EAAA,CAAA;AACd,QAAA,CAAK,gBAAA,GAAmB,IAAA,CAAA;GAC1B,CAAA;;AAEA,MAhBA,0BAgBiB,GAAG,EAAC,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,KAAA,EAAA,CAAA;;AAE9D,aAAA,CAAY,SAAA,GAAY;AACtB,oBAAA,EAAkB,0BAAU,KAAA,EAAO;;;;AAEjC,UAAI,IAAA,KAAS,KAAA,CAAM,OAAA,EACjB,OAAA;;;AAGF,UAAI,aAAA,GAAgB,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,6CAAA,CAAA,CAA+C,KAAA,EAAA,CAAA;AAC7G,UAAA,CAAK,cAAA,GAAiB,IAAA,CAAA;AACtB,UAAA,CAAK,QAAA,CAAS,IAAA,CAAK,kCAAA,CAAA,CAAoC,IAAA,CAAK,UAAA,EAAY,IAAA,CAAA,CAAA;AACxE,UAAI,aAAA,CAAc,EAAA,CAAG,kBAAA,CAAA,EACnB,OAAA;;AAEF,UAAI,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,EAAC,KAAA,EAAA,KAAA,EAAA,CAAA,CAAA;;AAEjC,UAAI,UAAA,KAAe,OAAA,CAAQ,KAAA,EAAA,IAAW,KAAA,KAAU,IAAA,CAAK,QAAA,CAAS,QAAA,CAAA,EAAW;;;OAG7E,MAAW;;AAEL,eAAA,CAAM,wBAAA,EAAA,CAAA;AACN,eAAA,CAAM,cAAA,EAAA,CAAA;AACN,cAAI,SAAA,KAAc,OAAA,CAAQ,KAAA,EAAA,EACxB,OAAA,CAAQ,IAAA,CAAK,YAAM;AAAE,mBAAK,OAAA,CAAQ,aAAA,CAAA,CAAA;WAAA,CAAA,CAAA;SAC1C;KACA;;AAEE,kBAAA,EAAgB,wBAAS,KAAA,EAAO;AAC9B,UAAA,CAAK,cAAA,GAAiB,CAAA,CAAE,KAAA,CAAM,aAAA,CAAA,CAAA;KAClC;;;;AAIE,WAAA,EAAS,iBAAU,aAAA,EAAe;AAChC,UAAI,KAAA,KAAU,IAAA,CAAK,QAAA,CAAS,QAAA,CAAA,EAC1B,OAAA;;AAEF,UAAI,aAAA,EAAe;AACjB,YAAI,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,kCAAA,CAAA,CAAoC,IAAA,CAAK,UAAA,EAAY,KAAA,CAAA,CAAA;AACzF,YAAI,CAAA,KAAM,UAAA,CAAW,MAAA,EACnB,UAAA,GAAa,CAAA,CAAE,+DAAA,CAAA,CAAiE,QAAA,CAAS,IAAA,CAAK,QAAA,CAAA,CAAA;AAChG,kBAAA,CAAW,IAAA,CAAK;AACd,cAAA,EAAM,aAAA,CAAc,IAAA,CAAK,MAAA,CAAA;AACzB,eAAA,EAAO,aAAA,CAAc,IAAA,CAAK,OAAA,CAAA;SAClC,CAAA,CAAA;OACA;;AAEI,UAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,KAAA,CAAM,QAAA,CAAA,EAAW,EAAC,OAAA,EAAS,IAAA,EAAA,CAAA,CAAA,CAAA;KAChE;;;;;;;AAOE,YAAA,EAAU,kBAAU,OAAA,EAAS;AAC3B,UAAI,SAAA,CAAU,MAAA,IAAU,CAAA,IAAK,CAAC,CAAA,CAAE,aAAA,CAAc,OAAA,CAAA,EAAU;AA1E5D,6BA2EkB,CAAC,QAAA,CAAS,0FAAA,CAAA,CAAA;;qCACM,SAAA;;YAAvB,KAAA;YAAO,KAAA;YAAO,KAAA;;AACnB,eAAA,GAAU,EAAC,KAAA,EAAA,KAAA,EAAO,KAAA,EAAA,KAAA,EAAO,KAAA,EAAA,KAAA,EAAA,CAAA;OAC/B;AACI,aA/EJ,0BA+EwB,CAAE,IAAA,CAAK,YAAA,CAAa,OAAA,CAAA,CAAS,KAAA,EAAA,CAAA,CAAA;KACrD;;AAEE,gBAAA,EAAc,wBAAsC;;;;wEAAJ,EAAA;;UAAvB,KAAA,SAAA,KAAA;UAAO,KAAA,SAAA,KAAA;UAAO,KAAA,SAAA,KAAA;;AACrC,UAAA,CAAK,WAAA,GAAc,KAAA,CAAA;AACnB,UAAI,KAAA,EAAO;AACT,YAAA,CAAK,WAAA,GAAc,CAAA,CAAE,MAAA,CAAO,EAAA,EAAI,KAAA,EAAO,EAAC,cAAA,EAAgB,0BAAM;AArFpE,iCAsFoB,CAAC,QAAA,CAAS,wGAAA,CAAA,CAAA;AACtB,mBAAK,gBAAA,GAAmB,KAAA,CAAA;WAChC,EAAA,CAAA,CAAA;OACA;AACI,UAAA,CAAK,gBAAA,GAAmB,IAAA,CAAA;;;AAGxB,UAAA,CAAK,QAAA,CAAS,UAAA,CAAA,CAAA;;;AAGd,UAAA,CAAK,cAAA,EAAA,CAAA;;AAEL,UAAI,QAAA,GAAW,IAAA,CAAK,gCAAA,CAAiC,YAAM;AACzD,eAAO,CAAA,CAAE,GAAA,CAAI,OAAK,MAAA,EAAQ,UAAA,KAAA;iBAAS,KAAA,CAAM,YAAA,CAAa,EAAC,KAAA,EAAA,KAAA,EAAO,KAAA,EAAA,KAAA,EAAA,CAAA;SAAA,CAAA,CAAA;OACpE,CAAA,CAAA;;AAEI,aAtGJ,+CAAA,qBAsGuB,CAAC,GAAA,CAAI,QAAA,CAAA,CACrB,IAAA,CAAO,YAAM;AAAE,eAAK,QAAA,CAAS,SAAA,CAAA,CAAA;OAAA,CAAA,CAC7B,IAAA,CAAO,YAAM;AACZ,eAAK,gBAAA,GAAmB,KAAA,CAAA;AACxB,eAAK,KAAA,EAAA,CAAA;AACL,eAAK,QAAA,CAAS,OAAA,CAAA,CAAA;OACtB,CAAA,CACO,MAAA,CAAO,YAAM;AAAE,eAAK,QAAA,CAAS,WAAA,CAAA,CAAA;OAAA,CAAA,EAC7B,IAAA,MAAA,iEAAQ,IAAA,CAAK,gCAAA,EAAA,EAAA,CAAA;KACpB;;;;;;AAME,WAAA,EAAS,iBAAU,OAAA,EAAS;AAC1B,UAAI,SAAA,CAAU,MAAA,IAAU,CAAA,IAAK,CAAC,CAAA,CAAE,aAAA,CAAc,OAAA,CAAA,EAAU;AAtH5D,6BAuHkB,CAAC,QAAA,CAAS,yFAAA,CAAA,CAAA;;sCACD,SAAA;;YAAhB,KAAA;YAAO,KAAA;;AACZ,eAAA,GAAU,EAAC,KAAA,EAAA,KAAA,EAAO,KAAA,EAAA,KAAA,EAAA,CAAA;OACxB;AACI,aA3HJ,0BA2HwB,CAAE,IAAA,CAAK,SAAA,CAAU,OAAA,CAAA,CAAS,KAAA,EAAA,CAAA,CAAA;KAClD;;;;;AAKE,aAAA,EAAW,qBAA+B;;;wEAAJ,EAAA;;UAAhB,KAAA,SAAA,KAAA;UAAO,KAAA,SAAA,KAAA;;AAC3B,UAAA,CAAK,cAAA,EAAA,CAAA;;AAEL,UAAI,QAAA,GAAW,IAAA,CAAK,gCAAA,CAAiC,YAAM;AACzD,eAAO,CAAA,CAAE,GAAA,CAAI,OAAK,MAAA,EAAQ,UAAA,KAAA;iBAAS,KAAA,CAAM,SAAA,CAAU,EAAC,KAAA,EAAA,KAAA,EAAO,KAAA,EAAA,KAAA,EAAA,CAAA;SAAA,CAAA,CAAA;OACjE,CAAA,CAAA;AACI,aAvIJ,qBAuIuB,CAAC,GAAA,CAAI,QAAA,CAAA,CAAA;KAC5B;;AAEE,kBAAA,EAAgB,0BAAY;AAC1B,aAAO,IAAA,CAAK,gBAAA,EAAA,CAAmB,WAAA,EAAA,CAAA;KACnC;;AAEE,eAAA,EAAa,uBAAY;;;AACvB,UAAI,SAAA,GAAY,IAAA,CAAK,MAAA,CAAA;;AAErB,UAAA,CAAK,MAAA,GAAS,EAAA,CAAA;AACd,UAAA,CAAK,gBAAA,GAAmB,EAAA,CAAA;;AAExB,UAAA,CAAK,gCAAA,CAAiC,YAAM;AAC1C,eAAK,QAAA,CACJ,IAAA,CAAK,OAAK,OAAA,CAAQ,MAAA,CAAA,CAClB,GAAA,CAAI,OAAK,OAAA,CAAQ,QAAA,CAAA,CACjB,IAAA,CAAK,UAAC,CAAA,EAAG,OAAA,EAAY;AACpB,cAAI,aAAA,GAAgB,IAAI,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,EAAA,SAAI,CAAA;;;AAG5D,cAAI,CAAC,cAAA,KAAmB,aAAA,CAAc,SAAA,IAAa,sBAAA,KAA2B,aAAA,CAAc,SAAA,CAAA,IAAe,IAAA,KAAS,aAAA,CAAc,OAAA,CAAQ,QAAA,EACxI,IAAI,WAAA,KAAgB,OAAO,OAAK,gBAAA,CAAiB,aAAA,CAAc,SAAA,GAAY,GAAA,GAAM,aAAA,CAAc,MAAA,CAAA,EAAS;AACtG,mBAAK,gBAAA,CAAiB,aAAA,CAAc,SAAA,GAAY,GAAA,GAAM,aAAA,CAAc,MAAA,CAAA,GAAU,aAAA,CAAA;AAC9E,mBAAK,MAAA,CAAO,IAAA,CAAK,aAAA,CAAA,CAAA;WAC7B;SACA,CAAA,CAAA;;AAEM,SAAA,CAAE,IAAA,CAnKR,qBAmKyB,CAAC,UAAA,CAAW,SAAA,EAAW,OAAK,MAAA,CAAA,EAAS,UAAC,CAAA,EAAG,KAAA,EAAU;AACpE,eAAA,CAAM,QAAA,CAAS,OAAA,CAAA,CAAA;SACvB,CAAA,CAAA;OACA,CAAA,CAAA;AACI,aAAO,IAAA,CAAA;KACX;;;;;;;;;AASE,oCAAA,EAAkC,0CAAU,EAAA,EAAI;AAC9C,UAAI,mBAAA,GAAsB,IAAA,CAAK,gBAAA,CAAA;AAC/B,UAAA,CAAK,gBAAA,GAAmB,YAAY;AAAE,eAAO,IAAA,CAAA;OAAA,CAAA;AAC7C,UAAI,MAAA,GAAS,EAAA,EAAA,CAAA;AACb,UAAA,CAAK,gBAAA,GAAmB,mBAAA,CAAA;AACxB,aAAO,MAAA,CAAA;KACX;;;;;AAKE,YAAA,EAAU,kBAAU,SAAA,EAAW;AAC7B,aAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,GAAU,SAAA,CAAA,CAAA;KAClC;;GAEA,CAAA;;AC3LA,MAAI,iBAAA,GAAoB,SAApB,iBAAA,CAA8B,YAAA,EAAc,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,eAAA,EAAiB;AAC7F,QAAI,CAAC,cAAA,CAAe,IAAA,CAAK,YAAA,CAAa,SAAA,CAAA,EACpC,MAAM,IAAI,KAAA,CAAM,wDAAA,CAAA,CAAA;;AAElB,QAAI,aAAA,GAAgB,MAAA,CAAO,OAAA,CAAQ,kBAAA,CAAmB,UAAA,CAAW,IAAA,CAAA,CAAA;AACjE,QAAI,SAAA,GAAY,IAAI,gBAAA,CAAiB,aAAA,CAAA,CAAA;;AAErC,KAAA,CAAE,MAAA,CAAO,IAAA,EAAM;AACb,eAAA,EAAW,SAAA;AACX,UAAA,EAAM,IAAA;AACN,kBAAA,EAAc,YAAA;AACd,cAAA,EAAU,QAAA,IAAY,YAAA,CAAa,OAAA,CAAQ,IAAA,GAAO,UAAA,CAAA,IAAe,SAAA,CAAU,QAAA;AAC3E,qBAAA,EAAiB,IAAA,KAAS,eAAA;KAC9B,CAAA,CAAA;AACE,QAAA,CAAK,kBAAA,CAAmB,YAAA,CAAa,OAAA,CAAA,CAAA;GACvC,CAAA;;AAEA,MAAI,UAAA,GAAa,SAAb,UAAA,CAAsB,GAAA,EAAK;AAC7B,QAAI,GAAA,GAAM,GAAA,CAAI,CAAA,CAAA,CAAG,WAAA,EAAA,CAAA;AACjB,WAAO,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,CAAA,CAAA,CAAA;GACzB,CAAA;;AAEA,mBAAA,CAAkB,SAAA,GAAY;AAC5B,YAAA,EAAU,kBAAS,KAAA,EAAO,QAAA,EAAU;;;AAClC,aAAO,cAAA,IAAA,CAAK,SAAA,EAAU,QAAA,MAAA,cAAS,KAAA,4BAAU,IAAA,CAAK,eAAA,IAAiB,QAAA,GAAA,CAAA;KACnE;;AAEE,sBAAA,EAAoB,4BAAS,OAAA,EAAS;;;AACpC,UAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,SAAA,CAAU,iBAAA,CAAkB,IAAA,CAAK,YAAA,EAC3D,UAAA,GAAA;eAAO,OAAA,CAAQ,OAAK,IAAA,GAAO,UAAA,CAAW,GAAA,CAAA,CAAA;OAAA,CAC5C,CAAA;KACA;GACA,CAAA;;AChCA,MAAI,YAAA,GAAe,SAAf,YAAA,CAAyB,KAAA,EAAO,UAAA,EAAY,OAAA,EAAS,mBAAA,EAAqB;AAC5E,QAAA,CAAK,SAAA,GAAY,cAAA,CAAA;;AAEjB,QAAA,CAAK,QAAA,GAAW,CAAA,CAAE,KAAA,CAAA,CAAA;;;AAGlB,QAAI,WAAA,KAAgB,OAAO,mBAAA,EAAqB;AAC9C,UAAA,CAAK,MAAA,GAAS,mBAAA,CAAA;KAClB;;AAEE,QAAA,CAAK,OAAA,GAAU,OAAA,CAAA;AACf,QAAA,CAAK,UAAA,GAAa,UAAA,CAAA;;;AAGlB,QAAA,CAAK,WAAA,GAAc,EAAA,CAAA;AACnB,QAAA,CAAK,iBAAA,GAAoB,EAAA,CAAA;AACzB,QAAA,CAAK,gBAAA,GAAmB,IAAA,CAAA;;;AAGxB,QAAA,CAAK,gBAAA,EAAA,CAAA;GACP,CAAA;;AAEA,MA3BA,4BA2BiB,GAAG,EAAC,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,KAAA,EAAA,CAAA;;AAE9D,cAAA,CAAa,SAAA,GAAY;;;;;AAKvB,YAAA,EAAU,kBAAU,OAAA,EAAS;AAC3B,UAAI,SAAA,CAAU,MAAA,IAAU,CAAA,IAAK,CAAC,CAAA,CAAE,aAAA,CAAc,OAAA,CAAA,EAAU;AAnC5D,6BAoCkB,CAAC,QAAA,CAAS,2FAAA,CAAA,CAAA;AACtB,eAAA,GAAU,EAAC,OAAA,EAAA,OAAA,EAAA,CAAA;OACjB;AACI,UAAI,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,OAAA,CAAA,CAAA;AAChC,UAAI,CAAC,OAAA;AACH,eAAO,IAAA,CAAA;AACT,cAAQ,OAAA,CAAQ,KAAA,EAAA;AACd,aAAK,SAAA;AAAW,iBAAO,IAAA,CAAA;AAAA,AACvB,aAAK,UAAA;AAAY,iBAAO,IAAA,CAAA;AAAA,AACxB,aAAK,UAAA;AAAY,iBAAO,IAAA,CAAK,gBAAA,CAAA;AAAA,OACnC;KACA;;;;;AAKE,gBAAA,EAAc,wBAAgC;;;;wEAAJ,EAAA;;UAAjB,KAAA,SAAA,KAAA;UAAO,KAAA,SAAA,KAAA;;;AAE9B,UAAA,CAAK,kBAAA,EAAA,CAAA;AACL,UAAI,KAAA,IAAS,CAAC,IAAA,CAAK,UAAA,CAAW,KAAA,CAAA,EAC5B,OAAA;;AAEF,UAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,QAAA,EAAA,CAAA;;;AAGlB,UAAA,CAAK,QAAA,CAAS,UAAA,CAAA,CAAA;;AAEd,aAAO,sCAAA,IAAA,CAAK,SAAA,CAAU,EAAC,KAAA,EAAA,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,UAAA,EAAY,IAAA,EAAA,CAAA,CAC1D,MAAA,CAAO,YAAM;AAAE,eAAK,SAAA,EAAA,CAAA;OAAA,CAAA,CACpB,IAAA,CAAK,YAAQ;AAAE,eAAK,QAAA,CAAS,SAAA,CAAA,CAAA;OAAA,CAAA,CAC7B,IAAA,CAAK,YAAQ;AAAE,eAAK,QAAA,CAAS,OAAA,CAAA,CAAA;OAAA,CAAA,CAC7B,MAAA,CAAO,YAAM;AAAE,eAAK,QAAA,CAAS,WAAA,CAAA,CAAA;OAAA,CAAA,EAC7B,IAAA,MAAA,wDAAQ,IAAA,CAAK,gCAAA,EAAA,EAAA,CAAA;KACpB;;AAEE,kBAAA,EAAgB,0BAAY;AAC1B,aAAO,CAAA,KAAM,IAAA,CAAK,WAAA,CAAY,MAAA,CAAA;KAClC;;;AAGE,mBAAA,EAAiB,yBAAU,KAAA,EAAO;AAChC,UAAI,WAAA,KAAgB,OAAO,KAAA,EACzB,KAAA,GAAQ,IAAA,CAAK,QAAA,EAAA,CAAA;;;;AAIf,UAAI,CAAC,KAAA,CAAM,MAAA,IAAU,CAAC,IAAA,CAAK,WAAA,EAAA,IAAiB,WAAA,KAAgB,OAAO,IAAA,CAAK,OAAA,CAAQ,eAAA,EAC9E,OAAO,KAAA,CAAA;;AAET,aAAO,IAAA,CAAA;KACX;;AAEE,cAAA,EAAY,oBAAU,KAAA,EAAO;AAC3B,UAAI,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAA,EACzB,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAA,CAAA;AAC9C,aAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,KAAA,CAAA;KAClC;;;;;;AAME,WAAA,EAAS,iBAAU,OAAA,EAAS;AAC1B,UAAI,SAAA,CAAU,MAAA,IAAU,CAAA,IAAK,CAAC,CAAA,CAAE,aAAA,CAAc,OAAA,CAAA,EAAU;AAnG5D,6BAoGkB,CAAC,QAAA,CAAS,0FAAA,CAAA,CAAA;;sCACD,SAAA;;YAAhB,KAAA;YAAO,KAAA;;AACZ,eAAA,GAAU,EAAC,KAAA,EAAA,KAAA,EAAO,KAAA,EAAA,KAAA,EAAA,CAAA;OACxB;AACI,UAAI,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,OAAA,CAAA,CAAA;AAC7B,UAAI,CAAC,OAAA;AACH,eAAO,IAAA,CAAA;AACT,aA3GJ,4BA2GwB,CAAC,OAAA,CAAQ,KAAA,EAAA,CAAA,CAAA;KACjC;;;;;;;AAOE,aAAA,EAAW,qBAA0D;;;yEAAJ,EAAA;;gCAA3C,KAAA;UAAA,KAAA,gCAAQ,KAAA;UAAO,KAAA,UAAA,KAAA;UAAO,KAAA,UAAA,KAAA;UAAO,UAAA,UAAA,UAAA;;;AAEjD,UAAI,CAAC,UAAA,EACH,IAAA,CAAK,kBAAA,EAAA,CAAA;;AAEP,UAAI,KAAA,IAAS,CAAC,IAAA,CAAK,UAAA,CAAW,KAAA,CAAA,EAC5B,OAAA;;AAEF,UAAA,CAAK,gBAAA,GAAmB,IAAA,CAAA;;;AAGxB,UAAI,CAAC,IAAA,CAAK,cAAA,EAAA,EACR,OAAO,CAAA,CAAE,IAAA,EAAA,CAAA;;;AAGX,UAAI,WAAA,KAAgB,OAAO,KAAA,IAAS,IAAA,KAAS,KAAA,EAC3C,KAAA,GAAQ,IAAA,CAAK,QAAA,EAAA,CAAA;;AAEf,UAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,KAAA,CAAA,IAAU,IAAA,KAAS,KAAA,EAC3C,OAAO,CAAA,CAAE,IAAA,EAAA,CAAA;;AAEX,UAAI,kBAAA,GAAqB,IAAA,CAAK,sBAAA,EAAA,CAAA;AAC9B,UAAI,QAAA,GAAW,EAAA,CAAA;AACf,OAAA,CAAE,IAAA,CAAK,kBAAA,EAAoB,UAAC,CAAA,EAAG,WAAA,EAAgB;;;AAG7C,YAAI,OAAA,GA7IV,qBA6IgC,CAAC,GAAA,CACzB,CAAA,CAAE,GAAA,CAAI,WAAA,EAAa,UAAA,UAAA;iBAAc,QAAK,mBAAA,CAAoB,KAAA,EAAO,UAAA,CAAA;SAAA,CAAA,CACzE,CAAA;AACM,gBAAA,CAAS,IAAA,CAAK,OAAA,CAAA,CAAA;AACd,YAAI,OAAA,CAAQ,KAAA,EAAA,KAAY,UAAA,EACtB,OAAO,KAAA,CAAA;OACf,CAAA,CAAA;AACI,aApJJ,qBAoJuB,CAAC,GAAA,CAAI,QAAA,CAAA,CAAA;KAC5B;;;AAGE,uBAAA,EAAqB,6BAAS,KAAA,EAAO,UAAA,EAAY;;;AAC/C,UAAI,MAAA,GAAS,UAAA,CAAW,QAAA,CAAS,KAAA,EAAO,IAAA,CAAA,CAAA;;AAExC,UAAI,KAAA,KAAU,MAAA,EACZ,MAAA,GAAS,CAAA,CAAE,QAAA,EAAA,CAAW,MAAA,EAAA,CAAA;;AAExB,aA9JJ,qBA8JuB,CAAC,GAAA,CAAI,CAAC,MAAA,CAAA,CAAA,CAAS,IAAA,CAAK,UAAA,YAAA,EAAgB;AACrD,YAAI,EAAE,QAAK,gBAAA,YAA4B,KAAA,CAAA,EACrC,QAAK,gBAAA,GAAmB,EAAA,CAAA;AAC1B,gBAAK,gBAAA,CAAiB,IAAA,CAAK;AACzB,gBAAA,EAAQ,UAAA;AACR,sBAAA,EAAc,QAAA,KAAa,OAAO,YAAA,IAAgB,YAAA;SAC1D,CAAA,CAAA;OACA,CAAA,CAAA;KACA;;;AAGE,YAAA,EAAU,oBAAY;AACpB,UAAI,KAAA,CAAA;;;AAGJ,UAAI,UAAA,KAAe,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EACrC,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAA,CAAA,KACxB,IAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAC3C,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAA,KAErB,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,GAAA,EAAA,CAAA;;;AAGxB,UAAI,WAAA,KAAgB,OAAO,KAAA,IAAS,IAAA,KAAS,KAAA,EAC3C,OAAO,EAAA,CAAA;;AAET,aAAO,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAA,CAAA;KAClC;;;;AAIE,sBAAA,EAAoB,8BAAY;AAC9B,aAAO,IAAA,CAAK,gBAAA,EAAA,CAAmB,gBAAA,EAAA,CAAA;KACnC;;;;;;;;;;AAUE,iBAAA,EAAe,uBAAU,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,eAAA,EAAiB;;AAEtE,UAAI,MAAA,CAAO,OAAA,CAAQ,kBAAA,CAAmB,UAAA,CAAW,IAAA,CAAA,EAAO;AACtD,YAAI,UAAA,GAAa,IAAI,iBAAA,CAAkB,IAAA,EAAM,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,eAAA,CAAA,CAAA;;;AAG3E,YAAI,WAAA,KAAgB,IAAA,CAAK,iBAAA,CAAkB,UAAA,CAAW,IAAA,CAAA,EACpD,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,IAAA,CAAA,CAAA;;AAEnC,YAAA,CAAK,WAAA,CAAY,IAAA,CAAK,UAAA,CAAA,CAAA;AACtB,YAAA,CAAK,iBAAA,CAAkB,UAAA,CAAW,IAAA,CAAA,GAAQ,UAAA,CAAA;OAChD;;AAEI,aAAO,IAAA,CAAA;KACX;;;AAGE,oBAAA,EAAkB,0BAAU,IAAA,EAAM;AAChC,WAAK,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,CAAA,EAAA,EAC3C,IAAI,IAAA,KAAS,IAAA,CAAK,WAAA,CAAY,CAAA,CAAA,CAAG,IAAA,EAAM;AACrC,YAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAA,EAAG,CAAA,CAAA,CAAA;AAC3B,cAAA;OACR;AACI,aAAO,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAA,CAAA;AAC9B,aAAO,IAAA,CAAA;KACX;;;AAGE,oBAAA,EAAkB,0BAAU,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU;AACtD,aAAO,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAA,CAC1B,aAAA,CAAc,IAAA,EAAM,UAAA,EAAY,QAAA,CAAA,CAAA;KACvC;;;;;;AAME,oBAAA,EAAkB,4BAAY;AAC5B,UAAI,WAAA,GAAc,EAAA,CAAA;AAClB,UAAI,iBAAA,GAAoB,EAAA,CAAA;;;AAGxB,WAAK,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,CAAA,EAAA,EAC3C,IAAI,KAAA,KAAU,IAAA,CAAK,WAAA,CAAY,CAAA,CAAA,CAAG,eAAA,EAAiB;AACjD,mBAAA,CAAY,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,CAAA,CAAA,CAAA,CAAA;AAClC,yBAAA,CAAkB,IAAA,CAAK,WAAA,CAAY,CAAA,CAAA,CAAG,IAAA,CAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,CAAA,CAAA,CAAA;OACvE;;AAEI,UAAA,CAAK,WAAA,GAAc,WAAA,CAAA;AACnB,UAAA,CAAK,iBAAA,GAAoB,iBAAA,CAAA;;;AAGzB,WAAK,IAAI,IAAA,IAAQ,IAAA,CAAK,OAAA,EACpB,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAA,EAAO,SAAA,EAAW,IAAA,CAAA,CAAA;;;AAG1D,aAAO,IAAA,CAAK,qBAAA,EAAA,CAAA;KAChB;;;;AAIE,yBAAA,EAAuB,iCAAY;;AAEjC,UAAI,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,UAAA,CAAA,IAAe,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,UAAA,CAAA,EAC3D,IAAA,CAAK,aAAA,CAAc,UAAA,EAAY,IAAA,EAAM,SAAA,EAAW,IAAA,CAAA,CAAA;;;AAGlD,UAAI,QAAA,KAAa,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,SAAA,CAAA,EACzC,IAAA,CAAK,aAAA,CAAc,SAAA,EAAW,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,SAAA,CAAA,EAAY,SAAA,EAAW,IAAA,CAAA,CAAA;;;AAG1E,UAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAA,CAAA,IAAU,WAAA,KAAgB,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAA,CAAA,EAChG,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,CAAC,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAA,CAAA,EAAQ,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAA,CAAA,CAAA,EAAS,SAAA,EAAW,IAAA,CAAA,CAAA;;;WAG5F,IAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAA,CAAA,EACjD,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAA,CAAA,EAAQ,SAAA,EAAW,IAAA,CAAA,CAAA;;;aAG7D,IAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAA,CAAA,EACjD,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAA,CAAA,EAAQ,SAAA,EAAW,IAAA,CAAA,CAAA;;;AAIlE,UAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,WAAA,CAAA,IAAgB,WAAA,KAAgB,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,WAAA,CAAA,EACtG,IAAA,CAAK,aAAA,CAAc,QAAA,EAAU,CAAC,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,WAAA,CAAA,EAAc,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,WAAA,CAAA,CAAA,EAAe,SAAA,EAAW,IAAA,CAAA,CAAA;;;WAGzG,IAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,WAAA,CAAA,EACjD,IAAA,CAAK,aAAA,CAAc,WAAA,EAAa,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,WAAA,CAAA,EAAc,SAAA,EAAW,IAAA,CAAA,CAAA;;;aAGzE,IAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,WAAA,CAAA,EACjD,IAAA,CAAK,aAAA,CAAc,WAAA,EAAa,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,WAAA,CAAA,EAAc,SAAA,EAAW,IAAA,CAAA,CAAA;;;AAI9E,UAAI,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,CAAA,CAAA;;AAE9B,UAAI,WAAA,KAAgB,OAAO,IAAA,EACzB,OAAO,IAAA,CAAA;;;AAGT,UAAI,QAAA,KAAa,IAAA,EAAM;AACrB,eAAO,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,CAAC,QAAA,EAAU;AAC3C,cAAA,EAAM,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,CAAA;AACzB,cAAA,EAAM,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAA,CAAA,IAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,OAAA,CAAA;SAC9D,CAAA,EAAU,SAAA,EAAW,IAAA,CAAA,CAAA;;OAErB,MAAW,IAAI,sBAAA,CAAuB,IAAA,CAAK,IAAA,CAAA,EAAO;AAC5C,iBAAO,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,IAAA,CAAA,CAAA;SACzD;AACI,aAAO,IAAA,CAAA;KACX;;;;AAIE,eAAA,EAAa,uBAAY;AACvB,UAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,iBAAA,CAAkB,QAAA,EAChD,OAAO,KAAA,CAAA;;AAET,aAAO,KAAA,KAAU,IAAA,CAAK,iBAAA,CAAkB,QAAA,CAAS,YAAA,CAAA;KACrD;;;;AAIE,YAAA,EAAU,kBAAU,SAAA,EAAW;AAC7B,aAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,GAAW,SAAA,CAAA,CAAA;KACnC;;;;;;AAME,qBAAA,EAAmB,2BAAU,KAAA,EAAO;AAClC,UAAI,IAAA,KAAS,IAAA,CAAK,OAAA,CAAQ,SAAA,EAhV9B,qBAiVkB,CAAC,QAAA,CAAS,yFAAA,CAAA,CAAA;;AAExB,UAAI,QAAA,KAAa,IAAA,CAAK,OAAA,CAAQ,UAAA,EAC5B,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,SAAA,EAAW,GAAA,CAAA,CAAA;;AAEnC,UAAI,AAAC,MAAA,KAAW,IAAA,CAAK,OAAA,CAAQ,UAAA,IAAgB,QAAA,KAAa,IAAA,CAAK,OAAA,CAAQ,UAAA,IAAgB,IAAA,KAAS,IAAA,CAAK,OAAA,CAAQ,SAAA,EAC3G,KAAA,GAvVN,qBAuV0B,CAAC,UAAA,CAAW,KAAA,CAAA,CAAA;;AAElC,aAAO,KAAA,CAAA;KACX;;;;;AAKE,0BAAA,EAAwB,kCAAY;AAClC,UAAI,KAAA,KAAU,IAAA,CAAK,OAAA,CAAQ,eAAA,EACzB,OAAO,CAAC,IAAA,CAAK,WAAA,CAAA,CAAA;;AAEf,UAAI,kBAAA,GAAqB,EAAA,CAAA;AACzB,UAAI,KAAA,GAAQ,EAAA,CAAA;;;AAGZ,WAAK,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,CAAA,EAAA,EAAK;AAChD,YAAI,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,CAAA,CAAA,CAAG,QAAA,CAAA;AAC5B,YAAI,CAAC,KAAA,CAAM,CAAA,CAAA,EACT,kBAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,CAAA,CAAA,GAAK,EAAA,CAAA,CAAA;AACrC,aAAA,CAAM,CAAA,CAAA,CAAG,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,CAAA,CAAA,CAAA,CAAA;OACrC;;AAEI,wBAAA,CAAmB,IAAA,CAAK,UAAU,CAAA,EAAG,CAAA,EAAG;AAAE,eAAO,CAAA,CAAE,CAAA,CAAA,CAAG,QAAA,GAAW,CAAA,CAAE,CAAA,CAAA,CAAG,QAAA,CAAA;OAAA,CAAA,CAAA;;AAEtE,aAAO,kBAAA,CAAA;KACX;;GAjXA,CAAA;;AAAA,MAAA,aAAA,GAAA,YAAA,CAAA;;ACEA,MAAI,eAAA,GAAkB,SAAlB,eAAA,GAA8B;AAChC,QAAA,CAAK,SAAA,GAAY,sBAAA,CAAA;GACnB,CAAA;;AAEA,iBAAA,CAAgB,SAAA,GAAY;;AAE1B,cAAA,EAAY,oBAAU,QAAA,EAAU;AAC9B,UAAA,CAAK,SAAA,CAAU,IAAA,CAAK,QAAA,CAAA,CAAA;;AAEpB,aAAO,IAAA,CAAA;KACX;;;AAGE,sBAAA,EAAoB,8BAAY;AAC9B,UAAI,gBAAA,CAAA;;AAEJ,UAAA,CAAK,WAAA,GAAc,EAAA,CAAA;;;AAGnB,UAAI,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,QAAA,CAAA,EAAW;AAC9B,YAAA,CAAK,gBAAA,EAAA,CAAmB,gBAAA,EAAA,CAAA;;AAExB,eAAO,IAAA,CAAA;OACb;;;AAGI,WAAK,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAA,EAAK;;;AAG9C,YAAI,CAAC,CAAA,CAAE,MAAA,CAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,CAAA,CAAA,CAAA,CAAI,MAAA,EAAQ;AAC5C,cAAA,CAAK,SAAA,CAAU,MAAA,CAAO,CAAA,EAAG,CAAA,CAAA,CAAA;AACzB,mBAAA;SACR;;AAEM,wBAAA,GAAmB,IAAA,CAAK,SAAA,CAAU,CAAA,CAAA,CAAG,IAAA,CAAK,sBAAA,CAAA,CAAwB,kBAAA,EAAA,CAAqB,WAAA,CAAA;;AAEvF,aAAK,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,gBAAA,CAAiB,MAAA,EAAQ,CAAA,EAAA,EAC3C,IAAA,CAAK,aAAA,CAAc,gBAAA,CAAiB,CAAA,CAAA,CAAG,IAAA,EAAM,gBAAA,CAAiB,CAAA,CAAA,CAAG,YAAA,EAAc,gBAAA,CAAiB,CAAA,CAAA,CAAG,QAAA,EAAU,gBAAA,CAAiB,CAAA,CAAA,CAAG,eAAA,CAAA,CAAA;OACzI;;AAEI,aAAO,IAAA,CAAA;KACX;;;AAGE,YAAA,EAAU,oBAAY;;AAEpB,UAAI,UAAA,KAAe,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EACrC,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAA,CAAA,KACvB,IAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAC3C,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAA;;;AAGtB,UAAI,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,mBAAA,CAAA,EACnB,OAAO,IAAA,CAAK,YAAA,EAAA,CAAe,MAAA,CAAO,UAAA,CAAA,CAAY,GAAA,EAAA,IAAS,EAAA,CAAA;;;AAGzD,UAAI,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,sBAAA,CAAA,EAAyB;AAC5C,YAAI,MAAA,GAAS,EAAA,CAAA;;AAEb,YAAA,CAAK,YAAA,EAAA,CAAe,MAAA,CAAO,UAAA,CAAA,CAAY,IAAA,CAAK,YAAY;AACtD,gBAAA,CAAO,IAAA,CAAK,CAAA,CAAE,IAAA,CAAA,CAAM,GAAA,EAAA,CAAA,CAAA;SAC5B,CAAA,CAAA;;AAEM,eAAO,MAAA,CAAA;OACb;;;AAGI,UAAI,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,QAAA,CAAA,IAAa,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,GAAA,EAAA,EACvD,OAAO,EAAA,CAAA;;;AAGT,aAAO,IAAA,CAAK,QAAA,CAAS,GAAA,EAAA,CAAA;KACzB;;AAEE,SAAA,EAAO,iBAAY;AACjB,UAAA,CAAK,SAAA,GAAY,CAAC,IAAA,CAAK,QAAA,CAAA,CAAA;;AAEvB,aAAO,IAAA,CAAA;KACX;GACA,CAAA;;AC1EA,MAAI,cAAA,GAAiB,SAAjB,cAAA,CAA2B,OAAA,EAAS,OAAA,EAAS,mBAAA,EAAqB;AACpE,QAAA,CAAK,QAAA,GAAW,CAAA,CAAE,OAAA,CAAA,CAAA;;;AAGlB,QAAI,wBAAA,GAA2B,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,SAAA,CAAA,CAAA;AAClD,QAAI,wBAAA,EAA0B;;;AAG5B,UAAI,WAAA,KAAgB,OAAO,mBAAA,IAAuB,wBAAA,CAAyB,MAAA,KAAW,MAAA,CAAO,OAAA,EAAS;AACpG,gCAAA,CAAyB,MAAA,GAAS,mBAAA,CAAA;AAClC,gCAAA,CAAyB,aAAA,CAAc,wBAAA,CAAyB,OAAA,CAAA,CAAA;OACtE;;AAEI,UAAI,QAAA,KAAa,OAAO,OAAA,EAAS;AAC/B,SAAA,CAAE,MAAA,CAAO,wBAAA,CAAyB,OAAA,EAAS,OAAA,CAAA,CAAA;OACjD;;AAEI,aAAO,wBAAA,CAAA;KACX;;;AAGE,QAAI,CAAC,IAAA,CAAK,QAAA,CAAS,MAAA,EACjB,MAAM,IAAI,KAAA,CAAM,+CAAA,CAAA,CAAA;;AAElB,QAAI,WAAA,KAAgB,OAAO,mBAAA,IAAuB,aAAA,KAAkB,mBAAA,CAAoB,SAAA,EACtF,MAAM,IAAI,KAAA,CAAM,gDAAA,CAAA,CAAA;;AAElB,QAAA,CAAK,MAAA,GAAS,mBAAA,IAAuB,MAAA,CAAO,OAAA,CAAA;AAC5C,WAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAA,CAAA;GACnB,CAAA;;AAEA,gBAAA,CAAe,SAAA,GAAY;AACzB,QAAA,EAAM,cAAU,OAAA,EAAS;AACvB,UAAA,CAAK,SAAA,GAAY,SAAA,CAAA;AACjB,UAAA,CAAK,WAAA,GAAc,OAAA,CAAA;AACnB,UAAA,CAAK,MAAA,GA1CT,qBA0C8B,CAAC,UAAA,EAAA,CAAA;;;AAG3B,UAAA,CAAK,aAAA,CAAc,OAAA,CAAA,CAAA;;;AAGnB,UAAI,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,MAAA,CAAA,IAhDzB,qBAgDiD,CAAC,SAAA,CAAU,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,UAAA,CAAA,IAAe,CAAC,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAA,EAC3I,OAAO,IAAA,CAAK,IAAA,CAAK,aAAA,CAAA,CAAA;;;AAGnB,aAAO,IAAA,CAAK,UAAA,EAAA,GAAe,IAAA,CAAK,cAAA,EAAA,GAAmB,IAAA,CAAK,IAAA,CAAK,cAAA,CAAA,CAAA;KACjE;;AAEE,cAAA,EAAY,sBAAY;AACtB,aAAO,AAAC,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,yCAAA,CAAA,IAAgD,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,QAAA,CAAA,IAAa,WAAA,KAAgB,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,UAAA,CAAA,CAAA;KACrJ;;;;AAIE,kBAAA,EAAgB,0BAAY;;;AAC1B,UAAI,IAAA,CAAA;AACJ,UAAI,QAAA,CAAA;AACJ,UAAI,uBAAA,CAAA;;;AAGJ,UAAI,IAAA,CAAK,OAAA,CAAQ,QAAA,EACf,CAAA;WACG,IAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,CAAA,IAAW,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,CAAA,CAAQ,MAAA,EACvF,IAAA,CAAK,OAAA,CAAQ,QAAA,GAAW,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAA,CAAA,CAAA,KAC/C,IAAI,WAAA,KAAgB,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,CAAA,IAAS,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,CAAA,CAAM,MAAA,EACnF,IAAA,CAAK,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,CAAA,CAAA;;;AAG7C,UAAI,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,QAAA,CAAA,IAAa,WAAA,KAAgB,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,UAAA,CAAA,EAAa;AACvF,YAAA,CAAK,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,QAAA,IAAY,IAAA,CAAK,MAAA,CAAA;AACtD,eAAO,IAAA,CAAK,IAAA,CAAK,sBAAA,CAAA,CAAA;;;OAGvB,MAAW,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU;AAhFvC,+BAiFkB,CAAC,IAAA,CAAK,uHAAA,EAAyH,IAAA,CAAK,QAAA,CAAA,CAAA;AAChJ,iBAAO,IAAA,CAAA;SACb;;;AAGI,UAAA,CAAK,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,OAAA,CAAQ,wBAAA,EAA0B,EAAA,CAAA,CAAA;;;AAGhF,UAAI,WAAA,KAAgB,OAAO,IAAA,EAAM;AAC/B,SAAA,CAAE,cAAA,GAAiB,IAAA,GAAO,IAAA,CAAA,CAAM,IAAA,CAAK,UAAC,CAAA,EAAG,KAAA,EAAU;AACjD,cAAI,CAAA,CAAE,KAAA,CAAA,CAAO,EAAA,CAAG,yCAAA,CAAA,EACd,CAAA,CAAE,KAAA,CAAA,CAAO,IAAA,CAAK,QAAK,OAAA,CAAQ,SAAA,GAAY,UAAA,EAAY,QAAK,OAAA,CAAQ,QAAA,CAAA,CAAA;SAC1E,CAAA,CAAA;OACA;;;AAGI,UAAI,kBAAA,GAAqB,IAAA,CAAK,YAAA,EAAA,CAAA;AAC9B,WAAK,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,kBAAA,CAAmB,MAAA,EAAQ,CAAA,EAAA,EAAK;AAClD,+BAAA,GAA0B,CAAA,CAAE,kBAAA,CAAmB,GAAA,CAAI,CAAA,CAAA,CAAA,CAAI,IAAA,CAAK,SAAA,CAAA,CAAA;AAC5D,YAAI,WAAA,KAAgB,OAAO,uBAAA,EAAyB;;AAElD,cAAI,CAAC,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,sBAAA,CAAA,EAAyB;AAC/C,mCAAA,CAAwB,UAAA,CAAW,IAAA,CAAK,QAAA,CAAA,CAAA;WAClD;;AAEQ,gBAAA;SACR;OACA;;;;AAII,UAAA,CAAK,IAAA,CAAK,cAAA,EAAgB,IAAA,CAAA,CAAA;;AAE1B,aAAO,uBAAA,IAA2B,IAAA,CAAK,IAAA,CAAK,sBAAA,CAAA,CAAA;KAChD;;;AAGE,QAAA,EAAM,cAAU,IAAA,EAAM,UAAA,EAAY;AAChC,UAAI,eAAA,CAAA;;AAEJ,cAAQ,IAAA;AACN,aAAK,aAAA;AACH,yBAAA,GAAkB,CAAA,CAAE,MAAA,CAClB,IAAI,WAAA,CAAY,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,OAAA,CAAA,EACrD,IAAI,eAAA,EAAA,EACJ,MAAA,CAAO,aAAA,CACjB,CAAU,WAAA,EAAA,CAAA;AACF,gBAAA;AAAA,AACF,aAAK,cAAA;AACH,yBAAA,GAAkB,CAAA,CAAE,MAAA,CAClB,IAnIV,aAmI0B,CAAC,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,MAAA,CAAA,EACpE,IAAI,eAAA,EAAA,EACJ,MAAA,CAAO,aAAA,CACjB,CAAA;AACQ,gBAAA;AAAA,AACF,aAAK,sBAAA;AACH,yBAAA,GAAkB,CAAA,CAAE,MAAA,CAClB,IA1IV,aA0I0B,CAAC,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,MAAA,CAAA,EACpE,IAAI,eAAA,EAAA,EACJ,IAAI,eAAA,EAAA,EACJ,MAAA,CAAO,aAAA,CACjB,CAAU,KAAA,EAAA,CAAA;AACF,gBAAA;AAAA,AACF;AACE,gBAAM,IAAI,KAAA,CAAM,IAAA,GAAO,iCAAA,CAAA,CAAA;AAAA,OAC/B;;AAEI,UAAI,IAAA,CAAK,OAAA,CAAQ,QAAA,EApJrB,qBAqJkB,CAAC,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,UAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAA,CAAA;;AAEvF,UAAI,WAAA,KAAgB,OAAO,UAAA,EAAY;AACrC,YAAA,CAAK,QAAA,CAAS,IAAA,CAAK,sBAAA,EAAwB,eAAA,CAAA,CAAA;;AAE3C,eAAO,eAAA,CAAA;OACb;;;AAGI,UAAA,CAAK,QAAA,CAAS,IAAA,CAAK,SAAA,EAAW,eAAA,CAAA,CAAA;;;AAG9B,qBAAA,CAAgB,kBAAA,EAAA,CAAA;AAChB,qBAAA,CAAgB,QAAA,CAAS,MAAA,CAAA,CAAA;;AAEzB,aAAO,eAAA,CAAA;KACX;GACA,CAAA;;AC3JA,MAAI,OAAA,GAAU,CAAA,CAAE,EAAA,CAAG,MAAA,CAAO,KAAA,CAAM,GAAA,CAAA,CAAA;AAChC,MAAI,QAAA,CAAS,OAAA,CAAQ,CAAA,CAAA,CAAA,IAAO,CAAA,IAAK,QAAA,CAAS,OAAA,CAAQ,CAAA,CAAA,CAAA,GAAM,CAAA,EAAG;AACzD,UAAM,6EAAA,CAAA;GACR;AACA,MAAI,CAAC,OAAA,CAAQ,OAAA,EAAS;AAftB,yBAgBc,CAAC,IAAA,CAAK,2FAAA,CAAA,CAAA;GACpB;;AAEA,MAAI,OAAA,GAAU,CAAA,CAAE,MAAA,CAAO,IAAI,eAAA,EAAA,EAAmB;AAC1C,YAAA,EAAU,CAAA,CAAE,QAAA,CAAA;AACZ,oBAAA,EAAkB,IAAA;AAClB,iBAAA,EAAe,IAAA;AACf,WAAA,EAAS,cAAA;AACT,WAAA,EAAS,OAAA;GACb,CAAA,CAAA;;;;AAIA,GAAA,CAAE,MAAA,CA7BF,aA6BqB,CAAC,SAAA,EAAW,SAAA,CAAU,KAAA,EAAO,eAAA,CAAgB,SAAA,CAAA,CAAA;AAClE,GAAA,CAAE,MAAA,CAAO,WAAA,CAAY,SAAA,EAAW,SAAA,CAAU,IAAA,EAAM,eAAA,CAAgB,SAAA,CAAA,CAAA;;AAEhE,GAAA,CAAE,MAAA,CAAO,cAAA,CAAe,SAAA,EAAW,eAAA,CAAgB,SAAA,CAAA,CAAA;;;;AAInD,GAAA,CAAE,EAAA,CAAG,OAAA,GAAU,CAAA,CAAE,EAAA,CAAG,IAAA,GAAO,UAAU,OAAA,EAAS;AAC5C,QAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACnB,UAAI,SAAA,GAAY,EAAA,CAAA;;AAEhB,UAAA,CAAK,IAAA,CAAK,YAAY;AACpB,iBAAA,CAAU,IAAA,CAAK,CAAA,CAAE,IAAA,CAAA,CAAM,OAAA,CAAQ,OAAA,CAAA,CAAA,CAAA;OACrC,CAAA,CAAA;;AAEI,aAAO,SAAA,CAAA;KACX;;;AAGE,QAAI,CAAC,CAAA,CAAE,IAAA,CAAA,CAAM,MAAA,EAAQ;AAhDvB,2BAiDgB,CAAC,IAAA,CAAK,+CAAA,CAAA,CAAA;;AAElB,aAAA;KACJ;;AAEE,WAAO,IAAI,cAAA,CAAe,IAAA,EAAM,OAAA,CAAA,CAAA;GAClC,CAAA;;;;AAIA,MAAI,WAAA,KAAgB,OAAO,MAAA,CAAO,aAAA,EAChC,MAAA,CAAO,aAAA,GAAgB,EAAA,CAAA;;;;AAIzB,SAAA,CAAQ,OAAA,GAAU,CAAA,CAAE,MAAA,CAhEpB,qBAgEuC,CAAC,YAAA,CAAa,eAAA,CAAA,EAAkB,MAAA,CAAO,aAAA,CAAA,CAAA;AAC9E,QAAA,CAAO,aAAA,GAAgB,OAAA,CAAQ,OAAA,CAAA;;;AAG/B,QAAA,CAAO,OAAA,GAAU,MAAA,CAAO,IAAA,GAAO,OAAA,CAAA;AAC/B,QAAA,CAAO,YAAA,GArEP,qBAqEkC,CAAA;;;AAGlC,MAAI,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,kBAAA,GAAqB,IAAI,wBAAA,CAAyB,MAAA,CAAO,aAAA,CAAc,UAAA,EAAY,MAAA,CAAO,aAAA,CAAc,IAAA,CAAA,CAAA;AACtI,QAAA,CAAO,gBAAA,GAAmB,EAAA,CAAA;AAC1B,GAAA,CAAE,IAAA,CAAK,wHAAA,CAAyH,KAAA,CAAM,GAAA,CAAA,EAAM,UAAU,CAAA,EAAG,MAAA,EAAQ;AAC/J,UAAA,CAAO,OAAA,CAAQ,MAAA,CAAA,GAAU,CAAA,CAAE,KAAA,CAAM,QAAA,EAAU,MAAA,CAAA,CAAA;AAC3C,UAAA,CAAO,gBAAA,CAAiB,MAAA,CAAA,GAAU,YAAY;;;AA5EhD,2BA6EgB,CAAC,QAAA,6BAAkC,MAAA,gFAA+E,MAAA,aAAO,CAAA;AACrI,aAAO,mBAAA,MAAA,CAAO,OAAA,EAAQ,MAAA,OAAA,kBAAW,SAAA,CAAA,CAAA;KACrC,CAAA;GACA,CAAA,CAAA;;;;AAIA,QAAA,CAAO,OAAA,CAAQ,EAAA,GAAK,SAAA,CAAA;AACpB,QAAA,CAAO,SAAA,GAAY;AACjB,eAAA,EAAa,qBAAU,QAAA,EAAU,IAAA,EAAM,gBAAA,EAAkB;AACvD,UAAI,WAAA,GAAc,IAAA,KAAS,gBAAA,CAAA;AAvF/B,2BAwFgB,CAAC,QAAA,uJAAU,CAAA;AACvB,aAAO,QAAA,CAAS,WAAA,CAAY,IAAA,EAAM,EAAC,WAAA,EAAA,WAAA,EAAA,CAAA,CAAA;KACvC;AACE,qBAAA,EAAmB,2BAAU,QAAA,EAAU;AA3FzC,2BA4FgB,CAAC,QAAA,2FAAU,CAAA;AACvB,aAAO,QAAA,CAAS,iBAAA,EAAA,CAAA;KACpB;GACA,CAAA;AACA,GAAA,CAAE,IAAA,CAAK,sBAAA,CAAuB,KAAA,CAAM,GAAA,CAAA,EAAM,UAAU,CAAA,EAAG,MAAA,EAAQ;AAC7D,UAAA,CAAO,SAAA,CAAU,MAAA,CAAA,GAAU,UAAU,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,gBAAA,EAAkB;AACtF,UAAI,WAAA,GAAc,IAAA,KAAS,gBAAA,CAAA;AAlG/B,2BAmGgB,CAAC,QAAA,gDAAqD,MAAA,oGAAO,CAAA;AACzE,aAAO,QAAA,CAAS,MAAA,CAAA,CAAQ,IAAA,EAAM,EAAC,OAAA,EAAA,OAAA,EAAS,MAAA,EAAA,MAAA,EAAQ,WAAA,EAAA,WAAA,EAAA,CAAA,CAAA;KACpD,CAAA;GACA,CAAA,CAAA;;;;AAIA,MAAI,KAAA,KAAU,MAAA,CAAO,aAAA,CAAc,QAAA,EAAU;AAC3C,KAAA,CAAE,YAAY;;AAEZ,UAAI,CAAA,CAAE,yBAAA,CAAA,CAA2B,MAAA,EAC/B,CAAA,CAAE,yBAAA,CAAA,CAA2B,OAAA,EAAA,CAAA;KACnC,CAAA,CAAA;GACA;;AC3GA,MAAI,CAAA,GAAI,CAAA,CAAE,EAAA,CAAA,CAAA;AACV,MAAI,UAAA,GAAa,SAAb,UAAA,GAAyB;AAN7B,yBAOc,CAAC,QAAA,CAAS,8GAAA,CAAA,CAAA;GACxB,CAAA;;;AAGA,WAAS,KAAA,CAAM,EAAA,EAAI,OAAA,EAAS;;AAE1B,QAAI,CAAC,EAAA,CAAG,sBAAA,EAAwB;AAC9B,QAAA,CAAG,sBAAA,GAAyB,YAAY;AACtC,YAAI,IAAA,GAAO,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,CAAA,CAAA,CAAA;AACjD,YAAA,CAAK,OAAA,CAAQ,IAAA,CAAA,CAAA;AACb,UAAA,CAAG,KAAA,CAAM,OAAA,IAAW,CAAA,EAAG,IAAA,CAAA,CAAA;OAC7B,CAAA;KACA;AACE,WAAO,EAAA,CAAG,sBAAA,CAAA;GACZ;;AAEA,MAAI,WAAA,GAAc,UAAA,CAAA;;AAElB,WAAS,SAAA,CAAU,IAAA,EAAM;AACvB,QAAI,IAAA,CAAK,WAAA,CAAY,WAAA,EAAa,CAAA,CAAA,KAAO,CAAA,EACvC,OAAO,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,MAAA,CAAA,CAAA;AACjC,WAAO,IAAA,CAAA;GACT;;;AAGA,GAAA,CAAE,MAAA,GAAS,UAAU,IAAA,EAAM,QAAA,EAAU;AACnC,QAAI,OAAA,CAAA;AACJ,cAAA,EAAA,CAAA;AACA,QAAI,QAAA,KAAa,OAAO,SAAA,CAAU,CAAA,CAAA,IAAM,UAAA,KAAe,OAAO,SAAA,CAAU,CAAA,CAAA,EAAI;AAC1E,aAAA,GAAU,SAAA,CAAU,CAAA,CAAA,CAAA;AACpB,cAAA,GAAW,SAAA,CAAU,CAAA,CAAA,CAAA;KACzB;;AAEE,QAAI,UAAA,KAAe,OAAO,QAAA,EACxB,MAAM,IAAI,KAAA,CAAM,kBAAA,CAAA,CAAA;;AAElB,UAAA,CAAO,OAAA,CAAQ,EAAA,CAAG,SAAA,CAAU,IAAA,CAAA,EAAO,KAAA,CAAM,QAAA,EAAU,OAAA,CAAA,CAAA,CAAA;GACrD,CAAA;;AAEA,GAAA,CAAE,QAAA,GAAW,UAAU,QAAA,EAAU,IAAA,EAAM,EAAA,EAAI;AACzC,cAAA,EAAA,CAAA;AACA,QAAI,EAAE,QAAA,YAhDR,aAgDwC,CAAA,IAAK,EAAE,QAAA,YAAoB,WAAA,CAAA,EAC/D,MAAM,IAAI,KAAA,CAAM,4BAAA,CAAA,CAAA;;AAElB,QAAI,QAAA,KAAa,OAAO,IAAA,IAAQ,UAAA,KAAe,OAAO,EAAA,EACpD,MAAM,IAAI,KAAA,CAAM,kBAAA,CAAA,CAAA;;AAElB,YAAA,CAAS,EAAA,CAAG,SAAA,CAAU,IAAA,CAAA,EAAO,KAAA,CAAM,EAAA,CAAA,CAAA,CAAA;GACrC,CAAA;;AAEA,GAAA,CAAE,WAAA,GAAc,UAAU,IAAA,EAAM,EAAA,EAAI;AAClC,cAAA,EAAA,CAAA;AACA,QAAI,QAAA,KAAa,OAAO,IAAA,IAAQ,UAAA,KAAe,OAAO,EAAA,EACpD,MAAM,IAAI,KAAA,CAAM,iBAAA,CAAA,CAAA;AAClB,UAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,IAAA,CAAA,EAAO,EAAA,CAAG,sBAAA,CAAA,CAAA;GACzC,CAAA;;AAEA,GAAA,CAAE,aAAA,GAAgB,UAAU,QAAA,EAAU,IAAA,EAAM;AAC1C,cAAA,EAAA,CAAA;AACA,QAAI,EAAE,QAAA,YAlER,aAkEwC,CAAA,IAAK,EAAE,QAAA,YAAoB,WAAA,CAAA,EAC/D,MAAM,IAAI,KAAA,CAAM,4BAAA,CAAA,CAAA;AAClB,YAAA,CAAS,GAAA,CAAI,SAAA,CAAU,IAAA,CAAA,CAAA,CAAA;GACzB,CAAA;;AAEA,GAAA,CAAE,cAAA,GAAiB,UAAU,IAAA,EAAM;AACjC,cAAA,EAAA,CAAA;AACA,UAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,IAAA,CAAA,CAAA,CAAA;AAC7B,KAAA,CAAE,4BAAA,CAAA,CAA8B,IAAA,CAAK,YAAY;AAC/C,UAAI,QAAA,GAAW,CAAA,CAAE,IAAA,CAAA,CAAM,IAAA,CAAK,SAAA,CAAA,CAAA;AAC5B,UAAI,QAAA,EAAU;AACZ,gBAAA,CAAS,GAAA,CAAI,SAAA,CAAU,IAAA,CAAA,CAAA,CAAA;OAC7B;KACA,CAAA,CAAA;GACA,CAAA;;;AAGA,GAAA,CAAE,IAAA,GAAO,UAAU,IAAA,EAAM,QAAA,EAAU;;;AACjC,cAAA,EAAA,CAAA;AACA,QAAI,aAAA,GAAgB,AAAC,QAAA,YArFvB,aAqFuD,IAAM,QAAA,YAAoB,WAAA,CAAA;AAC/E,QAAI,IAAA,GAAO,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,aAAA,GAAgB,CAAA,GAAI,CAAA,CAAA,CAAA;AACrE,QAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAA,CAAA,CAAA;AACvB,QAAI,CAAC,aAAA,EAAe;AAClB,cAAA,GAAW,MAAA,CAAO,OAAA,CAAA;KACtB;AACE,iBAAA,QAAA,EAAS,OAAA,MAAA,+BAAW,IAAA,EAAA,CAAA;GACtB,CAAA;;AA5FA,MAAA,MAAA,GA8Fe,EAAA,CAAA;;AC1Ff,GAAA,CAAE,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS;AACtB,mBAAA,EAAiB;AACf,eAAA,EAAW;AACT,UAAA,EAAI,YAAU,GAAA,EAAK;;;;;AAKjB,iBAAO,GAAA,CAAI,MAAA,IAAU,GAAA,IAAO,GAAA,CAAI,MAAA,GAAS,GAAA,CAAA;SACjD;AACM,WAAA,EAAK,KAAA;OACX;AACI,aAAA,EAAS;AACP,UAAA,EAAI,YAAU,GAAA,EAAK;;AAEjB,iBAAO,GAAA,CAAI,MAAA,GAAS,GAAA,IAAO,GAAA,CAAI,MAAA,IAAU,GAAA,CAAA;SACjD;AACM,WAAA,EAAK,KAAA;OACX;KACA;;AAEE,qBAAA,EAAmB,2BAAU,IAAA,EAAM,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS;AACnD,aAAA,CAAQ,eAAA,CAAgB,IAAA,CAAA,GAAQ;AAC9B,UAAA,EAAI,EAAA;AACJ,WAAA,EAAK,GAAA,IAAO,KAAA;AACZ,eAAA,EAAS,OAAA,IAAW,EAAA;OAC1B,CAAA;;AAEI,aAAO,IAAA,CAAA;KACX;;GAEA,CAAA,CAAA;;AAEA,SAAA,CAAQ,YAAA,CAAa,QAAA,EAAU;AAC7B,mBAAA,EAAiB;AACf,QAAA,EAAI,QAAA;AACJ,iBAAA,EAAa,QAAA;AACb,eAAA,EAAW,SAAA;AACX,eAAA,EAAW,QAAA;KACf;;AAEE,kBAAA,EAAgB,wBAAU,KAAA,EAAO,GAAA,EAAK,OAAA,EAAS,QAAA,EAAU;AACvD,UAAI,IAAA,GAAO,EAAA,CAAA;AACX,UAAI,WAAA,CAAA;AACJ,UAAI,GAAA,CAAA;AACJ,UAAI,SAAA,GAAY,OAAA,CAAQ,SAAA,KAAc,IAAA,KAAS,OAAA,CAAQ,OAAA,GAAU,SAAA,GAAY,SAAA,CAAA,CAAA;;AAE7E,UAAI,WAAA,KAAgB,OAAO,OAAA,CAAQ,eAAA,CAAgB,SAAA,CAAA,EACjD,MAAM,IAAI,KAAA,CAAM,yCAAA,GAA4C,SAAA,GAAY,GAAA,CAAA,CAAA;;AAE1E,SAAA,GAAM,OAAA,CAAQ,eAAA,CAAgB,SAAA,CAAA,CAAW,GAAA,IAAO,GAAA,CAAA;;;AAGhD,UAAI,GAAA,CAAI,OAAA,CAAQ,SAAA,CAAA,GAAa,CAAC,CAAA,EAAG;AAC/B,WAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,kBAAA,CAAmB,KAAA,CAAA,CAAA,CAAA;OACtD,MAAW;AACL,YAAA,CAAK,QAAA,CAAS,QAAA,CAAS,IAAA,CAAK,MAAA,CAAA,IAAW,QAAA,CAAS,QAAA,CAAS,IAAA,CAAK,IAAA,CAAA,CAAA,GAAS,KAAA,CAAA;OAC7E;;;AAGI,UAAI,aAAA,GAAgB,CAAA,CAAE,MAAA,CAAO,IAAA,EAAM,OAAA,CAAQ,OAAA,IAAW,EAAA,EAAK,OAAA,CAAQ,eAAA,CAAgB,SAAA,CAAA,CAAW,OAAA,CAAA,CAAA;;;AAG9F,iBAAA,GAAc,CAAA,CAAE,MAAA,CAAO,IAAA,EAAM,EAAA,EAAI;AAC/B,WAAA,EAAK,GAAA;AACL,YAAA,EAAM,IAAA;AACN,YAAA,EAAM,KAAA;OACZ,EAAO,aAAA,CAAA,CAAA;;;AAGH,cAAA,CAAS,OAAA,CAAQ,mBAAA,EAAqB,QAAA,EAAU,WAAA,CAAA,CAAA;;AAEhD,SAAA,GAAM,CAAA,CAAE,KAAA,CAAM,WAAA,CAAA,CAAA;;;AAGd,UAAI,WAAA,KAAgB,OAAO,OAAA,CAAQ,YAAA,EACjC,OAAA,CAAQ,YAAA,GAAe,EAAA,CAAA;;;AAGzB,UAAI,GAAA,GAAM,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAA,IAAQ,CAAA,CAAE,IAAA,CAAK,WAAA,CAAA,CAAA;;AAE1E,UAAI,SAAA,GAAY,SAAZ,SAAA,GAAwB;AAC1B,YAAI,MAAA,GAAS,OAAA,CAAQ,eAAA,CAAgB,SAAA,CAAA,CAAW,EAAA,CAAG,IAAA,CAAK,QAAA,EAAU,GAAA,EAAK,GAAA,EAAK,OAAA,CAAA,CAAA;AAC5E,YAAI,CAAC,MAAA;AACH,gBAAA,GAAS,CAAA,CAAE,QAAA,EAAA,CAAW,MAAA,EAAA,CAAA;AACxB,eAAO,CAAA,CAAE,IAAA,CAAK,MAAA,CAAA,CAAA;OACpB,CAAA;;AAEI,aAAO,GAAA,CAAI,IAAA,CAAK,SAAA,EAAW,SAAA,CAAA,CAAA;KAC/B;;AAEE,YAAA,EAAU,CAAC,CAAA;GACb,CAAA,CAAA;;AAEA,SAAA,CAAQ,EAAA,CAAG,aAAA,EAAe,YAAY;AACpC,WAAA,CAAQ,YAAA,GAAe,EAAA,CAAA;GACzB,CAAA,CAAA;;AAEA,QAAA,CAAO,aAAA,CAAc,iBAAA,GAAoB,YAAY;AACnD,gBAAA,CAAa,QAAA,CAAS,0HAAA,CAAA,CAAA;AACtB,WAAO,OAAA,CAAQ,iBAAA,MAAA,CAAR,OAAA,EAA6B,SAAA,CAAA,CAAA;GACtC,CAAA;;;;ACrGA,SAAA,CAAQ,WAAA,CAAY,IAAA,EAAM;AACxB,kBAAA,EAAgB,iCAAA;AAChB,QAAA,EAAM;AACJ,WAAA,EAAc,qCAAA;AACd,SAAA,EAAc,mCAAA;AACd,YAAA,EAAc,sCAAA;AACd,aAAA,EAAc,uCAAA;AACd,YAAA,EAAc,8BAAA;AACd,cAAA,EAAc,oCAAA;KAClB;AACE,YAAA,EAAgB,iCAAA;AAChB,YAAA,EAAgB,yBAAA;AAChB,WAAA,EAAgB,iCAAA;AAChB,OAAA,EAAgB,mDAAA;AAChB,OAAA,EAAgB,iDAAA;AAChB,SAAA,EAAgB,yCAAA;AAChB,aAAA,EAAgB,gEAAA;AAChB,aAAA,EAAgB,gEAAA;AAChB,UAAA,EAAgB,+EAAA;AAChB,YAAA,EAAgB,sCAAA;AAChB,YAAA,EAAgB,sCAAA;AAChB,SAAA,EAAgB,4CAAA;AAChB,WAAA,EAAgB,gCAAA;GAClB,CAAA,CAAA;;AAEA,SAAA,CAAQ,SAAA,CAAU,IAAA,CAAA,CAAA;;;;;;;;;;ACnBlB,WAAS,UAAA,GAAa;;;AACpB,QAAI,OAAA,GAAU,MAAA,IAAU,MAAA,CAAA;;;;AAIxB,KAAA,CAAE,MAAA,CAAO,IAAA,EAAM;;;AAGb,mBAAA,EAAe,uBAAA,GAAA,EAAO;AACpB,eAAO,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,aAAA,CAAc,SAAA,KAAc,KAAA,CAAA;OAClE;;AAEI,oBAAA,EAAgB,wBAAA,GAAA,EAAO;AACrB,YAAI,QAAK,aAAA,CAAc,GAAA,CAAA,EAAM;AAC3B,WAAA,CAAE,GAAA,CAAI,MAAA,CAAA,CAAQ,OAAA,CAAQ,OAAA,CAAA,CAAA;SAC9B;OACA;;AAEI,gBAAA,EAAY,oBAAA,GAAA,EAAO;AACjB,YAAI,QAAK,aAAA,CAAc,GAAA,CAAA,EAAM;AAC3B,kBAAK,SAAA,CAAU,GAAA,CAAA,CAAA;AACf,WAAA,CAAE,QAAA,CAAA,CACC,EAAA,CAAG,mBAAA,EAAqB,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,QAAK,cAAA,CAAA,CAAA;AACnD,kBAAK,cAAA,CAAe,GAAA,CAAA,CAAA;SAC5B;OACA;;AAEI,eAAA,EAAW,mBAAA,GAAA,EAAO;AAChB,YAAI,QAAK,aAAA,CAAc,GAAA,CAAA,EAAM;AAC3B,WAAA,CAAE,QAAA,CAAA;WACC,GAAA,CAAI,kBAAA,EAAoB,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,QAAK,SAAA,CAAA,CAChD,GAAA,CAAI,mBAAA,EAAqB,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,QAAK,UAAA,CAAA,CAAA;SAC5D;OACA;;;AAGI,aAAA,EAAS,mBAAM;AACb,YAAI,OAAA,CAAQ,iBAAA,EAAmB;AAC7B,iBAAA;SACR;AACM,eAAA,CAAQ,iBAAA,GAAoB,OAAA,CAAA;mBACP,CAAC,QAAA,EAAU,wBAAA,EAA0B,qBAAA,EAAuB,oBAAA,CAAA;AAAjF,iDAAwG;AAAnG,cAAI,QAAA,WAAA,CAAA;AACP,WAAA,CAAE,QAAA,CAAA,CACC,EAAA,CAAG,kBAAA,EAAoB,QAAA,EAAU,EAAC,QAAA,EAAA,QAAA,EAAA,EAAW,QAAK,SAAA,CAAA,CAClD,EAAA,CAAG,mBAAA,EAAqB,QAAA,EAAU,EAAC,QAAA,EAAA,QAAA,EAAA,EAAW,QAAK,UAAA,CAAA,CAAA;SAC9D;OACA;;AAEI,eAAA,EAAW,qBAAM;AACf,eAAO,OAAA,CAAQ,iBAAA,CAAA;AACf,SAAA,CAAE,QAAA,CAAA,CAAU,GAAA,CAAI,aAAA,CAAA,CAAA;OACtB;;KAEA,CAAA,CAAA;GACC,CAAA;;AAhED,MAAA,UAAA,GAkEe,IAAI,UAAA,EAAA,CAAA;;AC3DnB,YAAW,CAAA,OAAA,EAAA,CAAA;;AAPX,MAAA,OAAA,GAAA,OAAA,CAAA;;AjBw4EE,SAAO,OAAO,CAAC;CAEhB,CAAC,CAAE","file":"parsley.js","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :\n typeof define === 'function' && define.amd ? define(['jquery'], factory) :\n global.parsley = factory(global.$)\n}(this, function ($) { 'use strict';\n\n var globalID = 1;\n var pastWarnings = {};\n\n var 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(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })()\n };\n\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(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (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 this.__id__ = ParsleyUtils__default.generateID();\n };\n\n ParsleyAbstract.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n 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 this._resetUI();\n return this._trigger('reset');\n }\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].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n 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 (group, force) {\n ParsleyUtils__default.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n this.parent.$element.find(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`)\n : this.$element;\n }\n };\n\n var 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(...arguments);\n } else {\n if (this.validateNumber) {\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return $.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if ($.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = 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 // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n 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 // See http://stackoverflow.com/a/10454560/8279\n var decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n };\n\n 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(...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(...arguments);\n }\n return this._setValidator(...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(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = '1', base = 0} = {}) {\n var regex = typeRegexes[type];\n if (!regex) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!regex.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: {\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 = {};\n\n var diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n };\n\n ParsleyUI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', 'input[type=\"submit\"], button[type=\"submit\"]', evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.$element.attr('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n };\n\n ParsleyUI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = this.options.classHandler.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n\n // Otherwise, if simple element (input, texatrea, select...) it will perfectly host the classes\n if (!this.options.multiple || this.$element.is('select'))\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof this.options.errorsContainer) {\n if ($(this.options.errorsContainer).length)\n return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);\n else\n ParsleyUtils__default.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof this.options.errorsContainer)\n $errorsContainer = this.options.errorsContainer.call(this, this);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n var $from = this.$element;\n if (this.options.multiple)\n $from = $from.parent();\n return $from.after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(ParsleyUtils__default.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this.validate();\n });\n else if (trigger = ParsleyUtils__default.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._eventValidate(event);\n });\n }\n },\n\n _eventValidate: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (/key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n };\n\n var ParsleyForm = function (element, domOptions, options) {\n this.__class__ = 'ParsleyForm';\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 // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var $submitSource = this._$submitSource || this.$element.find('input[type=\"submit\"], button[type=\"submit\"]').first();\n this._$submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if ($submitSource.is('[formnovalidate]'))\n return;\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit($submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._$submitSource = $(event.currentTarget);\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function ($submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if ($submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('').appendTo(this.$element);\n $synthetic.attr({\n name: $submitSource.attr('name'),\n value: $submitSource.attr('value')\n });\n }\n\n this.$element.trigger($.extend($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return ParsleyForm__statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = $.extend({}, event, {preventDefault: () => {\n ParsleyUtils__default.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return ParsleyUtils__default.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return ParsleyForm__statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return ParsleyUtils__default.all(promises);\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `ParsleyField` and `ParsleyFieldMultiple` children\n if (('ParsleyField' === fieldInstance.__class__ || 'ParsleyFieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded))\n if ('undefined' === typeof this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__]) {\n this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n });\n\n $.each(ParsleyUtils__default.difference(oldFields, this.fields), (_, field) => {\n field._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();\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 (!/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 return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n };\n\n var ParsleyField = function (field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'ParsleyField';\n\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n };\n\n var parsley_field__statusMapping = {pending: null, resolved: true, rejected: false};\n\n 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 (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `ParsleyUI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refreshConstraints();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if ($.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return parsley_field__statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refreshConstraints();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = ParsleyUtils__default.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return ParsleyUtils__default.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return ParsleyUtils__default.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // 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 return this.addConstraint('type', ['number', {\n step: this.$element.attr('step'),\n base: this.$element.attr('min') || this.$element.attr('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range)$/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 ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.$element.is('input[type=radio]'))\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n\n // Select multiple case\n if (this.$element.is('select') && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n };\n\n var 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 if ('object' === typeof options) {\n $.extend(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && '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__ = '2.4.3';\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 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((i, input) => {\n if ($(input).is('input[type=radio], input[type=checkbox]'))\n $(input).attr(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('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 new ParsleyAbstract(),\n window.ParsleyExtend\n )._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(\n new parsley_field(this.$element, this.domOptions, this.options, this.parent),\n new ParsleyAbstract(),\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 new ParsleyAbstract(),\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._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n };\n\n var vernums = $.fn.jquery.split('.');\n if (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n }\n if (!vernums.forEach) {\n 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: '2.4.3'\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, ParsleyUI.Field, ParsleyAbstract.prototype);\n $.extend(ParsleyForm.prototype, ParsleyUI.Form, 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](...arguments);\n };\n });\n\n // ### ParsleyUI\n // Deprecated global object\n window.Parsley.UI = ParsleyUI;\n window.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils__default.warnOnce(`Accessing ParsleyUI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n ParsleyUtils__default.warnOnce(`Accessing ParsleyUI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n };\n $.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils__default.warnOnce(`Accessing ParsleyUI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n });\n\n // ### PARSLEY auto-binding\n // Prevent it by setting `ParsleyConfig.autoBind` to `false`\n if (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n }\n\n var o = $({});\n var deprecated = function () {\n 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(...args);\n };\n\n var pubsub = {};\n\n $.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n });\n\n Parsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n });\n\n Parsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n });\n\n window.ParsleyExtend.addAsyncValidator = function () {\n ParsleyUtils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n };\n\n // This is included with the Parsley library itself,\n // thus there is no use in adding it to your project.\n Parsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n });\n\n Parsley.setLocale('en');\n\n /**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune \n * @license MIT\n */\n\n function InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n $.extend(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n };\n\n var inputevent = new InputEvent();\n\n inputevent.install();\n\n var parsley = Parsley;\n\n return parsley;\n\n}));\n","import $ from 'jquery';\n\nvar globalID = 1;\nvar pastWarnings = {};\n\nvar 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(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })()\n};\n\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(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (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 this.__id__ = ParsleyUtils.generateID();\n};\n\nParsleyAbstract.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n 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 this._resetUI();\n return this._trigger('reset');\n }\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].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n 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 (group, force) {\n ParsleyUtils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n this.parent.$element.find(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`)\n : this.$element;\n }\n};\n\nexport default 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(...arguments);\n } else {\n if (this.validateNumber) {\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return $.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if ($.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = 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 // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n 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\n// See http://stackoverflow.com/a/10454560/8279\nvar decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n};\n\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(...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(...arguments);\n }\n return this._setValidator(...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(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = '1', base = 0} = {}) {\n var regex = typeRegexes[type];\n if (!regex) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!regex.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: {\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 = {};\n\nvar diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n};\n\nParsleyUI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', 'input[type=\"submit\"], button[type=\"submit\"]', evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.$element.attr('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n};\n\nParsleyUI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = this.options.classHandler.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n\n // Otherwise, if simple element (input, texatrea, select...) it will perfectly host the classes\n if (!this.options.multiple || this.$element.is('select'))\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof this.options.errorsContainer) {\n if ($(this.options.errorsContainer).length)\n return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);\n else\n ParsleyUtils.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof this.options.errorsContainer)\n $errorsContainer = this.options.errorsContainer.call(this, this);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n var $from = this.$element;\n if (this.options.multiple)\n $from = $from.parent();\n return $from.after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(ParsleyUtils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this.validate();\n });\n else if (trigger = ParsleyUtils.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._eventValidate(event);\n });\n }\n },\n\n _eventValidate: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (/key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n};\n\nexport default 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\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 // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var $submitSource = this._$submitSource || this.$element.find('input[type=\"submit\"], button[type=\"submit\"]').first();\n this._$submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if ($submitSource.is('[formnovalidate]'))\n return;\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit($submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._$submitSource = $(event.currentTarget);\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function ($submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if ($submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('').appendTo(this.$element);\n $synthetic.attr({\n name: $submitSource.attr('name'),\n value: $submitSource.attr('value')\n });\n }\n\n this.$element.trigger($.extend($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = $.extend({}, event, {preventDefault: () => {\n ParsleyUtils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return ParsleyUtils.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return ParsleyUtils.all(promises);\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `ParsleyField` and `ParsleyFieldMultiple` children\n if (('ParsleyField' === fieldInstance.__class__ || 'ParsleyFieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded))\n if ('undefined' === typeof this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__]) {\n this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n });\n\n $.each(ParsleyUtils.difference(oldFields, this.fields), (_, field) => {\n field._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();\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 (!/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 return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n};\n\nexport default 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\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\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 (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `ParsleyUI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refreshConstraints();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if ($.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refreshConstraints();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = ParsleyUtils.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return ParsleyUtils.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return ParsleyUtils.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // 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 return this.addConstraint('type', ['number', {\n step: this.$element.attr('step'),\n base: this.$element.attr('min') || this.$element.attr('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range)$/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 ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.$element.is('input[type=radio]'))\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n\n // Select multiple case\n if (this.$element.is('select') && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n};\n\nexport default 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 if ('object' === typeof options) {\n $.extend(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && '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 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((i, input) => {\n if ($(input).is('input[type=radio], input[type=checkbox]'))\n $(input).attr(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('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 new ParsleyAbstract(),\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 new ParsleyAbstract(),\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 new ParsleyAbstract(),\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._actualizeTriggers();\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, ParsleyUI.Field, ParsleyAbstract.prototype);\n$.extend(ParsleyForm.prototype, ParsleyUI.Form, 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](...arguments);\n };\n});\n\n// ### ParsleyUI\n// Deprecated global object\nwindow.Parsley.UI = ParsleyUI;\nwindow.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils.warnOnce(`Accessing ParsleyUI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n ParsleyUtils.warnOnce(`Accessing ParsleyUI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n};\n$.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils.warnOnce(`Accessing ParsleyUI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n});\n\n// ### PARSLEY auto-binding\n// Prevent it by setting `ParsleyConfig.autoBind` to `false`\nif (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n}\n\nexport default Parsley;\n","import $ from 'jquery';\nimport 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(...args);\n};\n\nexport default {};\n","import $ from 'jquery';\n\nimport Parsley from './main';\n\n$.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n});\n\nParsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n});\n\nParsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n});\n\nwindow.ParsleyExtend.addAsyncValidator = function () {\n ParsleyUtils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n};\n","// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\nimport Parsley from '../parsley/main';\n\nParsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n});\n\nParsley.setLocale('en');\n","/**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune \n * @license MIT\n */\n\nimport $ from 'jquery';\n\nfunction InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n $.extend(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n};\n\nexport default new InputEvent();\n","import $ from 'jquery';\nimport Parsley from './parsley/main';\nimport './parsley/pubsub';\nimport './parsley/remote';\nimport './i18n/en';\nimport inputevent from './vendor/inputevent';\n\ninputevent.install();\n\nexport default Parsley;\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["parsley.js","src/parsley/utils.js","src/parsley/defaults.js","src/parsley/abstract.js","src/parsley/validator.js","src/parsley/validator_registry.js","src/parsley/ui.js","src/parsley/form.js","src/parsley/factory/constraint.js","src/parsley/field.js","src/parsley/multiple.js","src/parsley/factory.js","src/parsley/main.js","src/parsley/pubsub.js","src/parsley/remote.js","src/i18n/en.js","src/vendor/inputevent.js","src/parsley.js"],"names":[],"mappings":"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","file":"parsley.js","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :\n typeof define === 'function' && define.amd ? define(['jquery'], factory) :\n global.parsley = factory(global.$)\n}(this, function ($) { 'use strict';\n\n var globalID = 1;\n var pastWarnings = {};\n\n var 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(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })()\n };\n\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(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (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 this.__id__ = ParsleyUtils__default.generateID();\n };\n\n ParsleyAbstract.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n 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 this._resetUI();\n return this._trigger('reset');\n }\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].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n 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 (group, force) {\n ParsleyUtils__default.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n this.parent.$element.find(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`)\n : this.$element;\n }\n };\n\n var 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(...arguments);\n } else {\n if (this.validateNumber) {\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return $.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if ($.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = 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 // @See: http://qiita.com/sakuro/items/1eaa307609ceaaf51123\n email: /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$/i,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n 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 // See http://stackoverflow.com/a/10454560/8279\n var decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n };\n\n 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(...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(...arguments);\n }\n return this._setValidator(...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(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = '1', base = 0} = {}) {\n var regex = typeRegexes[type];\n if (!regex) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!regex.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: {\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 = {};\n\n var diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n };\n\n ParsleyUI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', 'input[type=\"submit\"], button[type=\"submit\"]', evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.$element.attr('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n };\n\n ParsleyUI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = this.options.classHandler.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n\n // Otherwise, if simple element (input, texatrea, select...) it will perfectly host the classes\n if (!this.options.multiple || this.$element.is('select'))\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof this.options.errorsContainer) {\n if ($(this.options.errorsContainer).length)\n return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);\n else\n ParsleyUtils__default.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof this.options.errorsContainer)\n $errorsContainer = this.options.errorsContainer.call(this, this);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n var $from = this.$element;\n if (this.options.multiple)\n $from = $from.parent();\n return $from.after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(ParsleyUtils__default.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this.validate();\n });\n else if (trigger = ParsleyUtils__default.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._eventValidate(event);\n });\n }\n },\n\n _eventValidate: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (/key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n };\n\n var ParsleyForm = function (element, domOptions, options) {\n this.__class__ = 'ParsleyForm';\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 // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var $submitSource = this._$submitSource || this.$element.find('input[type=\"submit\"], button[type=\"submit\"]').first();\n this._$submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if ($submitSource.is('[formnovalidate]'))\n return;\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit($submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._$submitSource = $(event.currentTarget);\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function ($submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if ($submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('').appendTo(this.$element);\n $synthetic.attr({\n name: $submitSource.attr('name'),\n value: $submitSource.attr('value')\n });\n }\n\n this.$element.trigger($.extend($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return ParsleyForm__statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = $.extend({}, event, {preventDefault: () => {\n ParsleyUtils__default.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return ParsleyUtils__default.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return ParsleyForm__statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return ParsleyUtils__default.all(promises);\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `ParsleyField` and `ParsleyFieldMultiple` children\n if (('ParsleyField' === fieldInstance.__class__ || 'ParsleyFieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded))\n if ('undefined' === typeof this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__]) {\n this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n });\n\n $.each(ParsleyUtils__default.difference(oldFields, this.fields), (_, field) => {\n field._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();\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 (!/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 return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n };\n\n var ParsleyField = function (field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'ParsleyField';\n\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n };\n\n var parsley_field__statusMapping = {pending: null, resolved: true, rejected: false};\n\n 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 (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `ParsleyUI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refreshConstraints();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if ($.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return parsley_field__statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refreshConstraints();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = ParsleyUtils__default.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return ParsleyUtils__default.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return ParsleyUtils__default.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // 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 return this.addConstraint('type', ['number', {\n step: this.$element.attr('step'),\n base: this.$element.attr('min') || this.$element.attr('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range)$/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 ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.$element.is('input[type=radio]'))\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n\n // Select multiple case\n if (this.$element.is('select') && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n };\n\n var 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 if ('object' === typeof options) {\n $.extend(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && '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__ = '2.4.3';\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 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((i, input) => {\n if ($(input).is('input[type=radio], input[type=checkbox]'))\n $(input).attr(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('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 new ParsleyAbstract(),\n window.ParsleyExtend\n )._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(\n new parsley_field(this.$element, this.domOptions, this.options, this.parent),\n new ParsleyAbstract(),\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 new ParsleyAbstract(),\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._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n };\n\n var vernums = $.fn.jquery.split('.');\n if (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n }\n if (!vernums.forEach) {\n 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: '2.4.3'\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, ParsleyUI.Field, ParsleyAbstract.prototype);\n $.extend(ParsleyForm.prototype, ParsleyUI.Form, 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](...arguments);\n };\n });\n\n // ### ParsleyUI\n // Deprecated global object\n window.Parsley.UI = ParsleyUI;\n window.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils__default.warnOnce(`Accessing ParsleyUI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n ParsleyUtils__default.warnOnce(`Accessing ParsleyUI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n };\n $.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils__default.warnOnce(`Accessing ParsleyUI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n });\n\n // ### PARSLEY auto-binding\n // Prevent it by setting `ParsleyConfig.autoBind` to `false`\n if (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n }\n\n var o = $({});\n var deprecated = function () {\n 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(...args);\n };\n\n var pubsub = {};\n\n $.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n });\n\n Parsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n });\n\n Parsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n });\n\n window.ParsleyExtend.addAsyncValidator = function () {\n ParsleyUtils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n };\n\n // This is included with the Parsley library itself,\n // thus there is no use in adding it to your project.\n Parsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n });\n\n Parsley.setLocale('en');\n\n /**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune \n * @license MIT\n */\n\n function InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n $.extend(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n };\n\n var inputevent = new InputEvent();\n\n inputevent.install();\n\n var parsley = Parsley;\n\n return parsley;\n\n}));\n","import $ from 'jquery';\n\nvar globalID = 1;\nvar pastWarnings = {};\n\nvar 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(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })()\n};\n\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(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (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 this.__id__ = ParsleyUtils.generateID();\n};\n\nParsleyAbstract.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n 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 this._resetUI();\n return this._trigger('reset');\n }\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].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n 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 (group, force) {\n ParsleyUtils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n this.parent.$element.find(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`)\n : this.$element;\n }\n};\n\nexport default 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(...arguments);\n } else {\n if (this.validateNumber) {\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return $.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if ($.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = 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 // @See: http://qiita.com/sakuro/items/1eaa307609ceaaf51123\n email: /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$/i,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n 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\n// See http://stackoverflow.com/a/10454560/8279\nvar decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n};\n\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(...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(...arguments);\n }\n return this._setValidator(...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(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = '1', base = 0} = {}) {\n var regex = typeRegexes[type];\n if (!regex) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!regex.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: {\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 = {};\n\nvar diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n};\n\nParsleyUI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', 'input[type=\"submit\"], button[type=\"submit\"]', evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.$element.attr('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n};\n\nParsleyUI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = this.options.classHandler.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n\n // Otherwise, if simple element (input, texatrea, select...) it will perfectly host the classes\n if (!this.options.multiple || this.$element.is('select'))\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof this.options.errorsContainer) {\n if ($(this.options.errorsContainer).length)\n return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);\n else\n ParsleyUtils.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof this.options.errorsContainer)\n $errorsContainer = this.options.errorsContainer.call(this, this);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n var $from = this.$element;\n if (this.options.multiple)\n $from = $from.parent();\n return $from.after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(ParsleyUtils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this.validate();\n });\n else if (trigger = ParsleyUtils.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._eventValidate(event);\n });\n }\n },\n\n _eventValidate: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (/key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n};\n\nexport default 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\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 // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var $submitSource = this._$submitSource || this.$element.find('input[type=\"submit\"], button[type=\"submit\"]').first();\n this._$submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if ($submitSource.is('[formnovalidate]'))\n return;\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit($submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._$submitSource = $(event.currentTarget);\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function ($submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if ($submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('').appendTo(this.$element);\n $synthetic.attr({\n name: $submitSource.attr('name'),\n value: $submitSource.attr('value')\n });\n }\n\n this.$element.trigger($.extend($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = $.extend({}, event, {preventDefault: () => {\n ParsleyUtils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return ParsleyUtils.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return ParsleyUtils.all(promises);\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `ParsleyField` and `ParsleyFieldMultiple` children\n if (('ParsleyField' === fieldInstance.__class__ || 'ParsleyFieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded))\n if ('undefined' === typeof this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__]) {\n this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n });\n\n $.each(ParsleyUtils.difference(oldFields, this.fields), (_, field) => {\n field._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();\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 (!/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 return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n};\n\nexport default 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\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\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 (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `ParsleyUI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refreshConstraints();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if ($.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refreshConstraints();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = ParsleyUtils.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return ParsleyUtils.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return ParsleyUtils.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // 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 return this.addConstraint('type', ['number', {\n step: this.$element.attr('step'),\n base: this.$element.attr('min') || this.$element.attr('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range)$/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 ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.$element.is('input[type=radio]'))\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n\n // Select multiple case\n if (this.$element.is('select') && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n};\n\nexport default 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 if ('object' === typeof options) {\n $.extend(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && '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 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((i, input) => {\n if ($(input).is('input[type=radio], input[type=checkbox]'))\n $(input).attr(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('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 new ParsleyAbstract(),\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 new ParsleyAbstract(),\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 new ParsleyAbstract(),\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._actualizeTriggers();\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, ParsleyUI.Field, ParsleyAbstract.prototype);\n$.extend(ParsleyForm.prototype, ParsleyUI.Form, 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](...arguments);\n };\n});\n\n// ### ParsleyUI\n// Deprecated global object\nwindow.Parsley.UI = ParsleyUI;\nwindow.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils.warnOnce(`Accessing ParsleyUI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n ParsleyUtils.warnOnce(`Accessing ParsleyUI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n};\n$.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils.warnOnce(`Accessing ParsleyUI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n});\n\n// ### PARSLEY auto-binding\n// Prevent it by setting `ParsleyConfig.autoBind` to `false`\nif (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n}\n\nexport default Parsley;\n","import $ from 'jquery';\nimport 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(...args);\n};\n\nexport default {};\n","import $ from 'jquery';\n\nimport Parsley from './main';\n\n$.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n});\n\nParsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n});\n\nParsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n});\n\nwindow.ParsleyExtend.addAsyncValidator = function () {\n ParsleyUtils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n};\n","// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\nimport Parsley from '../parsley/main';\n\nParsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n});\n\nParsley.setLocale('en');\n","/**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune \n * @license MIT\n */\n\nimport $ from 'jquery';\n\nfunction InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n $.extend(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n};\n\nexport default new InputEvent();\n","import $ from 'jquery';\nimport Parsley from './parsley/main';\nimport './parsley/pubsub';\nimport './parsley/remote';\nimport './i18n/en';\nimport inputevent from './vendor/inputevent';\n\ninputevent.install();\n\nexport default Parsley;\n"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/dist/parsley.min.js b/dist/parsley.min.js index b528b0449..2ca86c11c 100644 --- a/dist/parsley.min.js +++ b/dist/parsley.min.js @@ -1,18 +1,18 @@ /*! * Parsley.js -* Version 2.4.3 - built Sat, Jun 18th 2016, 9:01 pm +* Version 2.4.3 - built Mon, Jul 25th 2016, 8:48 pm * http://parsleyjs.org * Guillaume Potier - * Marc-Andre Lafortune - * MIT Licensed */ -function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,i=Array(e.length);t * @license MIT */ -function n(){var t=this,i=window||global;e.extend(this,{isNativeEvent:function(e){return e.originalEvent&&e.originalEvent.isTrusted!==!1},fakeInputEvent:function(i){t.isNativeEvent(i)&&e(i.target).trigger("input")},misbehaves:function(i){t.isNativeEvent(i)&&(t.behavesOk(i),e(document).on("change.inputevent",i.data.selector,t.fakeInputEvent),t.fakeInputEvent(i))},behavesOk:function(i){t.isNativeEvent(i)&&e(document).off("input.inputevent",i.data.selector,t.behavesOk).off("change.inputevent",i.data.selector,t.misbehaves)},install:function(){if(!i.inputEventPatched){i.inputEventPatched="0.0.3";for(var n=["select",'input[type="checkbox"]','input[type="radio"]','input[type="file"]'],r=0;r1)throw Error("Second argument not supported");if("object"!=typeof t)throw TypeError("Argument must be an object");e.prototype=t;var i=new e;return e.prototype=null,i}}()},o=a,l={namespace:"data-parsley-",inputs:"input, textarea, select",excluded:"input[type=button], input[type=submit], input[type=reset], input[type=hidden]",priorityEnabled:!0,multiple:null,group:null,uiEnabled:!0,validationThreshold:3,focus:"first",trigger:!1,triggerAfterFailure:"input",errorClass:"parsley-error",successClass:"parsley-success",classHandler:function(e){},errorsContainer:function(e){},errorsWrapper:'
            ',errorTemplate:"
          • "},u=function(){this.__id__=o.generateID()};u.prototype={asyncSupport:!0,_pipeAccordingToValidationResult:function(){var t=this,i=function(){var i=e.Deferred();return!0!==t.validationResult&&i.reject(),i.resolve().promise()};return[i,i]},actualizeOptions:function(){return o.attr(this.$element,this.options.namespace,this.domOptions),this.parent&&this.parent.actualizeOptions&&this.parent.actualizeOptions(),this},_resetOptions:function(e){this.domOptions=o.objectCreate(this.parent.options),this.options=o.objectCreate(this.domOptions);for(var t in e)e.hasOwnProperty(t)&&(this.options[t]=e[t]);this.actualizeOptions()},_listeners:null,on:function(e,t){this._listeners=this._listeners||{};var i=this._listeners[e]=this._listeners[e]||[];return i.push(t),this},subscribe:function(t,i){e.listenTo(this,t.toLowerCase(),i)},off:function(e,t){var i=this._listeners&&this._listeners[e];if(i)if(t)for(var n=i.length;n--;)i[n]===t&&i.splice(n,1);else delete this._listeners[e];return this},unsubscribe:function(t,i){e.unsubscribeTo(this,t.toLowerCase())},trigger:function(e,t,i){t=t||this;var n,r=this._listeners&&this._listeners[e];if(r)for(var s=r.length;s--;)if(n=r[s].call(t,t,i),n===!1)return n;return this.parent?this.parent.trigger(e,t,i):!0},reset:function(){if("ParsleyForm"!==this.__class__)return this._resetUI(),this._trigger("reset");for(var e=0;e3&&(i=[].slice.call(arguments,1,-1)),this.fn.call(this,t,i);if(e.isArray(t)){if(!this.validateMultiple)throw"Validator `"+this.name+"` does not handle multiple values";return this.validateMultiple.apply(this,arguments)}if(this.validateNumber)return isNaN(t)?!1:(arguments[0]=parseFloat(arguments[0]),this.validateNumber.apply(this,arguments));if(this.validateString)return this.validateString.apply(this,arguments);throw"Validator `"+this.name+"` only handles multiple values"},parseRequirements:function(t,i){if("string"!=typeof t)return e.isArray(t)?t:[t];var n=this.requirementType;if(e.isArray(n)){for(var r=h(t,n.length),s=0;s0},validateString:function(e){return/\S/.test(e)},priority:512},type:{validateString:function(e,t){var i=arguments.length<=2||void 0===arguments[2]?{}:arguments[2],n=i.step,r=void 0===n?"1":n,s=i.base,a=void 0===s?0:s,o=g[t];if(!o)throw new Error("validator type `"+t+"` is not supported");if(!o.test(e))return!1;if("number"===t&&!/^any$/i.test(r||"")){var l=Number(e),u=Math.max(v(r),v(a));if(v(l)>u)return!1;var d=function(e){return Math.round(e*Math.pow(10,u))};if((d(l)-d(a))%d(r)!=0)return!1}return!0},requirementType:{"":"string",step:"string",base:"number"},priority:256},pattern:{validateString:function(e,t){return t.test(e)},requirementType:"regexp",priority:64},minlength:{validateString:function(e,t){return e.length>=t},requirementType:"integer",priority:30},maxlength:{validateString:function(e,t){return e.length<=t},requirementType:"integer",priority:30},length:{validateString:function(e,t,i){return e.length>=t&&e.length<=i},requirementType:["integer","integer"],priority:30},mincheck:{validateMultiple:function(e,t){return e.length>=t},requirementType:"integer",priority:30},maxcheck:{validateMultiple:function(e,t){return e.length<=t},requirementType:"integer",priority:30},check:{validateMultiple:function(e,t,i){return e.length>=t&&e.length<=i},requirementType:["integer","integer"],priority:30},min:{validateNumber:function(e,t){return e>=t},requirementType:"number",priority:30},max:{validateNumber:function(e,t){return t>=e},requirementType:"number",priority:30},range:{validateNumber:function(e,t,i){return e>=t&&i>=e},requirementType:["number","number"],priority:30},equalto:{validateString:function(t,i){var n=e(i);return n.length?t===n.val():t===i},priority:256}}};var y={},_=function k(e,t,i){for(var n=[],r=[],s=0;s0&&"undefined"==typeof t.options.noFocus&&(this._focusedField=t.$element,"first"===this.options.focus))break}return null===this._focusedField?null:this._focusedField.focus()},_destroyUI:function(){this.$element.off(".Parsley")}},y.Field={_reflowUI:function(){if(this._buildUI(),this._ui){var e=_(this.validationResult,this._ui.lastValidationResult);this._ui.lastValidationResult=this.validationResult,this._manageStatusClass(),this._manageErrorsMessages(e),this._actualizeTriggers(),!e.kept.length&&!e.added.length||this._failedOnce||(this._failedOnce=!0,this._actualizeTriggers())}},getErrorsMessages:function(){if(!0===this.validationResult)return[];for(var e=[],t=0;t0?this._errorClass():this._resetClass()},_manageErrorsMessages:function(t){if("undefined"==typeof this.options.errorsMessagesDisabled){if("undefined"!=typeof this.options.errorMessage)return t.added.length||t.kept.length?(this._insertErrorWrapper(),0===this._ui.$errorsWrapper.find(".parsley-custom-error-message").length&&this._ui.$errorsWrapper.append(e(this.options.errorTemplate).addClass("parsley-custom-error-message")),this._ui.$errorsWrapper.addClass("filled").find(".parsley-custom-error-message").html(this.options.errorMessage)):this._ui.$errorsWrapper.removeClass("filled").find(".parsley-custom-error-message").remove();for(var i=0;i').appendTo(this.$element)),i.attr({name:t.attr("name"),value:t.attr("value")})}this.$element.trigger(e.extend(e.Event("submit"),{parsley:!0}))}},validate:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){o.warnOnce("Calling validate on a parsley form without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1],s=i[2];t={group:n,force:r,event:s}}return b[this.whenValidate(t).state()]},whenValidate:function(){var t,i=this,n=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],r=n.group,s=n.force,a=n.event;this.submitEvent=a,a&&(this.submitEvent=e.extend({},a,{preventDefault:function(){o.warnOnce("Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`"),i.validationResult=!1}})),this.validationResult=!0,this._trigger("validate"),this._refreshFields();var l=this._withoutReactualizingFormOptions(function(){return e.map(i.fields,function(e){return e.whenValidate({force:s,group:r})})});return(t=o.all(l).done(function(){i._trigger("success")}).fail(function(){i.validationResult=!1,i.focus(),i._trigger("error")}).always(function(){i._trigger("validated")})).pipe.apply(t,_toConsumableArray(this._pipeAccordingToValidationResult()))},isValid:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){o.warnOnce("Calling isValid on a parsley form without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1];t={group:n,force:r}}return b[this.whenValid(t).state()]},whenValid:function(){var t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.group,r=i.force;this._refreshFields();var s=this._withoutReactualizingFormOptions(function(){return e.map(t.fields,function(e){return e.whenValid({group:n,force:r})})});return o.all(s)},_refreshFields:function(){return this.actualizeOptions()._bindFields()},_bindFields:function(){var t=this,i=this.fields;return this.fields=[],this.fieldsMappedById={},this._withoutReactualizingFormOptions(function(){t.$element.find(t.options.inputs).not(t.options.excluded).each(function(e,i){var n=new window.Parsley.Factory(i,{},t);"ParsleyField"!==n.__class__&&"ParsleyFieldMultiple"!==n.__class__||!0===n.options.excluded||"undefined"==typeof t.fieldsMappedById[n.__class__+"-"+n.__id__]&&(t.fieldsMappedById[n.__class__+"-"+n.__id__]=n,t.fields.push(n))}),e.each(o.difference(i,t.fields),function(e,t){t._trigger("reset")})}),this},_withoutReactualizingFormOptions:function(e){var t=this.actualizeOptions;this.actualizeOptions=function(){return this};var i=e();return this.actualizeOptions=t,i},_trigger:function(e){return this.trigger("form:"+e)}};var F=function(t,i,n,r,s){if(!/ParsleyField/.test(t.__class__))throw new Error("ParsleyField or ParsleyFieldMultiple instance expected");var a=window.Parsley._validatorRegistry.validators[i],o=new f(a);e.extend(this,{validator:o,name:i,requirements:n,priority:r||t.options[i+"Priority"]||o.priority,isDomConstraint:!0===s}),this._parseRequirements(t.options)},C=function(e){var t=e[0].toUpperCase();return t+e.slice(1)};F.prototype={validate:function(e,t){var i;return(i=this.validator).validate.apply(i,[e].concat(_toConsumableArray(this.requirementList),[t]))},_parseRequirements:function(e){var t=this;this.requirementList=this.validator.parseRequirements(this.requirements,function(i){return e[t.name+C(i)]})}};var $=function(t,i,n,r){this.__class__="ParsleyField",this.$element=e(t),"undefined"!=typeof r&&(this.parent=r),this.options=n,this.domOptions=i,this.constraints=[],this.constraintsByName={},this.validationResult=!0,this._bindConstraints()},x={pending:null,resolved:!0,rejected:!1};$.prototype={validate:function(t){arguments.length>=1&&!e.isPlainObject(t)&&(o.warnOnce("Calling validate on a parsley field without passing arguments as an object is deprecated."),t={options:t});var i=this.whenValidate(t);if(!i)return!0;switch(i.state()){case"pending":return null;case"resolved":return!0;case"rejected":return this.validationResult}},whenValidate:function(){var e,t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.force,r=i.group;return this.refreshConstraints(),!r||this._isInGroup(r)?(this.value=this.getValue(),this._trigger("validate"),(e=this.whenValid({force:n,value:this.value,_refreshed:!0}).always(function(){t._reflowUI()}).done(function(){t._trigger("success")}).fail(function(){t._trigger("error")}).always(function(){t._trigger("validated")})).pipe.apply(e,_toConsumableArray(this._pipeAccordingToValidationResult()))):void 0},hasConstraints:function(){return 0!==this.constraints.length},needsValidation:function(e){return"undefined"==typeof e&&(e=this.getValue()),!(!e.length&&!this._isRequired()&&"undefined"==typeof this.options.validateIfEmpty)},_isInGroup:function(t){return e.isArray(this.options.group)?-1!==e.inArray(t,this.options.group):this.options.group===t},isValid:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){o.warnOnce("Calling isValid on a parsley field without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1];t={force:n,value:r}}var s=this.whenValid(t);return s?x[s.state()]:!0},whenValid:function(){var t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.force,r=void 0===n?!1:n,s=i.value,a=i.group,l=i._refreshed;if(l||this.refreshConstraints(),!a||this._isInGroup(a)){if(this.validationResult=!0,!this.hasConstraints())return e.when();if("undefined"!=typeof s&&null!==s||(s=this.getValue()),!this.needsValidation(s)&&!0!==r)return e.when();var u=this._getGroupedConstraints(),d=[];return e.each(u,function(i,n){var r=o.all(e.map(n,function(e){return t._validateConstraint(s,e)}));return d.push(r),"rejected"===r.state()?!1:void 0}),o.all(d)}},_validateConstraint:function(t,i){var n=this,r=i.validate(t,this);return!1===r&&(r=e.Deferred().reject()),o.all([r]).fail(function(e){n.validationResult instanceof Array||(n.validationResult=[]),n.validationResult.push({assert:i,errorMessage:"string"==typeof e&&e})})},getValue:function(){var e;return e="function"==typeof this.options.value?this.options.value(this):"undefined"!=typeof this.options.value?this.options.value:this.$element.val(),"undefined"==typeof e||null===e?"":this._handleWhitespace(e)},refreshConstraints:function(){return this.actualizeOptions()._bindConstraints()},addConstraint:function(e,t,i,n){if(window.Parsley._validatorRegistry.validators[e]){var r=new F(this,e,t,i,n);"undefined"!==this.constraintsByName[r.name]&&this.removeConstraint(r.name),this.constraints.push(r),this.constraintsByName[r.name]=r}return this},removeConstraint:function(e){for(var t=0;t1){var i=[];return this.each(function(){i.push(e(this).parsley(t))}),i}return e(this).length?new V(this,t):void o.warn("You must bind Parsley on an existing element.")},"undefined"==typeof window.ParsleyExtend&&(window.ParsleyExtend={}),O.options=e.extend(o.objectCreate(l),window.ParsleyConfig),window.ParsleyConfig=O.options,window.Parsley=window.psly=O,window.ParsleyUtils=o;var A=window.Parsley._validatorRegistry=new m(window.ParsleyConfig.validators,window.ParsleyConfig.i18n);window.ParsleyValidator={},e.each("setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator".split(" "),function(t,i){window.Parsley[i]=e.proxy(A,i),window.ParsleyValidator[i]=function(){var e;return o.warnOnce("Accessing the method '"+i+"' through ParsleyValidator is deprecated. Simply call 'window.Parsley."+i+"(...)'"),(e=window.Parsley)[i].apply(e,arguments)}}),window.Parsley.UI=y,window.ParsleyUI={removeError:function(e,t,i){var n=!0!==i;return o.warnOnce("Accessing ParsleyUI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method."),e.removeError(t,{updateClass:n})},getErrorsMessages:function(e){return o.warnOnce("Accessing ParsleyUI is deprecated. Call 'getErrorsMessages' on the instance directly."),e.getErrorsMessages()}},e.each("addError updateError".split(" "),function(e,t){window.ParsleyUI[t]=function(e,i,n,r,s){var a=!0!==s;return o.warnOnce("Accessing ParsleyUI is deprecated. Call '"+t+"' on the instance directly. Please comment in issue 1073 as to your need to call this method."),e[t](i,{message:n,assert:r,updateClass:a})}}),!1!==window.ParsleyConfig.autoBind&&e(function(){e("[data-parsley-validate]").length&&e("[data-parsley-validate]").parsley()});var R=e({}),T=function(){o.warnOnce("Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley")},q="parsley:";e.listen=function(e,n){var r;if(T(),"object"==typeof arguments[1]&&"function"==typeof arguments[2]&&(r=arguments[1],n=arguments[2]),"function"!=typeof n)throw new Error("Wrong parameters");window.Parsley.on(i(e),t(n,r))},e.listenTo=function(e,n,r){if(T(),!(e instanceof E||e instanceof w))throw new Error("Must give Parsley instance");if("string"!=typeof n||"function"!=typeof r)throw new Error("Wrong parameters");e.on(i(n),t(r))},e.unsubscribe=function(e,t){if(T(),"string"!=typeof e||"function"!=typeof t)throw new Error("Wrong arguments");window.Parsley.off(i(e),t.parsleyAdaptedCallback)},e.unsubscribeTo=function(e,t){if(T(),!(e instanceof E||e instanceof w))throw new Error("Must give Parsley instance");e.off(i(t))},e.unsubscribeAll=function(t){T(),window.Parsley.off(i(t)),e("form,input,textarea,select").each(function(){var n=e(this).data("Parsley");n&&n.off(i(t))})},e.emit=function(e,t){var n;T();var r=t instanceof E||t instanceof w,s=Array.prototype.slice.call(arguments,r?2:1);s.unshift(i(e)),r||(t=window.Parsley),(n=t).trigger.apply(n,_toConsumableArray(s))};e.extend(!0,O,{asyncValidators:{"default":{fn:function(e){return e.status>=200&&e.status<300},url:!1},reverse:{fn:function(e){return e.status<200||e.status>=300},url:!1}},addAsyncValidator:function(e,t,i,n){return O.asyncValidators[e]={fn:t,url:i||!1,options:n||{}},this}}),O.addValidator("remote",{requirementType:{"":"string",validator:"string",reverse:"boolean",options:"object"},validateString:function(t,i,n,r){var s,a,o={},l=n.validator||(!0===n.reverse?"reverse":"default");if("undefined"==typeof O.asyncValidators[l])throw new Error("Calling an undefined async validator: `"+l+"`");i=O.asyncValidators[l].url||i,i.indexOf("{value}")>-1?i=i.replace("{value}",encodeURIComponent(t)):o[r.$element.attr("name")||r.$element.attr("id")]=t;var u=e.extend(!0,n.options||{},O.asyncValidators[l].options);s=e.extend(!0,{},{url:i,data:o,type:"GET"},u),r.trigger("field:ajaxoptions",r,s),a=e.param(s),"undefined"==typeof O._remoteCache&&(O._remoteCache={});var d=O._remoteCache[a]=O._remoteCache[a]||e.ajax(s),h=function(){var t=O.asyncValidators[l].fn.call(r,d,i,n);return t||(t=e.Deferred().reject()),e.when(t)};return d.then(h,h)},priority:-1}),O.on("form:submit",function(){O._remoteCache={}}),window.ParsleyExtend.addAsyncValidator=function(){return ParsleyUtils.warnOnce("Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`"),O.addAsyncValidator.apply(O,arguments)},O.addMessages("en",{defaultMessage:"This value seems to be invalid.",type:{email:"This value should be a valid email.",url:"This value should be a valid url.",number:"This value should be a valid number.",integer:"This value should be a valid integer.",digits:"This value should be digits.",alphanum:"This value should be alphanumeric."},notblank:"This value should not be blank.",required:"This value is required.",pattern:"This value seems to be invalid.",min:"This value should be greater than or equal to %s.",max:"This value should be lower than or equal to %s.",range:"This value should be between %s and %s.",minlength:"This value is too short. It should have %s characters or more.",maxlength:"This value is too long. It should have %s characters or fewer.",length:"This value length is invalid. It should be between %s and %s characters long.",mincheck:"You must select at least %s choices.",maxcheck:"You must select %s choices or fewer.",check:"You must select between %s and %s choices.",equalto:"This value should be the same."}),O.setLocale("en");var D=new n;D.install();var I=O;return I}); +function n(){var t=this,i=window||global;e.extend(this,{isNativeEvent:function(e){return e.originalEvent&&e.originalEvent.isTrusted!==!1},fakeInputEvent:function(i){t.isNativeEvent(i)&&e(i.target).trigger("input")},misbehaves:function(i){t.isNativeEvent(i)&&(t.behavesOk(i),e(document).on("change.inputevent",i.data.selector,t.fakeInputEvent),t.fakeInputEvent(i))},behavesOk:function(i){t.isNativeEvent(i)&&e(document).off("input.inputevent",i.data.selector,t.behavesOk).off("change.inputevent",i.data.selector,t.misbehaves)},install:function(){if(!i.inputEventPatched){i.inputEventPatched="0.0.3";for(var n=["select",'input[type="checkbox"]','input[type="radio"]','input[type="file"]'],r=0;r1)throw Error("Second argument not supported");if("object"!=typeof t)throw TypeError("Argument must be an object");e.prototype=t;var i=new e;return e.prototype=null,i}}()},o=a,l={namespace:"data-parsley-",inputs:"input, textarea, select",excluded:"input[type=button], input[type=submit], input[type=reset], input[type=hidden]",priorityEnabled:!0,multiple:null,group:null,uiEnabled:!0,validationThreshold:3,focus:"first",trigger:!1,triggerAfterFailure:"input",errorClass:"parsley-error",successClass:"parsley-success",classHandler:function(e){},errorsContainer:function(e){},errorsWrapper:'
              ',errorTemplate:"
            • "},u=function(){this.__id__=o.generateID()};u.prototype={asyncSupport:!0,_pipeAccordingToValidationResult:function(){var t=this,i=function(){var i=e.Deferred();return!0!==t.validationResult&&i.reject(),i.resolve().promise()};return[i,i]},actualizeOptions:function(){return o.attr(this.$element,this.options.namespace,this.domOptions),this.parent&&this.parent.actualizeOptions&&this.parent.actualizeOptions(),this},_resetOptions:function(e){this.domOptions=o.objectCreate(this.parent.options),this.options=o.objectCreate(this.domOptions);for(var t in e)e.hasOwnProperty(t)&&(this.options[t]=e[t]);this.actualizeOptions()},_listeners:null,on:function(e,t){this._listeners=this._listeners||{};var i=this._listeners[e]=this._listeners[e]||[];return i.push(t),this},subscribe:function(t,i){e.listenTo(this,t.toLowerCase(),i)},off:function(e,t){var i=this._listeners&&this._listeners[e];if(i)if(t)for(var n=i.length;n--;)i[n]===t&&i.splice(n,1);else delete this._listeners[e];return this},unsubscribe:function(t,i){e.unsubscribeTo(this,t.toLowerCase())},trigger:function(e,t,i){t=t||this;var n,r=this._listeners&&this._listeners[e];if(r)for(var s=r.length;s--;)if(n=r[s].call(t,t,i),n===!1)return n;return!this.parent||this.parent.trigger(e,t,i)},reset:function(){if("ParsleyForm"!==this.__class__)return this._resetUI(),this._trigger("reset");for(var e=0;e3&&(i=[].slice.call(arguments,1,-1)),this.fn.call(this,t,i);if(e.isArray(t)){if(!this.validateMultiple)throw"Validator `"+this.name+"` does not handle multiple values";return this.validateMultiple.apply(this,arguments)}if(this.validateNumber)return!isNaN(t)&&(arguments[0]=parseFloat(arguments[0]),this.validateNumber.apply(this,arguments));if(this.validateString)return this.validateString.apply(this,arguments);throw"Validator `"+this.name+"` only handles multiple values"},parseRequirements:function(t,i){if("string"!=typeof t)return e.isArray(t)?t:[t];var n=this.requirementType;if(e.isArray(n)){for(var r=h(t,n.length),s=0;s0},validateString:function(e){return/\S/.test(e)},priority:512},type:{validateString:function(e,t){var i=arguments.length<=2||void 0===arguments[2]?{}:arguments[2],n=i.step,r=void 0===n?"1":n,s=i.base,a=void 0===s?0:s,o=g[t];if(!o)throw new Error("validator type `"+t+"` is not supported");if(!o.test(e))return!1;if("number"===t&&!/^any$/i.test(r||"")){var l=Number(e),u=Math.max(v(r),v(a));if(v(l)>u)return!1;var d=function(e){return Math.round(e*Math.pow(10,u))};if((d(l)-d(a))%d(r)!=0)return!1}return!0},requirementType:{"":"string",step:"string",base:"number"},priority:256},pattern:{validateString:function(e,t){return t.test(e)},requirementType:"regexp",priority:64},minlength:{validateString:function(e,t){return e.length>=t},requirementType:"integer",priority:30},maxlength:{validateString:function(e,t){return e.length<=t},requirementType:"integer",priority:30},length:{validateString:function(e,t,i){return e.length>=t&&e.length<=i},requirementType:["integer","integer"],priority:30},mincheck:{validateMultiple:function(e,t){return e.length>=t},requirementType:"integer",priority:30},maxcheck:{validateMultiple:function(e,t){return e.length<=t},requirementType:"integer",priority:30},check:{validateMultiple:function(e,t,i){return e.length>=t&&e.length<=i},requirementType:["integer","integer"],priority:30},min:{validateNumber:function(e,t){return e>=t},requirementType:"number",priority:30},max:{validateNumber:function(e,t){return e<=t},requirementType:"number",priority:30},range:{validateNumber:function(e,t,i){return e>=t&&e<=i},requirementType:["number","number"],priority:30},equalto:{validateString:function(t,i){var n=e(i);return n.length?t===n.val():t===i},priority:256}}};var y={},_=function j(e,t,i){for(var n=[],r=[],s=0;s0&&"undefined"==typeof t.options.noFocus&&(this._focusedField=t.$element,"first"===this.options.focus))break}return null===this._focusedField?null:this._focusedField.focus()},_destroyUI:function(){this.$element.off(".Parsley")}},y.Field={_reflowUI:function(){if(this._buildUI(),this._ui){var e=_(this.validationResult,this._ui.lastValidationResult);this._ui.lastValidationResult=this.validationResult,this._manageStatusClass(),this._manageErrorsMessages(e),this._actualizeTriggers(),!e.kept.length&&!e.added.length||this._failedOnce||(this._failedOnce=!0,this._actualizeTriggers())}},getErrorsMessages:function(){if(!0===this.validationResult)return[];for(var e=[],t=0;t0?this._errorClass():this._resetClass()},_manageErrorsMessages:function(t){if("undefined"==typeof this.options.errorsMessagesDisabled){if("undefined"!=typeof this.options.errorMessage)return t.added.length||t.kept.length?(this._insertErrorWrapper(),0===this._ui.$errorsWrapper.find(".parsley-custom-error-message").length&&this._ui.$errorsWrapper.append(e(this.options.errorTemplate).addClass("parsley-custom-error-message")),this._ui.$errorsWrapper.addClass("filled").find(".parsley-custom-error-message").html(this.options.errorMessage)):this._ui.$errorsWrapper.removeClass("filled").find(".parsley-custom-error-message").remove();for(var i=0;i').appendTo(this.$element)),i.attr({name:t.attr("name"),value:t.attr("value")})}this.$element.trigger(e.extend(e.Event("submit"),{parsley:!0}))}},validate:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){o.warnOnce("Calling validate on a parsley form without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1],s=i[2];t={group:n,force:r,event:s}}return b[this.whenValidate(t).state()]},whenValidate:function(){var t,i=this,n=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],r=n.group,s=n.force,a=n.event;this.submitEvent=a,a&&(this.submitEvent=e.extend({},a,{preventDefault:function(){o.warnOnce("Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`"),i.validationResult=!1}})),this.validationResult=!0,this._trigger("validate"),this._refreshFields();var l=this._withoutReactualizingFormOptions(function(){return e.map(i.fields,function(e){return e.whenValidate({force:s,group:r})})});return(t=o.all(l).done(function(){i._trigger("success")}).fail(function(){i.validationResult=!1,i.focus(),i._trigger("error")}).always(function(){i._trigger("validated")})).pipe.apply(t,_toConsumableArray(this._pipeAccordingToValidationResult()))},isValid:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){o.warnOnce("Calling isValid on a parsley form without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1];t={group:n,force:r}}return b[this.whenValid(t).state()]},whenValid:function(){var t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.group,r=i.force;this._refreshFields();var s=this._withoutReactualizingFormOptions(function(){return e.map(t.fields,function(e){return e.whenValid({group:n,force:r})})});return o.all(s)},_refreshFields:function(){return this.actualizeOptions()._bindFields()},_bindFields:function(){var t=this,i=this.fields;return this.fields=[],this.fieldsMappedById={},this._withoutReactualizingFormOptions(function(){t.$element.find(t.options.inputs).not(t.options.excluded).each(function(e,i){var n=new window.Parsley.Factory(i,{},t);"ParsleyField"!==n.__class__&&"ParsleyFieldMultiple"!==n.__class__||!0===n.options.excluded||"undefined"==typeof t.fieldsMappedById[n.__class__+"-"+n.__id__]&&(t.fieldsMappedById[n.__class__+"-"+n.__id__]=n,t.fields.push(n))}),e.each(o.difference(i,t.fields),function(e,t){t._trigger("reset")})}),this},_withoutReactualizingFormOptions:function(e){var t=this.actualizeOptions;this.actualizeOptions=function(){return this};var i=e();return this.actualizeOptions=t,i},_trigger:function(e){return this.trigger("form:"+e)}};var $=function(t,i,n,r,s){if(!/ParsleyField/.test(t.__class__))throw new Error("ParsleyField or ParsleyFieldMultiple instance expected");var a=window.Parsley._validatorRegistry.validators[i],o=new f(a);e.extend(this,{validator:o,name:i,requirements:n,priority:r||t.options[i+"Priority"]||o.priority,isDomConstraint:!0===s}),this._parseRequirements(t.options)},C=function(e){var t=e[0].toUpperCase();return t+e.slice(1)};$.prototype={validate:function(e,t){var i;return(i=this.validator).validate.apply(i,[e].concat(_toConsumableArray(this.requirementList),[t]))},_parseRequirements:function(e){var t=this;this.requirementList=this.validator.parseRequirements(this.requirements,function(i){return e[t.name+C(i)]})}};var P=function(t,i,n,r){this.__class__="ParsleyField",this.$element=e(t),"undefined"!=typeof r&&(this.parent=r),this.options=n,this.domOptions=i,this.constraints=[],this.constraintsByName={},this.validationResult=!0,this._bindConstraints()},E={pending:null,resolved:!0,rejected:!1};P.prototype={validate:function(t){arguments.length>=1&&!e.isPlainObject(t)&&(o.warnOnce("Calling validate on a parsley field without passing arguments as an object is deprecated."),t={options:t});var i=this.whenValidate(t);if(!i)return!0;switch(i.state()){case"pending":return null;case"resolved":return!0;case"rejected":return this.validationResult}},whenValidate:function(){var e,t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.force,r=i.group;if(this.refreshConstraints(),!r||this._isInGroup(r))return this.value=this.getValue(),this._trigger("validate"),(e=this.whenValid({force:n,value:this.value,_refreshed:!0}).always(function(){t._reflowUI()}).done(function(){t._trigger("success")}).fail(function(){t._trigger("error")}).always(function(){t._trigger("validated")})).pipe.apply(e,_toConsumableArray(this._pipeAccordingToValidationResult()))},hasConstraints:function(){return 0!==this.constraints.length},needsValidation:function(e){return"undefined"==typeof e&&(e=this.getValue()),!(!e.length&&!this._isRequired()&&"undefined"==typeof this.options.validateIfEmpty)},_isInGroup:function(t){return e.isArray(this.options.group)?-1!==e.inArray(t,this.options.group):this.options.group===t},isValid:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){o.warnOnce("Calling isValid on a parsley field without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1];t={force:n,value:r}}var s=this.whenValid(t);return!s||E[s.state()]},whenValid:function(){var t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.force,r=void 0!==n&&n,s=i.value,a=i.group,l=i._refreshed;if(l||this.refreshConstraints(),!a||this._isInGroup(a)){if(this.validationResult=!0,!this.hasConstraints())return e.when();if("undefined"!=typeof s&&null!==s||(s=this.getValue()),!this.needsValidation(s)&&!0!==r)return e.when();var u=this._getGroupedConstraints(),d=[];return e.each(u,function(i,n){var r=o.all(e.map(n,function(e){return t._validateConstraint(s,e)}));if(d.push(r),"rejected"===r.state())return!1}),o.all(d)}},_validateConstraint:function(t,i){var n=this,r=i.validate(t,this);return!1===r&&(r=e.Deferred().reject()),o.all([r]).fail(function(e){n.validationResult instanceof Array||(n.validationResult=[]),n.validationResult.push({assert:i,errorMessage:"string"==typeof e&&e})})},getValue:function(){var e;return e="function"==typeof this.options.value?this.options.value(this):"undefined"!=typeof this.options.value?this.options.value:this.$element.val(),"undefined"==typeof e||null===e?"":this._handleWhitespace(e)},refreshConstraints:function(){return this.actualizeOptions()._bindConstraints()},addConstraint:function(e,t,i,n){if(window.Parsley._validatorRegistry.validators[e]){var r=new $(this,e,t,i,n);"undefined"!==this.constraintsByName[r.name]&&this.removeConstraint(r.name),this.constraints.push(r),this.constraintsByName[r.name]=r}return this},removeConstraint:function(e){for(var t=0;t1){var i=[];return this.each(function(){i.push(e(this).parsley(t))}),i}return e(this).length?new M(this,t):void o.warn("You must bind Parsley on an existing element.")},"undefined"==typeof window.ParsleyExtend&&(window.ParsleyExtend={}),R.options=e.extend(o.objectCreate(l),window.ParsleyConfig),window.ParsleyConfig=R.options,window.Parsley=window.psly=R,window.ParsleyUtils=o;var T=window.Parsley._validatorRegistry=new m(window.ParsleyConfig.validators,window.ParsleyConfig.i18n);window.ParsleyValidator={},e.each("setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator".split(" "),function(t,i){window.Parsley[i]=e.proxy(T,i),window.ParsleyValidator[i]=function(){var e;return o.warnOnce("Accessing the method '"+i+"' through ParsleyValidator is deprecated. Simply call 'window.Parsley."+i+"(...)'"),(e=window.Parsley)[i].apply(e,arguments)}}),window.Parsley.UI=y,window.ParsleyUI={removeError:function(e,t,i){var n=!0!==i;return o.warnOnce("Accessing ParsleyUI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method."),e.removeError(t,{updateClass:n})},getErrorsMessages:function(e){return o.warnOnce("Accessing ParsleyUI is deprecated. Call 'getErrorsMessages' on the instance directly."),e.getErrorsMessages()}},e.each("addError updateError".split(" "),function(e,t){window.ParsleyUI[t]=function(e,i,n,r,s){var a=!0!==s;return o.warnOnce("Accessing ParsleyUI is deprecated. Call '"+t+"' on the instance directly. Please comment in issue 1073 as to your need to call this method."),e[t](i,{message:n,assert:r,updateClass:a})}}),!1!==window.ParsleyConfig.autoBind&&e(function(){e("[data-parsley-validate]").length&&e("[data-parsley-validate]").parsley()});var q=e({}),A=function(){o.warnOnce("Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley")},I="parsley:";e.listen=function(e,n){var r;if(A(),"object"==typeof arguments[1]&&"function"==typeof arguments[2]&&(r=arguments[1],n=arguments[2]),"function"!=typeof n)throw new Error("Wrong parameters");window.Parsley.on(i(e),t(n,r))},e.listenTo=function(e,n,r){if(A(),!(e instanceof V||e instanceof w))throw new Error("Must give Parsley instance");if("string"!=typeof n||"function"!=typeof r)throw new Error("Wrong parameters");e.on(i(n),t(r))},e.unsubscribe=function(e,t){if(A(),"string"!=typeof e||"function"!=typeof t)throw new Error("Wrong arguments");window.Parsley.off(i(e),t.parsleyAdaptedCallback)},e.unsubscribeTo=function(e,t){if(A(),!(e instanceof V||e instanceof w))throw new Error("Must give Parsley instance");e.off(i(t))},e.unsubscribeAll=function(t){A(),window.Parsley.off(i(t)),e("form,input,textarea,select").each(function(){var n=e(this).data("Parsley");n&&n.off(i(t))})},e.emit=function(e,t){var n;A();var r=t instanceof V||t instanceof w,s=Array.prototype.slice.call(arguments,r?2:1);s.unshift(i(e)),r||(t=window.Parsley),(n=t).trigger.apply(n,_toConsumableArray(s))};e.extend(!0,R,{asyncValidators:{"default":{fn:function(e){return e.status>=200&&e.status<300},url:!1},reverse:{fn:function(e){return e.status<200||e.status>=300},url:!1}},addAsyncValidator:function(e,t,i,n){return R.asyncValidators[e]={fn:t,url:i||!1,options:n||{}},this}}),R.addValidator("remote",{requirementType:{"":"string",validator:"string",reverse:"boolean",options:"object"},validateString:function(t,i,n,r){var s,a,o={},l=n.validator||(!0===n.reverse?"reverse":"default");if("undefined"==typeof R.asyncValidators[l])throw new Error("Calling an undefined async validator: `"+l+"`");i=R.asyncValidators[l].url||i,i.indexOf("{value}")>-1?i=i.replace("{value}",encodeURIComponent(t)):o[r.$element.attr("name")||r.$element.attr("id")]=t;var u=e.extend(!0,n.options||{},R.asyncValidators[l].options);s=e.extend(!0,{},{url:i,data:o,type:"GET"},u),r.trigger("field:ajaxoptions",r,s),a=e.param(s),"undefined"==typeof R._remoteCache&&(R._remoteCache={});var d=R._remoteCache[a]=R._remoteCache[a]||e.ajax(s),h=function(){var t=R.asyncValidators[l].fn.call(r,d,i,n);return t||(t=e.Deferred().reject()),e.when(t)};return d.then(h,h)},priority:-1}),R.on("form:submit",function(){R._remoteCache={}}),window.ParsleyExtend.addAsyncValidator=function(){return ParsleyUtils.warnOnce("Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`"),R.addAsyncValidator.apply(R,arguments)},R.addMessages("en",{defaultMessage:"This value seems to be invalid.",type:{email:"This value should be a valid email.",url:"This value should be a valid url.",number:"This value should be a valid number.",integer:"This value should be a valid integer.",digits:"This value should be digits.",alphanum:"This value should be alphanumeric."},notblank:"This value should not be blank.",required:"This value is required.",pattern:"This value seems to be invalid.",min:"This value should be greater than or equal to %s.",max:"This value should be lower than or equal to %s.",range:"This value should be between %s and %s.",minlength:"This value is too short. It should have %s characters or more.",maxlength:"This value is too long. It should have %s characters or fewer.",length:"This value length is invalid. It should be between %s and %s characters long.",mincheck:"You must select at least %s choices.",maxcheck:"You must select %s choices or fewer.",check:"You must select between %s and %s choices.",equalto:"This value should be the same."}),R.setLocale("en");var F=new n;F.install();var k=R;return k}); //# sourceMappingURL=parsley.min.js.map diff --git a/dist/parsley.min.js.map b/dist/parsley.min.js.map index e9140bf97..3f7d0f12c 100644 --- a/dist/parsley.min.js.map +++ b/dist/parsley.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["parsley.min.js","/source/parsley.js","/source/src/parsley/pubsub.js","/source/src/vendor/inputevent.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":["_toConsumableArray","arr","Array","isArray","i","arr2","length","from","_slice","prototype","slice","global","factory","exports","module","require","define","amd","parsley","jQuery","this","$","adapt","fn","context","parsleyAdaptedCallback","args","call","arguments","unshift","apply","o","eventName","name","lastIndexOf","eventPrefix","substr","InputEvent","_this13","globals","window","extend","isNativeEvent","evt","originalEvent","isTrusted","fakeInputEvent","target","trigger","misbehaves","behavesOk","document","on","data","selector","off","install","inputEventPatched","_arr","_i","uninstall","globalID","pastWarnings","ParsleyUtils__ParsleyUtils","attr","$element","namespace","obj","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","console","warnOnce","msg","_resetWarnings","trimString","string","namespaceEvents","events","split","map","join","difference","array","remove","result","each","_","elem","indexOf","push","all","promises","when","concat","objectCreate","Object","create","Error","TypeError","ParsleyUtils__default","ParsleyDefaults","inputs","excluded","priorityEnabled","multiple","group","uiEnabled","validationThreshold","focus","triggerAfterFailure","errorClass","successClass","classHandler","ParsleyField","errorsContainer","errorsWrapper","errorTemplate","ParsleyAbstract","__id__","asyncSupport","_pipeAccordingToValidationResult","_this","pipe","r","Deferred","validationResult","reject","resolve","promise","actualizeOptions","options","domOptions","parent","_resetOptions","initOptions","_listeners","queue","subscribe","listenTo","splice","unsubscribe","unsubscribeTo","extraArg","reset","__class__","_resetUI","_trigger","fields","destroy","_destroyUI","removeData","asyncIsValid","force","whenValid","_findRelated","find","requirementConverters","_string","integer","parseInt","number","parseFloat","reference","boolean","object","regexp","_regexp","flags","convertArrayRequirement","m","values","convertRequirement","requirementType","converter","convertExtraOptionRequirement","requirementSpec","extraOptionReader","main","extra","key","ParsleyValidator","spec","validate","requirementFirstArg","validateMultiple","validateNumber","validateString","parseRequirements","requirements","type","isPlainObject","priority","ParsleyValidatorRegistry","validators","catalog","locale","init","typeRegexes","email","digits","alphanum","url","range","decimalPlaces","Math","max","addValidator","Parsley","setLocale","addCatalog","messages","set","addMessage","message","addMessages","nameMessageObject","arg1","arg2","_setValidator","updateValidator","removeValidator","validator","getErrorMessage","constraint","typeMessages","formatMessage","defaultMessage","en","parameters","notblank","required","_ref","undefined","_ref$step","step","_ref$base","base","nb","decimals","toInt","f","round","pow","","pattern","minlength","requirement","maxlength","min","mincheck","maxcheck","check","equalto","refOrValue","$reference","val","ParsleyUI","diffResults","newResult","oldResult","deep","added","kept","found","j","assert","removed","Form","_actualizeTriggers","_this2","onSubmitValidate","onSubmitButton","_focusedField","field","noFocus","Field","_reflowUI","_buildUI","_ui","diff","lastValidationResult","_manageStatusClass","_manageErrorsMessages","_failedOnce","getErrorsMessages","errorMessage","_getErrorMessage","addError","_ref2","_ref2$updateClass","updateClass","_addError","_errorClass","updateError","_ref3","_ref3$updateClass","_updateError","removeError","_ref4","_ref4$updateClass","_removeError","hasConstraints","needsValidation","_successClass","_resetClass","errorsMessagesDisabled","_insertErrorWrapper","$errorsWrapper","append","addClass","html","removeClass","_ref5","_ref6","customConstraintErrorMessage","$errorClassHandler","_manageClassHandler","errorsWrapperId","validationInformationVisible","$handler","$errorsContainer","$from","after","_this3","$toBind","event","_eventValidate","getValue","children","ParsleyForm","element","ParsleyForm__statusMapping","pending","resolved","rejected","_this4","$submitSource","_$submitSource","first","prop","whenValidate","state","stopImmediatePropagation","preventDefault","done","_submit","currentTarget","$synthetic","appendTo","Event","_arguments","_ParsleyUtils__default$all$done$fail$always","_this5","_ref7","submitEvent","_refreshFields","_withoutReactualizingFormOptions","fail","always","isValid","_arguments2","_this6","_ref8","_bindFields","_this7","oldFields","fieldsMappedById","not","fieldInstance","Factory","oldActualizeOptions","ConstraintFactory","parsleyField","isDomConstraint","validatorSpec","_validatorRegistry","_parseRequirements","capitalize","cap","instance","_validator","requirementList","_this8","parsleyFormInstance","constraints","constraintsByName","_bindConstraints","parsley_field__statusMapping","_whenValid$always$done$fail$always","_this9","_ref9","refreshConstraints","_isInGroup","_refreshed","_isRequired","validateIfEmpty","inArray","_arguments3","_this10","_ref10","_ref10$force","groupedConstraints","_getGroupedConstraints","_validateConstraint","_this11","_handleWhitespace","addConstraint","removeConstraint","updateConstraint","_bindHtml5Constraints","hasClass","trimValue","whitespace","index","p","sort","a","b","parsley_field","ParsleyMultiple","addElement","$elements","fieldConstraints","has","filter","_init","ParsleyFactory","savedparsleyFormInstance","__version__","bind","isMultiple","handleMultiple","parsleyMultipleInstance","_this12","input","$previouslyRelated","get","doNotStore","parsleyInstance","ParsleyExtend","vernums","jquery","forEach","version","psly","instances","ParsleyConfig","ParsleyUtils","registry","i18n","method","proxy","_window$Parsley","UI","doNotUpdateClass","autoBind","deprecated","listen","callback","unsubscribeAll","emit","_instance","instanceGiven","asyncValidators","default","xhr","status","reverse","addAsyncValidator","ajaxOptions","csr","encodeURIComponent","remoteOptions","param","_remoteCache","ajax","handleXhr","then","inputevent"],"mappings":"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","file":"parsley.min.js","sourcesContent":["/*!\n* Parsley.js\n* Version 2.4.3 - built Sat, Jun 18th 2016, 9:01 pm\n* http://parsleyjs.org\n* Guillaume Potier - \n* Marc-Andre Lafortune - \n* MIT Licensed\n*/\n\n// The source code below is generated by babel as\n// Parsley is written in ECMAScript 6\n//\nvar _slice = Array.prototype.slice;\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) : typeof define === 'function' && define.amd ? define(['jquery'], factory) : global.parsley = factory(global.jQuery);\n})(this, function ($) {\n 'use strict';\n\n var globalID = 1;\n var pastWarnings = {};\n\n var ParsleyUtils__ParsleyUtils = {\n // Parsley DOM-API\n // returns object from dom attributes and values\n attr: function attr($element, namespace, obj) {\n var i;\n var attribute;\n var attributes;\n var regex = new RegExp('^' + namespace, 'i');\n\n if ('undefined' === typeof obj) obj = {};else {\n // Clear all own properties. This won't affect prototype's values\n for (i in obj) {\n if (obj.hasOwnProperty(i)) delete obj[i];\n }\n }\n\n if ('undefined' === typeof $element || 'undefined' === typeof $element[0]) return obj;\n\n attributes = $element[0].attributes;\n for (i = attributes.length; i--;) {\n attribute = attributes[i];\n\n if (attribute && attribute.specified && regex.test(attribute.name)) {\n obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n }\n }\n\n return obj;\n },\n\n checkAttr: function checkAttr($element, namespace, _checkAttr) {\n return $element.is('[' + namespace + _checkAttr + ']');\n },\n\n setAttr: function setAttr($element, namespace, attr, value) {\n $element[0].setAttribute(this.dasherize(namespace + attr), String(value));\n },\n\n generateID: function generateID() {\n return '' + globalID++;\n },\n\n /** Third party functions **/\n // Zepto deserialize function\n deserializeValue: function deserializeValue(value) {\n var num;\n\n try {\n return value ? value == \"true\" || (value == \"false\" ? false : value == \"null\" ? null : !isNaN(num = Number(value)) ? num : /^[\\[\\{]/.test(value) ? $.parseJSON(value) : value) : value;\n } catch (e) {\n return value;\n }\n },\n\n // Zepto camelize function\n camelize: function camelize(str) {\n return str.replace(/-+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n });\n },\n\n // Zepto dasherize function\n dasherize: function dasherize(str) {\n return str.replace(/::/g, '/').replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2').replace(/([a-z\\d])([A-Z])/g, '$1_$2').replace(/_/g, '-').toLowerCase();\n },\n\n warn: function warn() {\n var _window$console;\n\n if (window.console && 'function' === typeof window.console.warn) (_window$console = window.console).warn.apply(_window$console, arguments);\n },\n\n warnOnce: function warnOnce(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn.apply(this, arguments);\n }\n },\n\n _resetWarnings: function _resetWarnings() {\n pastWarnings = {};\n },\n\n trimString: function trimString(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n namespaceEvents: function namespaceEvents(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0]) return '';\n return $.map(events, function (evt) {\n return evt + '.' + namespace;\n }).join(' ');\n },\n\n difference: function difference(array, remove) {\n // This is O(N^2), should be optimized\n var result = [];\n $.each(array, function (_, elem) {\n if (remove.indexOf(elem) == -1) result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function all(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when.apply($, _toConsumableArray(promises).concat([42, 42]));\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function Object() {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })()\n };\n\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(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function classHandler(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 errorsContainer(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 ParsleyAbstract() {\n this.__id__ = ParsleyUtils__default.generateID();\n };\n\n ParsleyAbstract.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function _pipeAccordingToValidationResult() {\n var _this = this;\n\n var pipe = function pipe() {\n var r = $.Deferred();\n if (true !== _this.validationResult) r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function actualizeOptions() {\n ParsleyUtils__default.attr(this.$element, this.options.namespace, this.domOptions);\n if (this.parent && this.parent.actualizeOptions) this.parent.actualizeOptions();\n return this;\n },\n\n _resetOptions: function _resetOptions(initOptions) {\n this.domOptions = 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)) this.options[i] = initOptions[i];\n }\n this.actualizeOptions();\n },\n\n _listeners: null,\n\n // Register a callback for the given event name\n // Callback is called with context as the first argument and the `this`\n // The context is the current parsley instance, or window.Parsley if global\n // A return value of `false` will interrupt the calls\n on: function on(name, fn) {\n this._listeners = this._listeners || {};\n var queue = this._listeners[name] = this._listeners[name] || [];\n queue.push(fn);\n\n return this;\n },\n\n // Deprecated. Use `on` instead\n subscribe: function subscribe(name, fn) {\n $.listenTo(this, name.toLowerCase(), fn);\n },\n\n // Unregister a callback (or all if none is given) for the given event name\n off: function off(name, fn) {\n var queue = this._listeners && this._listeners[name];\n if (queue) {\n if (!fn) {\n delete this._listeners[name];\n } else {\n for (var i = queue.length; i--;) if (queue[i] === fn) queue.splice(i, 1);\n }\n }\n return this;\n },\n\n // Deprecated. Use `off`\n unsubscribe: function unsubscribe(name, fn) {\n $.unsubscribeTo(this, name.toLowerCase());\n },\n\n // Trigger an event of the given name\n // A return value of `false` interrupts the callback chain\n // Returns false if execution was interrupted\n trigger: function trigger(name, target, extraArg) {\n target = target || this;\n var queue = this._listeners && this._listeners[name];\n var result;\n var parentResult;\n if (queue) {\n for (var i = queue.length; i--;) {\n result = queue[i].call(target, target, extraArg);\n if (result === false) return result;\n }\n }\n if (this.parent) {\n return this.parent.trigger(name, target, extraArg);\n }\n return true;\n },\n\n // Reset UI\n reset: function reset() {\n // Field case: just emit a reset event for UI\n if ('ParsleyForm' !== this.__class__) {\n this._resetUI();\n return this._trigger('reset');\n }\n\n // Form case: emit a reset event for each field\n for (var i = 0; i < this.fields.length; i++) this.fields[i].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function destroy() {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n 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++) this.fields[i].destroy();\n\n this.$element.removeData('Parsley');\n this._trigger('destroy');\n },\n\n asyncIsValid: function asyncIsValid(group, force) {\n ParsleyUtils__default.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({ group: group, force: force });\n },\n\n _findRelated: function _findRelated() {\n return this.options.multiple ? this.parent.$element.find('[' + this.options.namespace + 'multiple=\"' + this.options.multiple + '\"]') : this.$element;\n }\n };\n\n var requirementConverters = {\n string: function string(_string) {\n return _string;\n },\n integer: function integer(string) {\n if (isNaN(string)) throw 'Requirement is not an integer: \"' + string + '\"';\n return parseInt(string, 10);\n },\n number: function number(string) {\n if (isNaN(string)) throw 'Requirement is not a number: \"' + string + '\"';\n return parseFloat(string);\n },\n reference: function reference(string) {\n // Unused for now\n var result = $(string);\n if (result.length === 0) throw 'No such reference: \"' + string + '\"';\n return result;\n },\n boolean: function boolean(string) {\n return string !== 'false';\n },\n object: function object(string) {\n return ParsleyUtils__default.deserializeValue(string);\n },\n regexp: function regexp(_regexp) {\n var flags = '';\n\n // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n if (/^\\/.*\\/(?:[gimy]*)$/.test(_regexp)) {\n // Replace the regexp literal string with the first match group: ([gimy]*)\n // If no flag is present, this will be a blank string\n flags = _regexp.replace(/.*\\/([gimy]*)$/, '$1');\n // Again, replace the regexp literal string with the first match group:\n // everything excluding the opening and closing slashes and the flags\n _regexp = _regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n } else {\n // Anchor regexp:\n _regexp = '^' + _regexp + '$';\n }\n return new RegExp(_regexp, flags);\n }\n };\n\n var convertArrayRequirement = function convertArrayRequirement(string, length) {\n var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n if (!m) throw 'Requirement is not an array: \"' + string + '\"';\n var values = m[1].split(',').map(ParsleyUtils__default.trimString);\n if (values.length !== length) throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n return values;\n };\n\n var convertRequirement = function convertRequirement(requirementType, string) {\n var converter = requirementConverters[requirementType || 'string'];\n if (!converter) throw 'Unknown requirement specification: \"' + requirementType + '\"';\n return converter(string);\n };\n\n var convertExtraOptionRequirement = function convertExtraOptionRequirement(requirementSpec, string, extraOptionReader) {\n var main = null;\n var extra = {};\n for (var key in requirementSpec) {\n if (key) {\n var value = extraOptionReader(key);\n if ('string' === typeof value) value = 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 ParsleyValidator(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 validate(value, requirementFirstArg) {\n if (this.fn) {\n // Legacy style validator\n\n if (arguments.length > 3) // If more args then value, requirement, instance...\n requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest\n return this.fn.call(this, value, requirementFirstArg);\n }\n\n if ($.isArray(value)) {\n if (!this.validateMultiple) throw 'Validator `' + this.name + '` does not handle multiple values';\n return this.validateMultiple.apply(this, arguments);\n } else {\n if (this.validateNumber) {\n if (isNaN(value)) return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber.apply(this, arguments);\n }\n if (this.validateString) {\n return this.validateString.apply(this, arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function parseRequirements(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return $.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if ($.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++) values[i] = 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 ParsleyValidatorRegistry(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 // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n url: new RegExp(\"^\" +\n // protocol identifier\n \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" + \"(?:\" +\n // IP address exclusion\n // private & local networks\n // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" + // ** mod: allow local networks\n // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" + \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" + \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" + \"|\" +\n // host name\n '(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)' +\n // domain name\n '(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*' +\n // TLD identifier\n '(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))' + \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:/\\\\S*)?\" + \"$\", 'i')\n };\n typeRegexes.range = typeRegexes.number;\n\n // See http://stackoverflow.com/a/10454560/8279\n var decimalPlaces = function decimalPlaces(num) {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) {\n return 0;\n }\n return Math.max(0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) - (\n // Adjust for scientific notation.\n match[2] ? +match[2] : 0));\n };\n\n ParsleyValidatorRegistry.prototype = {\n init: function init(validators, catalog) {\n this.catalog = catalog;\n // Copy prototype's validators:\n this.validators = $.extend({}, this.validators);\n\n for (var name in validators) this.addValidator(name, validators[name].fn, validators[name].priority);\n\n window.Parsley.trigger('parsley:validator:init');\n },\n\n // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n setLocale: function setLocale(locale) {\n if ('undefined' === typeof this.catalog[locale]) throw new Error(locale + ' is not available in the catalog');\n\n this.locale = locale;\n\n return this;\n },\n\n // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n addCatalog: function addCatalog(locale, messages, set) {\n if ('object' === typeof messages) this.catalog[locale] = messages;\n\n if (true === set) return this.setLocale(locale);\n\n return this;\n },\n\n // Add a specific message for a given constraint in a given locale\n addMessage: function addMessage(locale, name, message) {\n if ('undefined' === typeof this.catalog[locale]) this.catalog[locale] = {};\n\n this.catalog[locale][name] = message;\n\n return this;\n },\n\n // Add messages for a given locale\n addMessages: function addMessages(locale, nameMessageObject) {\n for (var name in nameMessageObject) this.addMessage(locale, name, nameMessageObject[name]);\n\n return this;\n },\n\n // Add a new validator\n //\n // addValidator('custom', {\n // requirementType: ['integer', 'integer'],\n // validateString: function(value, from, to) {},\n // priority: 22,\n // messages: {\n // en: \"Hey, that's no good\",\n // fr: \"Aye aye, pas bon du tout\",\n // }\n // })\n //\n // Old API was addValidator(name, function, priority)\n //\n addValidator: function addValidator(name, arg1, arg2) {\n if (this.validators[name]) ParsleyUtils__default.warn('Validator \"' + name + '\" is already defined.');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 updateValidator(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.apply(this, arguments);\n },\n\n removeValidator: function removeValidator(name) {\n if (!this.validators[name]) ParsleyUtils__default.warn('Validator \"' + name + '\" is not defined.');\n\n delete this.validators[name];\n\n return this;\n },\n\n _setValidator: function _setValidator(name, validator, priority) {\n if ('object' !== typeof validator) {\n // Old style validator, with `fn` and `priority`\n validator = {\n fn: validator,\n priority: priority\n };\n }\n if (!validator.validate) {\n validator = new ParsleyValidator(validator);\n }\n this.validators[name] = validator;\n\n for (var locale in validator.messages || {}) this.addMessage(locale, name, validator.messages[locale]);\n\n return this;\n },\n\n getErrorMessage: function getErrorMessage(constraint) {\n var message;\n\n // Type constraints are a bit different, we have to match their requirements too to find right error message\n if ('type' === constraint.name) {\n var typeMessages = this.catalog[this.locale][constraint.name] || {};\n message = typeMessages[constraint.requirements];\n } else message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n },\n\n // Kind of light `sprintf()` implementation\n formatMessage: function formatMessage(string, parameters) {\n if ('object' === typeof parameters) {\n for (var i in parameters) string = this.formatMessage(string, parameters[i]);\n\n return string;\n }\n\n return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function validateString(value) {\n return (/\\S/.test(value)\n );\n },\n priority: 2\n },\n required: {\n validateMultiple: function validateMultiple(values) {\n return values.length > 0;\n },\n validateString: function validateString(value) {\n return (/\\S/.test(value)\n );\n },\n priority: 512\n },\n type: {\n validateString: function validateString(value, type) {\n var _ref = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\n var _ref$step = _ref.step;\n var step = _ref$step === undefined ? '1' : _ref$step;\n var _ref$base = _ref.base;\n var base = _ref$base === undefined ? 0 : _ref$base;\n\n var regex = typeRegexes[type];\n if (!regex) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!regex.test(value)) return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = function toInt(f) {\n return Math.round(f * Math.pow(10, decimals));\n };\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0) return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function validateString(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function validateString(value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function validateString(value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function validateString(value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function validateMultiple(values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function validateMultiple(values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function validateMultiple(values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: {\n validateNumber: function validateNumber(value, requirement) {\n return value >= requirement;\n },\n requirementType: 'number',\n priority: 30\n },\n max: {\n validateNumber: function validateNumber(value, requirement) {\n return value <= requirement;\n },\n requirementType: 'number',\n priority: 30\n },\n range: {\n validateNumber: function validateNumber(value, min, max) {\n return value >= min && value <= max;\n },\n requirementType: ['number', 'number'],\n priority: 30\n },\n equalto: {\n validateString: function validateString(value, refOrValue) {\n var $reference = $(refOrValue);\n if ($reference.length) return value === $reference.val();else return value === refOrValue;\n },\n priority: 256\n }\n }\n };\n\n var ParsleyUI = {};\n\n var diffResults = function diffResults(newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++) if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found) kept.push(newResult[i]);else added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n };\n\n ParsleyUI.Form = {\n\n _actualizeTriggers: function _actualizeTriggers() {\n var _this2 = this;\n\n this.$element.on('submit.Parsley', function (evt) {\n _this2.onSubmitValidate(evt);\n });\n this.$element.on('click.Parsley', 'input[type=\"submit\"], button[type=\"submit\"]', function (evt) {\n _this2.onSubmitButton(evt);\n });\n\n // UI could be disabled\n if (false === this.options.uiEnabled) return;\n\n this.$element.attr('novalidate', '');\n },\n\n focus: function focus() {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus) return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus) break;\n }\n }\n\n if (null === this._focusedField) return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function _destroyUI() {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n };\n\n ParsleyUI.Field = {\n\n _reflowUI: function _reflowUI() {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui) return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function getErrorsMessages() {\n // No error message, field is valid\n if (true === this.validationResult) return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++) messages.push(this.validationResult[i].errorMessage || this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function addError(name) {\n var _ref2 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var message = _ref2.message;\n var assert = _ref2.assert;\n var _ref2$updateClass = _ref2.updateClass;\n var updateClass = _ref2$updateClass === undefined ? true : _ref2$updateClass;\n\n this._buildUI();\n this._addError(name, { message: message, assert: assert });\n\n if (updateClass) this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function updateError(name) {\n var _ref3 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var message = _ref3.message;\n var assert = _ref3.assert;\n var _ref3$updateClass = _ref3.updateClass;\n var updateClass = _ref3$updateClass === undefined ? true : _ref3$updateClass;\n\n this._buildUI();\n this._updateError(name, { message: message, assert: assert });\n\n if (updateClass) this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function removeError(name) {\n var _ref4 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var _ref4$updateClass = _ref4.updateClass;\n var updateClass = _ref4$updateClass === undefined ? true : _ref4$updateClass;\n\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass) this._manageStatusClass();\n },\n\n _manageStatusClass: function _manageStatusClass() {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult) this._successClass();else if (this.validationResult.length > 0) this._errorClass();else this._resetClass();\n },\n\n _manageErrorsMessages: function _manageErrorsMessages(diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled) return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if (diff.added.length || diff.kept.length) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length) this._ui.$errorsWrapper.append($(this.options.errorTemplate).addClass('parsley-custom-error-message'));\n\n return this._ui.$errorsWrapper.addClass('filled').find('.parsley-custom-error-message').html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper.removeClass('filled').find('.parsley-custom-error-message').remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++) this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++) this._addError(diff.added[i].assert.name, { message: diff.added[i].errorMessage, assert: diff.added[i].assert });\n\n for (i = 0; i < diff.kept.length; i++) this._updateError(diff.kept[i].assert.name, { message: diff.kept[i].errorMessage, assert: diff.kept[i].assert });\n },\n\n _addError: function _addError(name, _ref5) {\n var message = _ref5.message;\n var assert = _ref5.assert;\n\n this._insertErrorWrapper();\n this._ui.$errorsWrapper.addClass('filled').append($(this.options.errorTemplate).addClass('parsley-' + name).html(message || this._getErrorMessage(assert)));\n },\n\n _updateError: function _updateError(name, _ref6) {\n var message = _ref6.message;\n var assert = _ref6.assert;\n\n this._ui.$errorsWrapper.addClass('filled').find('.parsley-' + name).html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function _removeError(name) {\n this._ui.$errorsWrapper.removeClass('filled').find('.parsley-' + name).remove();\n },\n\n _getErrorMessage: function _getErrorMessage(constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage]) return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function _buildUI() {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled) return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function _manageClassHandler() {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length) return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = this.options.classHandler.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length) return $handler;\n\n // Otherwise, if simple element (input, texatrea, select...) it will perfectly host the classes\n if (!this.options.multiple || this.$element.is('select')) return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function _insertErrorWrapper() {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length) return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof this.options.errorsContainer) {\n if ($(this.options.errorsContainer).length) return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);else ParsleyUtils__default.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof this.options.errorsContainer) $errorsContainer = this.options.errorsContainer.call(this, this);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length) return $errorsContainer.append(this._ui.$errorsWrapper);\n\n var $from = this.$element;\n if (this.options.multiple) $from = $from.parent();\n return $from.after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function _actualizeTriggers() {\n var _this3 = this;\n\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce) $toBind.on(ParsleyUtils__default.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), function () {\n _this3.validate();\n });else if (trigger = ParsleyUtils__default.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, function (event) {\n _this3._eventValidate(event);\n });\n }\n },\n\n _eventValidate: function _eventValidate(event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (/key|input/.test(event.type)) if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold) return;\n\n this.validate();\n },\n\n _resetUI: function _resetUI() {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui) return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper.removeClass('filled').children().remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function _destroyUI() {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui) this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function _successClass() {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function _errorClass() {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function _resetClass() {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n };\n\n var ParsleyForm = function ParsleyForm(element, domOptions, options) {\n this.__class__ = 'ParsleyForm';\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 onSubmitValidate(event) {\n var _this4 = this;\n\n // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley) return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var $submitSource = this._$submitSource || this.$element.find('input[type=\"submit\"], button[type=\"submit\"]').first();\n this._$submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if ($submitSource.is('[formnovalidate]')) return;\n\n var promise = this.whenValidate({ event: event });\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state()) promise.done(function () {\n _this4._submit($submitSource);\n });\n }\n },\n\n onSubmitButton: function onSubmitButton(event) {\n this._$submitSource = $(event.currentTarget);\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function _submit($submitSource) {\n if (false === this._trigger('submit')) return;\n // Add submit button's data\n if ($submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length) $synthetic = $('').appendTo(this.$element);\n $synthetic.attr({\n name: $submitSource.attr('name'),\n value: $submitSource.attr('value')\n });\n }\n\n this.$element.trigger($.extend($.Event('submit'), { parsley: true }));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function validate(options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n\n var _arguments = _slice.call(arguments);\n\n var group = _arguments[0];\n var force = _arguments[1];\n var event = _arguments[2];\n\n options = { group: group, force: force, event: event };\n }\n return ParsleyForm__statusMapping[this.whenValidate(options).state()];\n },\n\n whenValidate: function whenValidate() {\n var _ParsleyUtils__default$all$done$fail$always,\n _this5 = this;\n\n var _ref7 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var group = _ref7.group;\n var force = _ref7.force;\n var event = _ref7.event;\n\n this.submitEvent = event;\n if (event) {\n this.submitEvent = $.extend({}, event, { preventDefault: function preventDefault() {\n ParsleyUtils__default.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n _this5.validationResult = false;\n } });\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(function () {\n return $.map(_this5.fields, function (field) {\n return field.whenValidate({ force: force, group: group });\n });\n });\n\n return (_ParsleyUtils__default$all$done$fail$always = ParsleyUtils__default.all(promises).done(function () {\n _this5._trigger('success');\n }).fail(function () {\n _this5.validationResult = false;\n _this5.focus();\n _this5._trigger('error');\n }).always(function () {\n _this5._trigger('validated');\n })).pipe.apply(_ParsleyUtils__default$all$done$fail$always, _toConsumableArray(this._pipeAccordingToValidationResult()));\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function isValid(options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n\n var _arguments2 = _slice.call(arguments);\n\n var group = _arguments2[0];\n var force = _arguments2[1];\n\n options = { group: group, force: force };\n }\n return ParsleyForm__statusMapping[this.whenValid(options).state()];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function whenValid() {\n var _this6 = this;\n\n var _ref8 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var group = _ref8.group;\n var force = _ref8.force;\n\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(function () {\n return $.map(_this6.fields, function (field) {\n return field.whenValid({ group: group, force: force });\n });\n });\n return ParsleyUtils__default.all(promises);\n },\n\n _refreshFields: function _refreshFields() {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function _bindFields() {\n var _this7 = this;\n\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(function () {\n _this7.$element.find(_this7.options.inputs).not(_this7.options.excluded).each(function (_, element) {\n var fieldInstance = new window.Parsley.Factory(element, {}, _this7);\n\n // Only add valid and not excluded `ParsleyField` and `ParsleyFieldMultiple` children\n if (('ParsleyField' === fieldInstance.__class__ || 'ParsleyFieldMultiple' === fieldInstance.__class__) && true !== fieldInstance.options.excluded) if ('undefined' === typeof _this7.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__]) {\n _this7.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__] = fieldInstance;\n _this7.fields.push(fieldInstance);\n }\n });\n\n $.each(ParsleyUtils__default.difference(oldFields, _this7.fields), function (_, field) {\n field._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 _withoutReactualizingFormOptions(fn) {\n var oldActualizeOptions = this.actualizeOptions;\n this.actualizeOptions = function () {\n return this;\n };\n var result = fn();\n this.actualizeOptions = oldActualizeOptions;\n return result;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n // Returns true iff event is not interrupted and default not prevented.\n _trigger: function _trigger(eventName) {\n return this.trigger('form:' + eventName);\n }\n\n };\n\n var ConstraintFactory = function ConstraintFactory(parsleyField, name, requirements, priority, isDomConstraint) {\n if (!/ParsleyField/.test(parsleyField.__class__)) 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 capitalize(str) {\n var cap = str[0].toUpperCase();\n return cap + str.slice(1);\n };\n\n ConstraintFactory.prototype = {\n validate: function validate(value, instance) {\n var _validator;\n\n return (_validator = this.validator).validate.apply(_validator, [value].concat(_toConsumableArray(this.requirementList), [instance]));\n },\n\n _parseRequirements: function _parseRequirements(options) {\n var _this8 = this;\n\n this.requirementList = this.validator.parseRequirements(this.requirements, function (key) {\n return options[_this8.name + capitalize(key)];\n });\n }\n };\n\n var ParsleyField = function ParsleyField(field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'ParsleyField';\n\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n };\n\n var parsley_field__statusMapping = { pending: null, resolved: true, rejected: false };\n\n 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 validate(options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = { options: options };\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending':\n return null;\n case 'resolved':\n return true;\n case 'rejected':\n return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `ParsleyUI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function whenValidate() {\n var _whenValid$always$done$fail$always,\n _this9 = this;\n\n var _ref9 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var force = _ref9.force;\n var group = _ref9.group;\n\n // do not validate a field if not the same as given validation group\n this.refreshConstraints();\n if (group && !this._isInGroup(group)) return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return (_whenValid$always$done$fail$always = this.whenValid({ force: force, value: this.value, _refreshed: true }).always(function () {\n _this9._reflowUI();\n }).done(function () {\n _this9._trigger('success');\n }).fail(function () {\n _this9._trigger('error');\n }).always(function () {\n _this9._trigger('validated');\n })).pipe.apply(_whenValid$always$done$fail$always, _toConsumableArray(this._pipeAccordingToValidationResult()));\n },\n\n hasConstraints: function hasConstraints() {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function needsValidation(value) {\n if ('undefined' === typeof value) value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty) return false;\n\n return true;\n },\n\n _isInGroup: function _isInGroup(group) {\n if ($.isArray(this.options.group)) return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function isValid(options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n\n var _arguments3 = _slice.call(arguments);\n\n var force = _arguments3[0];\n var value = _arguments3[1];\n\n options = { force: force, value: value };\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return parsley_field__statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function whenValid() {\n var _this10 = this;\n\n var _ref10 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var _ref10$force = _ref10.force;\n var force = _ref10$force === undefined ? false : _ref10$force;\n var value = _ref10.value;\n var group = _ref10.group;\n var _refreshed = _ref10._refreshed;\n\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed) this.refreshConstraints();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group)) return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints()) return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value) value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force) return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, function (_, constraints) {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = ParsleyUtils__default.all($.map(constraints, function (constraint) {\n return _this10._validateConstraint(value, constraint);\n }));\n promises.push(promise);\n if (promise.state() === 'rejected') return false; // Interrupt processing if a group has already failed\n });\n return ParsleyUtils__default.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function _validateConstraint(value, constraint) {\n var _this11 = this;\n\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result) result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return ParsleyUtils__default.all([result]).fail(function (errorMessage) {\n if (!(_this11.validationResult instanceof Array)) _this11.validationResult = [];\n _this11.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function getValue() {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value) value = this.options.value(this);else if ('undefined' !== typeof this.options.value) value = this.options.value;else value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value) return '';\n\n return this._handleWhitespace(value);\n },\n\n // Actualize options that could have change since previous validation\n // Re-bind accordingly constraints (could be some new, removed or updated)\n refreshConstraints: function refreshConstraints() {\n return this.actualizeOptions()._bindConstraints();\n },\n\n /**\n * Add a new constraint to a field\n *\n * @param {String} name\n * @param {Mixed} requirements optional\n * @param {Number} priority optional\n * @param {Boolean} isDomConstraint optional\n */\n addConstraint: function addConstraint(name, requirements, priority, isDomConstraint) {\n\n if (window.Parsley._validatorRegistry.validators[name]) {\n var constraint = new 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]) this.removeConstraint(constraint.name);\n\n this.constraints.push(constraint);\n this.constraintsByName[constraint.name] = constraint;\n }\n\n return this;\n },\n\n // Remove a constraint\n removeConstraint: function removeConstraint(name) {\n for (var i = 0; i < this.constraints.length; i++) if (name === this.constraints[i].name) {\n this.constraints.splice(i, 1);\n break;\n }\n delete this.constraintsByName[name];\n return this;\n },\n\n // Update a constraint (Remove + re-add)\n updateConstraint: function updateConstraint(name, parameters, priority) {\n return this.removeConstraint(name).addConstraint(name, parameters, priority);\n },\n\n // # Internals\n\n // Internal only.\n // Bind constraints from config + options + DOM\n _bindConstraints: function _bindConstraints() {\n var constraints = [];\n var constraintsByName = {};\n\n // clean all existing DOM constraints to only keep javascript user constraints\n for (var i = 0; i < this.constraints.length; i++) if (false === this.constraints[i].isDomConstraint) {\n constraints.push(this.constraints[i]);\n constraintsByName[this.constraints[i].name] = this.constraints[i];\n }\n\n this.constraints = constraints;\n this.constraintsByName = constraintsByName;\n\n // then re-add Parsley DOM-API constraints\n for (var name in this.options) this.addConstraint(name, this.options[name], undefined, true);\n\n // finally, bind special HTML5 constraints\n return this._bindHtml5Constraints();\n },\n\n // Internal only.\n // Bind specific HTML5 constraints to be HTML5 compliant\n _bindHtml5Constraints: function _bindHtml5Constraints() {\n // html5 required\n if (this.$element.hasClass('required') || this.$element.attr('required')) this.addConstraint('required', true, undefined, true);\n\n // html5 pattern\n if ('string' === typeof this.$element.attr('pattern')) this.addConstraint('pattern', this.$element.attr('pattern'), undefined, true);\n\n // range\n if ('undefined' !== typeof this.$element.attr('min') && 'undefined' !== typeof this.$element.attr('max')) this.addConstraint('range', [this.$element.attr('min'), this.$element.attr('max')], undefined, true);\n\n // HTML5 min\n else if ('undefined' !== typeof this.$element.attr('min')) this.addConstraint('min', this.$element.attr('min'), undefined, true);\n\n // HTML5 max\n else if ('undefined' !== typeof this.$element.attr('max')) this.addConstraint('max', this.$element.attr('max'), undefined, true);\n\n // length\n if ('undefined' !== typeof this.$element.attr('minlength') && 'undefined' !== typeof this.$element.attr('maxlength')) this.addConstraint('length', [this.$element.attr('minlength'), this.$element.attr('maxlength')], undefined, true);\n\n // HTML5 minlength\n else if ('undefined' !== typeof this.$element.attr('minlength')) this.addConstraint('minlength', this.$element.attr('minlength'), undefined, true);\n\n // HTML5 maxlength\n else if ('undefined' !== typeof this.$element.attr('maxlength')) this.addConstraint('maxlength', this.$element.attr('maxlength'), undefined, true);\n\n // html5 types\n var type = this.$element.attr('type');\n\n if ('undefined' === typeof type) return this;\n\n // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n if ('number' === type) {\n return this.addConstraint('type', ['number', {\n step: this.$element.attr('step'),\n base: this.$element.attr('min') || this.$element.attr('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range)$/i.test(type)) {\n return this.addConstraint('type', type, undefined, true);\n }\n return this;\n },\n\n // Internal only.\n // Field is required if have required constraint without `false` value\n _isRequired: function _isRequired() {\n if ('undefined' === typeof this.constraintsByName.required) return false;\n\n return false !== this.constraintsByName.required.requirements;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n _trigger: function _trigger(eventName) {\n return this.trigger('field:' + eventName);\n },\n\n // Internal only\n // Handles whitespace in a value\n // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n _handleWhitespace: function _handleWhitespace(value) {\n if (true === this.options.trimValue) ParsleyUtils__default.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n if ('squish' === this.options.whitespace) value = value.replace(/\\s{2,}/g, ' ');\n\n if ('trim' === this.options.whitespace || 'squish' === this.options.whitespace || true === this.options.trimValue) value = 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 _getGroupedConstraints() {\n if (false === this.options.priorityEnabled) return [this.constraints];\n\n var groupedConstraints = [];\n var index = {};\n\n // Create array unique of priorities\n for (var i = 0; i < this.constraints.length; i++) {\n var p = this.constraints[i].priority;\n if (!index[p]) groupedConstraints.push(index[p] = []);\n index[p].push(this.constraints[i]);\n }\n // Sort them by priority DESC\n groupedConstraints.sort(function (a, b) {\n return b[0].priority - a[0].priority;\n });\n\n return groupedConstraints;\n }\n\n };\n\n var parsley_field = ParsleyField;\n\n var ParsleyMultiple = function ParsleyMultiple() {\n this.__class__ = 'ParsleyFieldMultiple';\n };\n\n ParsleyMultiple.prototype = {\n // Add new `$element` sibling for multiple field\n addElement: function addElement($element) {\n this.$elements.push($element);\n\n return this;\n },\n\n // See `ParsleyField.refreshConstraints()`\n refreshConstraints: function refreshConstraints() {\n var fieldConstraints;\n\n this.constraints = [];\n\n // Select multiple special treatment\n if (this.$element.is('select')) {\n this.actualizeOptions()._bindConstraints();\n\n return this;\n }\n\n // Gather all constraints for each input in the multiple group\n for (var i = 0; i < this.$elements.length; i++) {\n\n // Check if element have not been dynamically removed since last binding\n if (!$('html').has(this.$elements[i]).length) {\n this.$elements.splice(i, 1);\n continue;\n }\n\n fieldConstraints = this.$elements[i].data('ParsleyFieldMultiple').refreshConstraints().constraints;\n\n for (var j = 0; j < fieldConstraints.length; j++) this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n }\n\n return this;\n },\n\n // See `ParsleyField.getValue()`\n getValue: function getValue() {\n // Value could be overriden in DOM\n if ('function' === typeof this.options.value) return this.options.value(this);else if ('undefined' !== typeof this.options.value) return this.options.value;\n\n // Radio input case\n if (this.$element.is('input[type=radio]')) return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n\n // Select multiple case\n if (this.$element.is('select') && null === this.$element.val()) return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function _init() {\n this.$elements = [this.$element];\n\n return this;\n }\n };\n\n var ParsleyFactory = function ParsleyFactory(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 if ('object' === typeof options) {\n $.extend(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length) throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && 'ParsleyForm' !== parsleyFormInstance.__class__) 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 init(options) {\n this.__class__ = 'Parsley';\n this.__version__ = '2.4.3';\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)) 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 isMultiple() {\n return this.$element.is('input[type=radio], input[type=checkbox]') || this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple');\n },\n\n // Multiples fields are a real nightmare :(\n // Maybe some refactoring would be appreciated here...\n handleMultiple: function handleMultiple() {\n var _this12 = this;\n\n var name;\n var multiple;\n var parsleyMultipleInstance;\n\n // Handle multiple name\n if (this.options.multiple) ; // We already have our 'multiple' identifier\n else if ('undefined' !== typeof this.$element.attr('name') && this.$element.attr('name').length) this.options.multiple = name = this.$element.attr('name');else if ('undefined' !== typeof this.$element.attr('id') && this.$element.attr('id').length) this.options.multiple = this.$element.attr('id');\n\n // Special select multiple input\n if (this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple')) {\n this.options.multiple = this.options.multiple || this.__id__;\n return this.bind('parsleyFieldMultiple');\n\n // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n } else if (!this.options.multiple) {\n 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 (i, input) {\n if ($(input).is('input[type=radio], input[type=checkbox]')) $(input).attr(_this12.options.namespace + 'multiple', _this12.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('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 bind(type, doNotStore) {\n var parsleyInstance;\n\n switch (type) {\n case 'parsleyForm':\n parsleyInstance = $.extend(new ParsleyForm(this.$element, this.domOptions, this.options), new ParsleyAbstract(), window.ParsleyExtend)._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(new parsley_field(this.$element, this.domOptions, this.options, this.parent), new ParsleyAbstract(), window.ParsleyExtend);\n break;\n case 'parsleyFieldMultiple':\n parsleyInstance = $.extend(new parsley_field(this.$element, this.domOptions, this.options, this.parent), new ParsleyMultiple(), new ParsleyAbstract(), window.ParsleyExtend)._init();\n break;\n default:\n throw new Error(type + 'is not a supported Parsley type');\n }\n\n if (this.options.multiple) 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._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n };\n\n var vernums = $.fn.jquery.split('.');\n if (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n }\n if (!vernums.forEach) {\n 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: '2.4.3'\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, ParsleyUI.Field, ParsleyAbstract.prototype);\n $.extend(ParsleyForm.prototype, ParsleyUI.Form, 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) 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 var _window$Parsley;\n\n ParsleyUtils__default.warnOnce('Accessing the method \\'' + method + '\\' through ParsleyValidator is deprecated. Simply call \\'window.Parsley.' + method + '(...)\\'');\n return (_window$Parsley = window.Parsley)[method].apply(_window$Parsley, arguments);\n };\n });\n\n // ### ParsleyUI\n // Deprecated global object\n window.Parsley.UI = ParsleyUI;\n window.ParsleyUI = {\n removeError: function removeError(instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils__default.warnOnce('Accessing ParsleyUI is deprecated. Call \\'removeError\\' on the instance directly. Please comment in issue 1073 as to your need to call this method.');\n return instance.removeError(name, { updateClass: updateClass });\n },\n getErrorsMessages: function getErrorsMessages(instance) {\n ParsleyUtils__default.warnOnce('Accessing ParsleyUI is deprecated. Call \\'getErrorsMessages\\' on the instance directly.');\n return instance.getErrorsMessages();\n }\n };\n $.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils__default.warnOnce('Accessing ParsleyUI is deprecated. Call \\'' + method + '\\' on the instance directly. Please comment in issue 1073 as to your need to call this method.');\n return instance[method](name, { message: message, assert: assert, updateClass: updateClass });\n };\n });\n\n // ### PARSLEY auto-binding\n // Prevent it by setting `ParsleyConfig.autoBind` to `false`\n if (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length) $('[data-parsley-validate]').parsley();\n });\n }\n\n var o = $({});\n var deprecated = function deprecated() {\n 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) return name.substr(eventPrefix.length);\n return name;\n }\n\n // $.listen is deprecated. Use Parsley.on instead.\n $.listen = function (name, callback) {\n var context;\n deprecated();\n if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n context = arguments[1];\n callback = arguments[2];\n }\n\n if ('function' !== typeof callback) throw new Error('Wrong parameters');\n\n window.Parsley.on(eventName(name), adapt(callback, context));\n };\n\n $.listenTo = function (instance, name, fn) {\n deprecated();\n if (!(instance instanceof parsley_field) && !(instance instanceof ParsleyForm)) throw new Error('Must give Parsley instance');\n\n if ('string' !== typeof name || 'function' !== typeof fn) throw new Error('Wrong parameters');\n\n instance.on(eventName(name), adapt(fn));\n };\n\n $.unsubscribe = function (name, fn) {\n deprecated();\n if ('string' !== typeof name || 'function' !== typeof fn) throw new Error('Wrong arguments');\n window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n };\n\n $.unsubscribeTo = function (instance, name) {\n deprecated();\n if (!(instance instanceof parsley_field) && !(instance instanceof ParsleyForm)) throw new Error('Must give Parsley instance');\n instance.off(eventName(name));\n };\n\n $.unsubscribeAll = function (name) {\n deprecated();\n window.Parsley.off(eventName(name));\n $('form,input,textarea,select').each(function () {\n var instance = $(this).data('Parsley');\n if (instance) {\n instance.off(eventName(name));\n }\n });\n };\n\n // $.emit is deprecated. Use jQuery events instead.\n $.emit = function (name, instance) {\n var _instance;\n\n deprecated();\n var instanceGiven = instance instanceof parsley_field || instance instanceof 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 = instance).trigger.apply(_instance, _toConsumableArray(args));\n };\n\n var pubsub = {};\n\n $.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function fn(xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function fn(xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function addAsyncValidator(name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n });\n\n Parsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function validateString(value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator]) throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {}, Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache) Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function handleXhr() {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n });\n\n Parsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n });\n\n window.ParsleyExtend.addAsyncValidator = function () {\n ParsleyUtils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator.apply(Parsley, arguments);\n };\n\n // This is included with the Parsley library itself,\n // thus there is no use in adding it to your project.\n Parsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n });\n\n Parsley.setLocale('en');\n\n /**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune \n * @license MIT\n */\n\n function InputEvent() {\n var _this13 = this;\n\n var globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n $.extend(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: function isNativeEvent(evt) {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: function fakeInputEvent(evt) {\n if (_this13.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: function misbehaves(evt) {\n if (_this13.isNativeEvent(evt)) {\n _this13.behavesOk(evt);\n $(document).on('change.inputevent', evt.data.selector, _this13.fakeInputEvent);\n _this13.fakeInputEvent(evt);\n }\n },\n\n behavesOk: function behavesOk(evt) {\n if (_this13.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, _this13.behavesOk).off('change.inputevent', evt.data.selector, _this13.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: function install() {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n var _arr = ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]'];\n for (var _i = 0; _i < _arr.length; _i++) {\n var selector = _arr[_i];\n $(document).on('input.inputevent', selector, { selector: selector }, _this13.behavesOk).on('change.inputevent', selector, { selector: selector }, _this13.misbehaves);\n }\n },\n\n uninstall: function uninstall() {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n };\n\n var inputevent = new InputEvent();\n\n inputevent.install();\n\n var parsley = Parsley;\n\n return parsley;\n});\n//# sourceMappingURL=parsley.js.map\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :\n typeof define === 'function' && define.amd ? define(['jquery'], factory) :\n global.parsley = factory(global.$)\n}(this, function ($) { 'use strict';\n\n var globalID = 1;\n var pastWarnings = {};\n\n var 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(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })()\n };\n\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(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (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 this.__id__ = ParsleyUtils__default.generateID();\n };\n\n ParsleyAbstract.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n 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 this._resetUI();\n return this._trigger('reset');\n }\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].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n 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 (group, force) {\n ParsleyUtils__default.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n this.parent.$element.find(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`)\n : this.$element;\n }\n };\n\n var 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(...arguments);\n } else {\n if (this.validateNumber) {\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return $.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if ($.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = 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 // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n 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 // See http://stackoverflow.com/a/10454560/8279\n var decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n };\n\n 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(...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(...arguments);\n }\n return this._setValidator(...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(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = '1', base = 0} = {}) {\n var regex = typeRegexes[type];\n if (!regex) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!regex.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: {\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 = {};\n\n var diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n };\n\n ParsleyUI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', 'input[type=\"submit\"], button[type=\"submit\"]', evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.$element.attr('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n };\n\n ParsleyUI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = this.options.classHandler.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n\n // Otherwise, if simple element (input, texatrea, select...) it will perfectly host the classes\n if (!this.options.multiple || this.$element.is('select'))\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof this.options.errorsContainer) {\n if ($(this.options.errorsContainer).length)\n return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);\n else\n ParsleyUtils__default.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof this.options.errorsContainer)\n $errorsContainer = this.options.errorsContainer.call(this, this);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n var $from = this.$element;\n if (this.options.multiple)\n $from = $from.parent();\n return $from.after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(ParsleyUtils__default.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this.validate();\n });\n else if (trigger = ParsleyUtils__default.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._eventValidate(event);\n });\n }\n },\n\n _eventValidate: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (/key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n };\n\n var ParsleyForm = function (element, domOptions, options) {\n this.__class__ = 'ParsleyForm';\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 // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var $submitSource = this._$submitSource || this.$element.find('input[type=\"submit\"], button[type=\"submit\"]').first();\n this._$submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if ($submitSource.is('[formnovalidate]'))\n return;\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit($submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._$submitSource = $(event.currentTarget);\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function ($submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if ($submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('').appendTo(this.$element);\n $synthetic.attr({\n name: $submitSource.attr('name'),\n value: $submitSource.attr('value')\n });\n }\n\n this.$element.trigger($.extend($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return ParsleyForm__statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = $.extend({}, event, {preventDefault: () => {\n ParsleyUtils__default.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return ParsleyUtils__default.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return ParsleyForm__statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return ParsleyUtils__default.all(promises);\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `ParsleyField` and `ParsleyFieldMultiple` children\n if (('ParsleyField' === fieldInstance.__class__ || 'ParsleyFieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded))\n if ('undefined' === typeof this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__]) {\n this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n });\n\n $.each(ParsleyUtils__default.difference(oldFields, this.fields), (_, field) => {\n field._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();\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 (!/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 return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n };\n\n var ParsleyField = function (field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'ParsleyField';\n\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n };\n\n var parsley_field__statusMapping = {pending: null, resolved: true, rejected: false};\n\n 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 (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `ParsleyUI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refreshConstraints();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if ($.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return parsley_field__statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refreshConstraints();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = ParsleyUtils__default.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return ParsleyUtils__default.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return ParsleyUtils__default.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // 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 return this.addConstraint('type', ['number', {\n step: this.$element.attr('step'),\n base: this.$element.attr('min') || this.$element.attr('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range)$/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 ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.$element.is('input[type=radio]'))\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n\n // Select multiple case\n if (this.$element.is('select') && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n };\n\n var 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 if ('object' === typeof options) {\n $.extend(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && '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__ = '2.4.3';\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 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((i, input) => {\n if ($(input).is('input[type=radio], input[type=checkbox]'))\n $(input).attr(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('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 new ParsleyAbstract(),\n window.ParsleyExtend\n )._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(\n new parsley_field(this.$element, this.domOptions, this.options, this.parent),\n new ParsleyAbstract(),\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 new ParsleyAbstract(),\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._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n };\n\n var vernums = $.fn.jquery.split('.');\n if (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n }\n if (!vernums.forEach) {\n 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: '2.4.3'\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, ParsleyUI.Field, ParsleyAbstract.prototype);\n $.extend(ParsleyForm.prototype, ParsleyUI.Form, 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](...arguments);\n };\n });\n\n // ### ParsleyUI\n // Deprecated global object\n window.Parsley.UI = ParsleyUI;\n window.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils__default.warnOnce(`Accessing ParsleyUI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n ParsleyUtils__default.warnOnce(`Accessing ParsleyUI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n };\n $.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils__default.warnOnce(`Accessing ParsleyUI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n });\n\n // ### PARSLEY auto-binding\n // Prevent it by setting `ParsleyConfig.autoBind` to `false`\n if (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n }\n\n var o = $({});\n var deprecated = function () {\n 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(...args);\n };\n\n var pubsub = {};\n\n $.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n });\n\n Parsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n });\n\n Parsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n });\n\n window.ParsleyExtend.addAsyncValidator = function () {\n ParsleyUtils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n };\n\n // This is included with the Parsley library itself,\n // thus there is no use in adding it to your project.\n Parsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n });\n\n Parsley.setLocale('en');\n\n /**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune \n * @license MIT\n */\n\n function InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n $.extend(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n };\n\n var inputevent = new InputEvent();\n\n inputevent.install();\n\n var parsley = Parsley;\n\n return parsley;\n\n}));\n","import $ from 'jquery';\nimport 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(...args);\n};\n\nexport default {};\n","/**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune \n * @license MIT\n */\n\nimport $ from 'jquery';\n\nfunction InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n $.extend(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n};\n\nexport default new InputEvent();\n","import $ from 'jquery';\n\nvar globalID = 1;\nvar pastWarnings = {};\n\nvar 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(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })()\n};\n\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(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (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 this.__id__ = ParsleyUtils.generateID();\n};\n\nParsleyAbstract.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n 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 this._resetUI();\n return this._trigger('reset');\n }\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].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n 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 (group, force) {\n ParsleyUtils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n this.parent.$element.find(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`)\n : this.$element;\n }\n};\n\nexport default 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(...arguments);\n } else {\n if (this.validateNumber) {\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return $.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if ($.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = 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 // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n 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\n// See http://stackoverflow.com/a/10454560/8279\nvar decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n};\n\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(...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(...arguments);\n }\n return this._setValidator(...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(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = '1', base = 0} = {}) {\n var regex = typeRegexes[type];\n if (!regex) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!regex.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: {\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 = {};\n\nvar diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n};\n\nParsleyUI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', 'input[type=\"submit\"], button[type=\"submit\"]', evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.$element.attr('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n};\n\nParsleyUI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = this.options.classHandler.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n\n // Otherwise, if simple element (input, texatrea, select...) it will perfectly host the classes\n if (!this.options.multiple || this.$element.is('select'))\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof this.options.errorsContainer) {\n if ($(this.options.errorsContainer).length)\n return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);\n else\n ParsleyUtils.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof this.options.errorsContainer)\n $errorsContainer = this.options.errorsContainer.call(this, this);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n var $from = this.$element;\n if (this.options.multiple)\n $from = $from.parent();\n return $from.after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(ParsleyUtils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this.validate();\n });\n else if (trigger = ParsleyUtils.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._eventValidate(event);\n });\n }\n },\n\n _eventValidate: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (/key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n};\n\nexport default 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\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 // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var $submitSource = this._$submitSource || this.$element.find('input[type=\"submit\"], button[type=\"submit\"]').first();\n this._$submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if ($submitSource.is('[formnovalidate]'))\n return;\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit($submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._$submitSource = $(event.currentTarget);\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function ($submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if ($submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('').appendTo(this.$element);\n $synthetic.attr({\n name: $submitSource.attr('name'),\n value: $submitSource.attr('value')\n });\n }\n\n this.$element.trigger($.extend($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = $.extend({}, event, {preventDefault: () => {\n ParsleyUtils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return ParsleyUtils.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return ParsleyUtils.all(promises);\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `ParsleyField` and `ParsleyFieldMultiple` children\n if (('ParsleyField' === fieldInstance.__class__ || 'ParsleyFieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded))\n if ('undefined' === typeof this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__]) {\n this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n });\n\n $.each(ParsleyUtils.difference(oldFields, this.fields), (_, field) => {\n field._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();\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 (!/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 return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n};\n\nexport default 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\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\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 (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `ParsleyUI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refreshConstraints();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if ($.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refreshConstraints();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = ParsleyUtils.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return ParsleyUtils.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return ParsleyUtils.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // 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 return this.addConstraint('type', ['number', {\n step: this.$element.attr('step'),\n base: this.$element.attr('min') || this.$element.attr('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range)$/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 ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.$element.is('input[type=radio]'))\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n\n // Select multiple case\n if (this.$element.is('select') && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n};\n\nexport default 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 if ('object' === typeof options) {\n $.extend(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && '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 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((i, input) => {\n if ($(input).is('input[type=radio], input[type=checkbox]'))\n $(input).attr(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('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 new ParsleyAbstract(),\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 new ParsleyAbstract(),\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 new ParsleyAbstract(),\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._actualizeTriggers();\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, ParsleyUI.Field, ParsleyAbstract.prototype);\n$.extend(ParsleyForm.prototype, ParsleyUI.Form, 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](...arguments);\n };\n});\n\n// ### ParsleyUI\n// Deprecated global object\nwindow.Parsley.UI = ParsleyUI;\nwindow.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils.warnOnce(`Accessing ParsleyUI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n ParsleyUtils.warnOnce(`Accessing ParsleyUI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n};\n$.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils.warnOnce(`Accessing ParsleyUI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n});\n\n// ### PARSLEY auto-binding\n// Prevent it by setting `ParsleyConfig.autoBind` to `false`\nif (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n}\n\nexport default Parsley;\n","import $ from 'jquery';\n\nimport Parsley from './main';\n\n$.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n});\n\nParsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n});\n\nParsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n});\n\nwindow.ParsleyExtend.addAsyncValidator = function () {\n ParsleyUtils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n};\n","// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\nimport Parsley from '../parsley/main';\n\nParsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n});\n\nParsley.setLocale('en');\n","import $ from 'jquery';\nimport Parsley from './parsley/main';\nimport './parsley/pubsub';\nimport './parsley/remote';\nimport './i18n/en';\nimport inputevent from './vendor/inputevent';\n\ninputevent.install();\n\nexport default Parsley;\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["parsley.min.js","/source/parsley.js","/source/src/parsley/pubsub.js","/source/src/vendor/inputevent.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":["_toConsumableArray","arr","Array","isArray","i","arr2","length","from","_slice","prototype","slice","global","factory","exports","module","require","define","amd","parsley","jQuery","this","$","adapt","fn","context","parsleyAdaptedCallback","args","call","arguments","unshift","apply","o","eventName","name","lastIndexOf","eventPrefix","substr","InputEvent","_this13","globals","window","extend","isNativeEvent","evt","originalEvent","isTrusted","fakeInputEvent","target","trigger","misbehaves","behavesOk","document","on","data","selector","off","install","inputEventPatched","_arr","_i","uninstall","globalID","pastWarnings","ParsleyUtils__ParsleyUtils","attr","$element","namespace","obj","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","console","warnOnce","msg","_resetWarnings","trimString","string","namespaceEvents","events","split","map","join","difference","array","remove","result","each","_","elem","indexOf","push","all","promises","when","concat","objectCreate","Object","create","Error","TypeError","ParsleyUtils__default","ParsleyDefaults","inputs","excluded","priorityEnabled","multiple","group","uiEnabled","validationThreshold","focus","triggerAfterFailure","errorClass","successClass","classHandler","ParsleyField","errorsContainer","errorsWrapper","errorTemplate","ParsleyAbstract","__id__","asyncSupport","_pipeAccordingToValidationResult","_this","pipe","r","Deferred","validationResult","reject","resolve","promise","actualizeOptions","options","domOptions","parent","_resetOptions","initOptions","_listeners","queue","subscribe","listenTo","splice","unsubscribe","unsubscribeTo","extraArg","reset","__class__","_resetUI","_trigger","fields","destroy","_destroyUI","removeData","asyncIsValid","force","whenValid","_findRelated","find","requirementConverters","_string","integer","parseInt","number","parseFloat","reference","boolean","object","regexp","_regexp","flags","convertArrayRequirement","m","values","convertRequirement","requirementType","converter","convertExtraOptionRequirement","requirementSpec","extraOptionReader","main","extra","key","ParsleyValidator","spec","validate","requirementFirstArg","validateMultiple","validateNumber","validateString","parseRequirements","requirements","type","isPlainObject","priority","ParsleyValidatorRegistry","validators","catalog","locale","init","typeRegexes","email","digits","alphanum","url","range","decimalPlaces","Math","max","addValidator","Parsley","setLocale","addCatalog","messages","set","addMessage","message","addMessages","nameMessageObject","arg1","arg2","_setValidator","updateValidator","removeValidator","validator","getErrorMessage","constraint","typeMessages","formatMessage","defaultMessage","en","parameters","notblank","required","_ref","undefined","_ref$step","step","_ref$base","base","nb","decimals","toInt","f","round","pow","","pattern","minlength","requirement","maxlength","min","mincheck","maxcheck","check","equalto","refOrValue","$reference","val","ParsleyUI","diffResults","newResult","oldResult","deep","added","kept","found","j","assert","removed","Form","_actualizeTriggers","_this2","onSubmitValidate","onSubmitButton","_focusedField","field","noFocus","Field","_reflowUI","_buildUI","_ui","diff","lastValidationResult","_manageStatusClass","_manageErrorsMessages","_failedOnce","getErrorsMessages","errorMessage","_getErrorMessage","addError","_ref2","_ref2$updateClass","updateClass","_addError","_errorClass","updateError","_ref3","_ref3$updateClass","_updateError","removeError","_ref4","_ref4$updateClass","_removeError","hasConstraints","needsValidation","_successClass","_resetClass","errorsMessagesDisabled","_insertErrorWrapper","$errorsWrapper","append","addClass","html","removeClass","_ref5","_ref6","customConstraintErrorMessage","$errorClassHandler","_manageClassHandler","errorsWrapperId","validationInformationVisible","$handler","$errorsContainer","$from","after","_this3","$toBind","event","_eventValidate","getValue","children","ParsleyForm","element","ParsleyForm__statusMapping","pending","resolved","rejected","_this4","$submitSource","_$submitSource","first","prop","whenValidate","state","stopImmediatePropagation","preventDefault","done","_submit","currentTarget","$synthetic","appendTo","Event","_arguments","_ParsleyUtils__default$all$done$fail$always","_this5","_ref7","submitEvent","_refreshFields","_withoutReactualizingFormOptions","fail","always","isValid","_arguments2","_this6","_ref8","_bindFields","_this7","oldFields","fieldsMappedById","not","fieldInstance","Factory","oldActualizeOptions","ConstraintFactory","parsleyField","isDomConstraint","validatorSpec","_validatorRegistry","_parseRequirements","capitalize","cap","instance","_validator","requirementList","_this8","parsleyFormInstance","constraints","constraintsByName","_bindConstraints","parsley_field__statusMapping","_whenValid$always$done$fail$always","_this9","_ref9","refreshConstraints","_isInGroup","_refreshed","_isRequired","validateIfEmpty","inArray","_arguments3","_this10","_ref10","_ref10$force","groupedConstraints","_getGroupedConstraints","_validateConstraint","_this11","_handleWhitespace","addConstraint","removeConstraint","updateConstraint","_bindHtml5Constraints","hasClass","trimValue","whitespace","index","p","sort","a","b","parsley_field","ParsleyMultiple","addElement","$elements","fieldConstraints","has","filter","_init","ParsleyFactory","savedparsleyFormInstance","__version__","bind","isMultiple","handleMultiple","parsleyMultipleInstance","_this12","input","$previouslyRelated","get","doNotStore","parsleyInstance","ParsleyExtend","vernums","jquery","forEach","version","psly","instances","ParsleyConfig","ParsleyUtils","registry","i18n","method","proxy","_window$Parsley","UI","doNotUpdateClass","autoBind","deprecated","listen","callback","unsubscribeAll","emit","_instance","instanceGiven","asyncValidators","default","xhr","status","reverse","addAsyncValidator","ajaxOptions","csr","encodeURIComponent","remoteOptions","param","_remoteCache","ajax","handleXhr","then","inputevent"],"mappings":"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","file":"parsley.min.js","sourcesContent":["/*!\n* Parsley.js\n* Version 2.4.3 - built Mon, Jul 25th 2016, 8:48 pm\n* http://parsleyjs.org\n* Guillaume Potier - \n* Marc-Andre Lafortune - \n* MIT Licensed\n*/\n\n// The source code below is generated by babel as\n// Parsley is written in ECMAScript 6\n//\nvar _slice = Array.prototype.slice;\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) : typeof define === 'function' && define.amd ? define(['jquery'], factory) : global.parsley = factory(global.jQuery);\n})(this, function ($) {\n 'use strict';\n\n var globalID = 1;\n var pastWarnings = {};\n\n var ParsleyUtils__ParsleyUtils = {\n // Parsley DOM-API\n // returns object from dom attributes and values\n attr: function attr($element, namespace, obj) {\n var i;\n var attribute;\n var attributes;\n var regex = new RegExp('^' + namespace, 'i');\n\n if ('undefined' === typeof obj) obj = {};else {\n // Clear all own properties. This won't affect prototype's values\n for (i in obj) {\n if (obj.hasOwnProperty(i)) delete obj[i];\n }\n }\n\n if ('undefined' === typeof $element || 'undefined' === typeof $element[0]) return obj;\n\n attributes = $element[0].attributes;\n for (i = attributes.length; i--;) {\n attribute = attributes[i];\n\n if (attribute && attribute.specified && regex.test(attribute.name)) {\n obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n }\n }\n\n return obj;\n },\n\n checkAttr: function checkAttr($element, namespace, _checkAttr) {\n return $element.is('[' + namespace + _checkAttr + ']');\n },\n\n setAttr: function setAttr($element, namespace, attr, value) {\n $element[0].setAttribute(this.dasherize(namespace + attr), String(value));\n },\n\n generateID: function generateID() {\n return '' + globalID++;\n },\n\n /** Third party functions **/\n // Zepto deserialize function\n deserializeValue: function deserializeValue(value) {\n var num;\n\n try {\n return value ? value == \"true\" || (value == \"false\" ? false : value == \"null\" ? null : !isNaN(num = Number(value)) ? num : /^[\\[\\{]/.test(value) ? $.parseJSON(value) : value) : value;\n } catch (e) {\n return value;\n }\n },\n\n // Zepto camelize function\n camelize: function camelize(str) {\n return str.replace(/-+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n });\n },\n\n // Zepto dasherize function\n dasherize: function dasherize(str) {\n return str.replace(/::/g, '/').replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2').replace(/([a-z\\d])([A-Z])/g, '$1_$2').replace(/_/g, '-').toLowerCase();\n },\n\n warn: function warn() {\n var _window$console;\n\n if (window.console && 'function' === typeof window.console.warn) (_window$console = window.console).warn.apply(_window$console, arguments);\n },\n\n warnOnce: function warnOnce(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn.apply(this, arguments);\n }\n },\n\n _resetWarnings: function _resetWarnings() {\n pastWarnings = {};\n },\n\n trimString: function trimString(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n namespaceEvents: function namespaceEvents(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0]) return '';\n return $.map(events, function (evt) {\n return evt + '.' + namespace;\n }).join(' ');\n },\n\n difference: function difference(array, remove) {\n // This is O(N^2), should be optimized\n var result = [];\n $.each(array, function (_, elem) {\n if (remove.indexOf(elem) == -1) result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function all(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when.apply($, _toConsumableArray(promises).concat([42, 42]));\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function Object() {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })()\n };\n\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(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function classHandler(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 errorsContainer(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 ParsleyAbstract() {\n this.__id__ = ParsleyUtils__default.generateID();\n };\n\n ParsleyAbstract.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function _pipeAccordingToValidationResult() {\n var _this = this;\n\n var pipe = function pipe() {\n var r = $.Deferred();\n if (true !== _this.validationResult) r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function actualizeOptions() {\n ParsleyUtils__default.attr(this.$element, this.options.namespace, this.domOptions);\n if (this.parent && this.parent.actualizeOptions) this.parent.actualizeOptions();\n return this;\n },\n\n _resetOptions: function _resetOptions(initOptions) {\n this.domOptions = 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)) this.options[i] = initOptions[i];\n }\n this.actualizeOptions();\n },\n\n _listeners: null,\n\n // Register a callback for the given event name\n // Callback is called with context as the first argument and the `this`\n // The context is the current parsley instance, or window.Parsley if global\n // A return value of `false` will interrupt the calls\n on: function on(name, fn) {\n this._listeners = this._listeners || {};\n var queue = this._listeners[name] = this._listeners[name] || [];\n queue.push(fn);\n\n return this;\n },\n\n // Deprecated. Use `on` instead\n subscribe: function subscribe(name, fn) {\n $.listenTo(this, name.toLowerCase(), fn);\n },\n\n // Unregister a callback (or all if none is given) for the given event name\n off: function off(name, fn) {\n var queue = this._listeners && this._listeners[name];\n if (queue) {\n if (!fn) {\n delete this._listeners[name];\n } else {\n for (var i = queue.length; i--;) if (queue[i] === fn) queue.splice(i, 1);\n }\n }\n return this;\n },\n\n // Deprecated. Use `off`\n unsubscribe: function unsubscribe(name, fn) {\n $.unsubscribeTo(this, name.toLowerCase());\n },\n\n // Trigger an event of the given name\n // A return value of `false` interrupts the callback chain\n // Returns false if execution was interrupted\n trigger: function trigger(name, target, extraArg) {\n target = target || this;\n var queue = this._listeners && this._listeners[name];\n var result;\n var parentResult;\n if (queue) {\n for (var i = queue.length; i--;) {\n result = queue[i].call(target, target, extraArg);\n if (result === false) return result;\n }\n }\n if (this.parent) {\n return this.parent.trigger(name, target, extraArg);\n }\n return true;\n },\n\n // Reset UI\n reset: function reset() {\n // Field case: just emit a reset event for UI\n if ('ParsleyForm' !== this.__class__) {\n this._resetUI();\n return this._trigger('reset');\n }\n\n // Form case: emit a reset event for each field\n for (var i = 0; i < this.fields.length; i++) this.fields[i].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function destroy() {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n 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++) this.fields[i].destroy();\n\n this.$element.removeData('Parsley');\n this._trigger('destroy');\n },\n\n asyncIsValid: function asyncIsValid(group, force) {\n ParsleyUtils__default.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({ group: group, force: force });\n },\n\n _findRelated: function _findRelated() {\n return this.options.multiple ? this.parent.$element.find('[' + this.options.namespace + 'multiple=\"' + this.options.multiple + '\"]') : this.$element;\n }\n };\n\n var requirementConverters = {\n string: function string(_string) {\n return _string;\n },\n integer: function integer(string) {\n if (isNaN(string)) throw 'Requirement is not an integer: \"' + string + '\"';\n return parseInt(string, 10);\n },\n number: function number(string) {\n if (isNaN(string)) throw 'Requirement is not a number: \"' + string + '\"';\n return parseFloat(string);\n },\n reference: function reference(string) {\n // Unused for now\n var result = $(string);\n if (result.length === 0) throw 'No such reference: \"' + string + '\"';\n return result;\n },\n boolean: function boolean(string) {\n return string !== 'false';\n },\n object: function object(string) {\n return ParsleyUtils__default.deserializeValue(string);\n },\n regexp: function regexp(_regexp) {\n var flags = '';\n\n // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n if (/^\\/.*\\/(?:[gimy]*)$/.test(_regexp)) {\n // Replace the regexp literal string with the first match group: ([gimy]*)\n // If no flag is present, this will be a blank string\n flags = _regexp.replace(/.*\\/([gimy]*)$/, '$1');\n // Again, replace the regexp literal string with the first match group:\n // everything excluding the opening and closing slashes and the flags\n _regexp = _regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n } else {\n // Anchor regexp:\n _regexp = '^' + _regexp + '$';\n }\n return new RegExp(_regexp, flags);\n }\n };\n\n var convertArrayRequirement = function convertArrayRequirement(string, length) {\n var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n if (!m) throw 'Requirement is not an array: \"' + string + '\"';\n var values = m[1].split(',').map(ParsleyUtils__default.trimString);\n if (values.length !== length) throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n return values;\n };\n\n var convertRequirement = function convertRequirement(requirementType, string) {\n var converter = requirementConverters[requirementType || 'string'];\n if (!converter) throw 'Unknown requirement specification: \"' + requirementType + '\"';\n return converter(string);\n };\n\n var convertExtraOptionRequirement = function convertExtraOptionRequirement(requirementSpec, string, extraOptionReader) {\n var main = null;\n var extra = {};\n for (var key in requirementSpec) {\n if (key) {\n var value = extraOptionReader(key);\n if ('string' === typeof value) value = 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 ParsleyValidator(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 validate(value, requirementFirstArg) {\n if (this.fn) {\n // Legacy style validator\n\n if (arguments.length > 3) // If more args then value, requirement, instance...\n requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest\n return this.fn.call(this, value, requirementFirstArg);\n }\n\n if ($.isArray(value)) {\n if (!this.validateMultiple) throw 'Validator `' + this.name + '` does not handle multiple values';\n return this.validateMultiple.apply(this, arguments);\n } else {\n if (this.validateNumber) {\n if (isNaN(value)) return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber.apply(this, arguments);\n }\n if (this.validateString) {\n return this.validateString.apply(this, arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function parseRequirements(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return $.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if ($.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++) values[i] = 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 ParsleyValidatorRegistry(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 // @See: http://qiita.com/sakuro/items/1eaa307609ceaaf51123\n email: /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$/i,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n url: new RegExp(\"^\" +\n // protocol identifier\n \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" + \"(?:\" +\n // IP address exclusion\n // private & local networks\n // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" + // ** mod: allow local networks\n // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" + \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" + \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" + \"|\" +\n // host name\n '(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)' +\n // domain name\n '(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*' +\n // TLD identifier\n '(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))' + \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:/\\\\S*)?\" + \"$\", 'i')\n };\n typeRegexes.range = typeRegexes.number;\n\n // See http://stackoverflow.com/a/10454560/8279\n var decimalPlaces = function decimalPlaces(num) {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) {\n return 0;\n }\n return Math.max(0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) - (\n // Adjust for scientific notation.\n match[2] ? +match[2] : 0));\n };\n\n ParsleyValidatorRegistry.prototype = {\n init: function init(validators, catalog) {\n this.catalog = catalog;\n // Copy prototype's validators:\n this.validators = $.extend({}, this.validators);\n\n for (var name in validators) this.addValidator(name, validators[name].fn, validators[name].priority);\n\n window.Parsley.trigger('parsley:validator:init');\n },\n\n // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n setLocale: function setLocale(locale) {\n if ('undefined' === typeof this.catalog[locale]) throw new Error(locale + ' is not available in the catalog');\n\n this.locale = locale;\n\n return this;\n },\n\n // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n addCatalog: function addCatalog(locale, messages, set) {\n if ('object' === typeof messages) this.catalog[locale] = messages;\n\n if (true === set) return this.setLocale(locale);\n\n return this;\n },\n\n // Add a specific message for a given constraint in a given locale\n addMessage: function addMessage(locale, name, message) {\n if ('undefined' === typeof this.catalog[locale]) this.catalog[locale] = {};\n\n this.catalog[locale][name] = message;\n\n return this;\n },\n\n // Add messages for a given locale\n addMessages: function addMessages(locale, nameMessageObject) {\n for (var name in nameMessageObject) this.addMessage(locale, name, nameMessageObject[name]);\n\n return this;\n },\n\n // Add a new validator\n //\n // addValidator('custom', {\n // requirementType: ['integer', 'integer'],\n // validateString: function(value, from, to) {},\n // priority: 22,\n // messages: {\n // en: \"Hey, that's no good\",\n // fr: \"Aye aye, pas bon du tout\",\n // }\n // })\n //\n // Old API was addValidator(name, function, priority)\n //\n addValidator: function addValidator(name, arg1, arg2) {\n if (this.validators[name]) ParsleyUtils__default.warn('Validator \"' + name + '\" is already defined.');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 updateValidator(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.apply(this, arguments);\n },\n\n removeValidator: function removeValidator(name) {\n if (!this.validators[name]) ParsleyUtils__default.warn('Validator \"' + name + '\" is not defined.');\n\n delete this.validators[name];\n\n return this;\n },\n\n _setValidator: function _setValidator(name, validator, priority) {\n if ('object' !== typeof validator) {\n // Old style validator, with `fn` and `priority`\n validator = {\n fn: validator,\n priority: priority\n };\n }\n if (!validator.validate) {\n validator = new ParsleyValidator(validator);\n }\n this.validators[name] = validator;\n\n for (var locale in validator.messages || {}) this.addMessage(locale, name, validator.messages[locale]);\n\n return this;\n },\n\n getErrorMessage: function getErrorMessage(constraint) {\n var message;\n\n // Type constraints are a bit different, we have to match their requirements too to find right error message\n if ('type' === constraint.name) {\n var typeMessages = this.catalog[this.locale][constraint.name] || {};\n message = typeMessages[constraint.requirements];\n } else message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n },\n\n // Kind of light `sprintf()` implementation\n formatMessage: function formatMessage(string, parameters) {\n if ('object' === typeof parameters) {\n for (var i in parameters) string = this.formatMessage(string, parameters[i]);\n\n return string;\n }\n\n return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function validateString(value) {\n return (/\\S/.test(value)\n );\n },\n priority: 2\n },\n required: {\n validateMultiple: function validateMultiple(values) {\n return values.length > 0;\n },\n validateString: function validateString(value) {\n return (/\\S/.test(value)\n );\n },\n priority: 512\n },\n type: {\n validateString: function validateString(value, type) {\n var _ref = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\n var _ref$step = _ref.step;\n var step = _ref$step === undefined ? '1' : _ref$step;\n var _ref$base = _ref.base;\n var base = _ref$base === undefined ? 0 : _ref$base;\n\n var regex = typeRegexes[type];\n if (!regex) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!regex.test(value)) return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = function toInt(f) {\n return Math.round(f * Math.pow(10, decimals));\n };\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0) return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function validateString(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function validateString(value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function validateString(value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function validateString(value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function validateMultiple(values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function validateMultiple(values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function validateMultiple(values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: {\n validateNumber: function validateNumber(value, requirement) {\n return value >= requirement;\n },\n requirementType: 'number',\n priority: 30\n },\n max: {\n validateNumber: function validateNumber(value, requirement) {\n return value <= requirement;\n },\n requirementType: 'number',\n priority: 30\n },\n range: {\n validateNumber: function validateNumber(value, min, max) {\n return value >= min && value <= max;\n },\n requirementType: ['number', 'number'],\n priority: 30\n },\n equalto: {\n validateString: function validateString(value, refOrValue) {\n var $reference = $(refOrValue);\n if ($reference.length) return value === $reference.val();else return value === refOrValue;\n },\n priority: 256\n }\n }\n };\n\n var ParsleyUI = {};\n\n var diffResults = function diffResults(newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++) if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found) kept.push(newResult[i]);else added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n };\n\n ParsleyUI.Form = {\n\n _actualizeTriggers: function _actualizeTriggers() {\n var _this2 = this;\n\n this.$element.on('submit.Parsley', function (evt) {\n _this2.onSubmitValidate(evt);\n });\n this.$element.on('click.Parsley', 'input[type=\"submit\"], button[type=\"submit\"]', function (evt) {\n _this2.onSubmitButton(evt);\n });\n\n // UI could be disabled\n if (false === this.options.uiEnabled) return;\n\n this.$element.attr('novalidate', '');\n },\n\n focus: function focus() {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus) return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus) break;\n }\n }\n\n if (null === this._focusedField) return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function _destroyUI() {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n };\n\n ParsleyUI.Field = {\n\n _reflowUI: function _reflowUI() {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui) return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function getErrorsMessages() {\n // No error message, field is valid\n if (true === this.validationResult) return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++) messages.push(this.validationResult[i].errorMessage || this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function addError(name) {\n var _ref2 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var message = _ref2.message;\n var assert = _ref2.assert;\n var _ref2$updateClass = _ref2.updateClass;\n var updateClass = _ref2$updateClass === undefined ? true : _ref2$updateClass;\n\n this._buildUI();\n this._addError(name, { message: message, assert: assert });\n\n if (updateClass) this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function updateError(name) {\n var _ref3 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var message = _ref3.message;\n var assert = _ref3.assert;\n var _ref3$updateClass = _ref3.updateClass;\n var updateClass = _ref3$updateClass === undefined ? true : _ref3$updateClass;\n\n this._buildUI();\n this._updateError(name, { message: message, assert: assert });\n\n if (updateClass) this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function removeError(name) {\n var _ref4 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var _ref4$updateClass = _ref4.updateClass;\n var updateClass = _ref4$updateClass === undefined ? true : _ref4$updateClass;\n\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass) this._manageStatusClass();\n },\n\n _manageStatusClass: function _manageStatusClass() {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult) this._successClass();else if (this.validationResult.length > 0) this._errorClass();else this._resetClass();\n },\n\n _manageErrorsMessages: function _manageErrorsMessages(diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled) return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if (diff.added.length || diff.kept.length) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length) this._ui.$errorsWrapper.append($(this.options.errorTemplate).addClass('parsley-custom-error-message'));\n\n return this._ui.$errorsWrapper.addClass('filled').find('.parsley-custom-error-message').html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper.removeClass('filled').find('.parsley-custom-error-message').remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++) this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++) this._addError(diff.added[i].assert.name, { message: diff.added[i].errorMessage, assert: diff.added[i].assert });\n\n for (i = 0; i < diff.kept.length; i++) this._updateError(diff.kept[i].assert.name, { message: diff.kept[i].errorMessage, assert: diff.kept[i].assert });\n },\n\n _addError: function _addError(name, _ref5) {\n var message = _ref5.message;\n var assert = _ref5.assert;\n\n this._insertErrorWrapper();\n this._ui.$errorsWrapper.addClass('filled').append($(this.options.errorTemplate).addClass('parsley-' + name).html(message || this._getErrorMessage(assert)));\n },\n\n _updateError: function _updateError(name, _ref6) {\n var message = _ref6.message;\n var assert = _ref6.assert;\n\n this._ui.$errorsWrapper.addClass('filled').find('.parsley-' + name).html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function _removeError(name) {\n this._ui.$errorsWrapper.removeClass('filled').find('.parsley-' + name).remove();\n },\n\n _getErrorMessage: function _getErrorMessage(constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage]) return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function _buildUI() {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled) return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function _manageClassHandler() {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length) return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = this.options.classHandler.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length) return $handler;\n\n // Otherwise, if simple element (input, texatrea, select...) it will perfectly host the classes\n if (!this.options.multiple || this.$element.is('select')) return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function _insertErrorWrapper() {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length) return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof this.options.errorsContainer) {\n if ($(this.options.errorsContainer).length) return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);else ParsleyUtils__default.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof this.options.errorsContainer) $errorsContainer = this.options.errorsContainer.call(this, this);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length) return $errorsContainer.append(this._ui.$errorsWrapper);\n\n var $from = this.$element;\n if (this.options.multiple) $from = $from.parent();\n return $from.after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function _actualizeTriggers() {\n var _this3 = this;\n\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce) $toBind.on(ParsleyUtils__default.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), function () {\n _this3.validate();\n });else if (trigger = ParsleyUtils__default.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, function (event) {\n _this3._eventValidate(event);\n });\n }\n },\n\n _eventValidate: function _eventValidate(event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (/key|input/.test(event.type)) if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold) return;\n\n this.validate();\n },\n\n _resetUI: function _resetUI() {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui) return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper.removeClass('filled').children().remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function _destroyUI() {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui) this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function _successClass() {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function _errorClass() {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function _resetClass() {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n };\n\n var ParsleyForm = function ParsleyForm(element, domOptions, options) {\n this.__class__ = 'ParsleyForm';\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 onSubmitValidate(event) {\n var _this4 = this;\n\n // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley) return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var $submitSource = this._$submitSource || this.$element.find('input[type=\"submit\"], button[type=\"submit\"]').first();\n this._$submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if ($submitSource.is('[formnovalidate]')) return;\n\n var promise = this.whenValidate({ event: event });\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state()) promise.done(function () {\n _this4._submit($submitSource);\n });\n }\n },\n\n onSubmitButton: function onSubmitButton(event) {\n this._$submitSource = $(event.currentTarget);\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function _submit($submitSource) {\n if (false === this._trigger('submit')) return;\n // Add submit button's data\n if ($submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length) $synthetic = $('').appendTo(this.$element);\n $synthetic.attr({\n name: $submitSource.attr('name'),\n value: $submitSource.attr('value')\n });\n }\n\n this.$element.trigger($.extend($.Event('submit'), { parsley: true }));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function validate(options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n\n var _arguments = _slice.call(arguments);\n\n var group = _arguments[0];\n var force = _arguments[1];\n var event = _arguments[2];\n\n options = { group: group, force: force, event: event };\n }\n return ParsleyForm__statusMapping[this.whenValidate(options).state()];\n },\n\n whenValidate: function whenValidate() {\n var _ParsleyUtils__default$all$done$fail$always,\n _this5 = this;\n\n var _ref7 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var group = _ref7.group;\n var force = _ref7.force;\n var event = _ref7.event;\n\n this.submitEvent = event;\n if (event) {\n this.submitEvent = $.extend({}, event, { preventDefault: function preventDefault() {\n ParsleyUtils__default.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n _this5.validationResult = false;\n } });\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(function () {\n return $.map(_this5.fields, function (field) {\n return field.whenValidate({ force: force, group: group });\n });\n });\n\n return (_ParsleyUtils__default$all$done$fail$always = ParsleyUtils__default.all(promises).done(function () {\n _this5._trigger('success');\n }).fail(function () {\n _this5.validationResult = false;\n _this5.focus();\n _this5._trigger('error');\n }).always(function () {\n _this5._trigger('validated');\n })).pipe.apply(_ParsleyUtils__default$all$done$fail$always, _toConsumableArray(this._pipeAccordingToValidationResult()));\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function isValid(options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n\n var _arguments2 = _slice.call(arguments);\n\n var group = _arguments2[0];\n var force = _arguments2[1];\n\n options = { group: group, force: force };\n }\n return ParsleyForm__statusMapping[this.whenValid(options).state()];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function whenValid() {\n var _this6 = this;\n\n var _ref8 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var group = _ref8.group;\n var force = _ref8.force;\n\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(function () {\n return $.map(_this6.fields, function (field) {\n return field.whenValid({ group: group, force: force });\n });\n });\n return ParsleyUtils__default.all(promises);\n },\n\n _refreshFields: function _refreshFields() {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function _bindFields() {\n var _this7 = this;\n\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(function () {\n _this7.$element.find(_this7.options.inputs).not(_this7.options.excluded).each(function (_, element) {\n var fieldInstance = new window.Parsley.Factory(element, {}, _this7);\n\n // Only add valid and not excluded `ParsleyField` and `ParsleyFieldMultiple` children\n if (('ParsleyField' === fieldInstance.__class__ || 'ParsleyFieldMultiple' === fieldInstance.__class__) && true !== fieldInstance.options.excluded) if ('undefined' === typeof _this7.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__]) {\n _this7.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__] = fieldInstance;\n _this7.fields.push(fieldInstance);\n }\n });\n\n $.each(ParsleyUtils__default.difference(oldFields, _this7.fields), function (_, field) {\n field._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 _withoutReactualizingFormOptions(fn) {\n var oldActualizeOptions = this.actualizeOptions;\n this.actualizeOptions = function () {\n return this;\n };\n var result = fn();\n this.actualizeOptions = oldActualizeOptions;\n return result;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n // Returns true iff event is not interrupted and default not prevented.\n _trigger: function _trigger(eventName) {\n return this.trigger('form:' + eventName);\n }\n\n };\n\n var ConstraintFactory = function ConstraintFactory(parsleyField, name, requirements, priority, isDomConstraint) {\n if (!/ParsleyField/.test(parsleyField.__class__)) 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 capitalize(str) {\n var cap = str[0].toUpperCase();\n return cap + str.slice(1);\n };\n\n ConstraintFactory.prototype = {\n validate: function validate(value, instance) {\n var _validator;\n\n return (_validator = this.validator).validate.apply(_validator, [value].concat(_toConsumableArray(this.requirementList), [instance]));\n },\n\n _parseRequirements: function _parseRequirements(options) {\n var _this8 = this;\n\n this.requirementList = this.validator.parseRequirements(this.requirements, function (key) {\n return options[_this8.name + capitalize(key)];\n });\n }\n };\n\n var ParsleyField = function ParsleyField(field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'ParsleyField';\n\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n };\n\n var parsley_field__statusMapping = { pending: null, resolved: true, rejected: false };\n\n 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 validate(options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = { options: options };\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending':\n return null;\n case 'resolved':\n return true;\n case 'rejected':\n return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `ParsleyUI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function whenValidate() {\n var _whenValid$always$done$fail$always,\n _this9 = this;\n\n var _ref9 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var force = _ref9.force;\n var group = _ref9.group;\n\n // do not validate a field if not the same as given validation group\n this.refreshConstraints();\n if (group && !this._isInGroup(group)) return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return (_whenValid$always$done$fail$always = this.whenValid({ force: force, value: this.value, _refreshed: true }).always(function () {\n _this9._reflowUI();\n }).done(function () {\n _this9._trigger('success');\n }).fail(function () {\n _this9._trigger('error');\n }).always(function () {\n _this9._trigger('validated');\n })).pipe.apply(_whenValid$always$done$fail$always, _toConsumableArray(this._pipeAccordingToValidationResult()));\n },\n\n hasConstraints: function hasConstraints() {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function needsValidation(value) {\n if ('undefined' === typeof value) value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty) return false;\n\n return true;\n },\n\n _isInGroup: function _isInGroup(group) {\n if ($.isArray(this.options.group)) return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function isValid(options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n\n var _arguments3 = _slice.call(arguments);\n\n var force = _arguments3[0];\n var value = _arguments3[1];\n\n options = { force: force, value: value };\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return parsley_field__statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function whenValid() {\n var _this10 = this;\n\n var _ref10 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n var _ref10$force = _ref10.force;\n var force = _ref10$force === undefined ? false : _ref10$force;\n var value = _ref10.value;\n var group = _ref10.group;\n var _refreshed = _ref10._refreshed;\n\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed) this.refreshConstraints();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group)) return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints()) return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value) value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force) return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, function (_, constraints) {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = ParsleyUtils__default.all($.map(constraints, function (constraint) {\n return _this10._validateConstraint(value, constraint);\n }));\n promises.push(promise);\n if (promise.state() === 'rejected') return false; // Interrupt processing if a group has already failed\n });\n return ParsleyUtils__default.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function _validateConstraint(value, constraint) {\n var _this11 = this;\n\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result) result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return ParsleyUtils__default.all([result]).fail(function (errorMessage) {\n if (!(_this11.validationResult instanceof Array)) _this11.validationResult = [];\n _this11.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function getValue() {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value) value = this.options.value(this);else if ('undefined' !== typeof this.options.value) value = this.options.value;else value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value) return '';\n\n return this._handleWhitespace(value);\n },\n\n // Actualize options that could have change since previous validation\n // Re-bind accordingly constraints (could be some new, removed or updated)\n refreshConstraints: function refreshConstraints() {\n return this.actualizeOptions()._bindConstraints();\n },\n\n /**\n * Add a new constraint to a field\n *\n * @param {String} name\n * @param {Mixed} requirements optional\n * @param {Number} priority optional\n * @param {Boolean} isDomConstraint optional\n */\n addConstraint: function addConstraint(name, requirements, priority, isDomConstraint) {\n\n if (window.Parsley._validatorRegistry.validators[name]) {\n var constraint = new 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]) this.removeConstraint(constraint.name);\n\n this.constraints.push(constraint);\n this.constraintsByName[constraint.name] = constraint;\n }\n\n return this;\n },\n\n // Remove a constraint\n removeConstraint: function removeConstraint(name) {\n for (var i = 0; i < this.constraints.length; i++) if (name === this.constraints[i].name) {\n this.constraints.splice(i, 1);\n break;\n }\n delete this.constraintsByName[name];\n return this;\n },\n\n // Update a constraint (Remove + re-add)\n updateConstraint: function updateConstraint(name, parameters, priority) {\n return this.removeConstraint(name).addConstraint(name, parameters, priority);\n },\n\n // # Internals\n\n // Internal only.\n // Bind constraints from config + options + DOM\n _bindConstraints: function _bindConstraints() {\n var constraints = [];\n var constraintsByName = {};\n\n // clean all existing DOM constraints to only keep javascript user constraints\n for (var i = 0; i < this.constraints.length; i++) if (false === this.constraints[i].isDomConstraint) {\n constraints.push(this.constraints[i]);\n constraintsByName[this.constraints[i].name] = this.constraints[i];\n }\n\n this.constraints = constraints;\n this.constraintsByName = constraintsByName;\n\n // then re-add Parsley DOM-API constraints\n for (var name in this.options) this.addConstraint(name, this.options[name], undefined, true);\n\n // finally, bind special HTML5 constraints\n return this._bindHtml5Constraints();\n },\n\n // Internal only.\n // Bind specific HTML5 constraints to be HTML5 compliant\n _bindHtml5Constraints: function _bindHtml5Constraints() {\n // html5 required\n if (this.$element.hasClass('required') || this.$element.attr('required')) this.addConstraint('required', true, undefined, true);\n\n // html5 pattern\n if ('string' === typeof this.$element.attr('pattern')) this.addConstraint('pattern', this.$element.attr('pattern'), undefined, true);\n\n // range\n if ('undefined' !== typeof this.$element.attr('min') && 'undefined' !== typeof this.$element.attr('max')) this.addConstraint('range', [this.$element.attr('min'), this.$element.attr('max')], undefined, true);\n\n // HTML5 min\n else if ('undefined' !== typeof this.$element.attr('min')) this.addConstraint('min', this.$element.attr('min'), undefined, true);\n\n // HTML5 max\n else if ('undefined' !== typeof this.$element.attr('max')) this.addConstraint('max', this.$element.attr('max'), undefined, true);\n\n // length\n if ('undefined' !== typeof this.$element.attr('minlength') && 'undefined' !== typeof this.$element.attr('maxlength')) this.addConstraint('length', [this.$element.attr('minlength'), this.$element.attr('maxlength')], undefined, true);\n\n // HTML5 minlength\n else if ('undefined' !== typeof this.$element.attr('minlength')) this.addConstraint('minlength', this.$element.attr('minlength'), undefined, true);\n\n // HTML5 maxlength\n else if ('undefined' !== typeof this.$element.attr('maxlength')) this.addConstraint('maxlength', this.$element.attr('maxlength'), undefined, true);\n\n // html5 types\n var type = this.$element.attr('type');\n\n if ('undefined' === typeof type) return this;\n\n // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n if ('number' === type) {\n return this.addConstraint('type', ['number', {\n step: this.$element.attr('step'),\n base: this.$element.attr('min') || this.$element.attr('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range)$/i.test(type)) {\n return this.addConstraint('type', type, undefined, true);\n }\n return this;\n },\n\n // Internal only.\n // Field is required if have required constraint without `false` value\n _isRequired: function _isRequired() {\n if ('undefined' === typeof this.constraintsByName.required) return false;\n\n return false !== this.constraintsByName.required.requirements;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n _trigger: function _trigger(eventName) {\n return this.trigger('field:' + eventName);\n },\n\n // Internal only\n // Handles whitespace in a value\n // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n _handleWhitespace: function _handleWhitespace(value) {\n if (true === this.options.trimValue) ParsleyUtils__default.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n if ('squish' === this.options.whitespace) value = value.replace(/\\s{2,}/g, ' ');\n\n if ('trim' === this.options.whitespace || 'squish' === this.options.whitespace || true === this.options.trimValue) value = 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 _getGroupedConstraints() {\n if (false === this.options.priorityEnabled) return [this.constraints];\n\n var groupedConstraints = [];\n var index = {};\n\n // Create array unique of priorities\n for (var i = 0; i < this.constraints.length; i++) {\n var p = this.constraints[i].priority;\n if (!index[p]) groupedConstraints.push(index[p] = []);\n index[p].push(this.constraints[i]);\n }\n // Sort them by priority DESC\n groupedConstraints.sort(function (a, b) {\n return b[0].priority - a[0].priority;\n });\n\n return groupedConstraints;\n }\n\n };\n\n var parsley_field = ParsleyField;\n\n var ParsleyMultiple = function ParsleyMultiple() {\n this.__class__ = 'ParsleyFieldMultiple';\n };\n\n ParsleyMultiple.prototype = {\n // Add new `$element` sibling for multiple field\n addElement: function addElement($element) {\n this.$elements.push($element);\n\n return this;\n },\n\n // See `ParsleyField.refreshConstraints()`\n refreshConstraints: function refreshConstraints() {\n var fieldConstraints;\n\n this.constraints = [];\n\n // Select multiple special treatment\n if (this.$element.is('select')) {\n this.actualizeOptions()._bindConstraints();\n\n return this;\n }\n\n // Gather all constraints for each input in the multiple group\n for (var i = 0; i < this.$elements.length; i++) {\n\n // Check if element have not been dynamically removed since last binding\n if (!$('html').has(this.$elements[i]).length) {\n this.$elements.splice(i, 1);\n continue;\n }\n\n fieldConstraints = this.$elements[i].data('ParsleyFieldMultiple').refreshConstraints().constraints;\n\n for (var j = 0; j < fieldConstraints.length; j++) this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n }\n\n return this;\n },\n\n // See `ParsleyField.getValue()`\n getValue: function getValue() {\n // Value could be overriden in DOM\n if ('function' === typeof this.options.value) return this.options.value(this);else if ('undefined' !== typeof this.options.value) return this.options.value;\n\n // Radio input case\n if (this.$element.is('input[type=radio]')) return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n\n // Select multiple case\n if (this.$element.is('select') && null === this.$element.val()) return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function _init() {\n this.$elements = [this.$element];\n\n return this;\n }\n };\n\n var ParsleyFactory = function ParsleyFactory(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 if ('object' === typeof options) {\n $.extend(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length) throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && 'ParsleyForm' !== parsleyFormInstance.__class__) 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 init(options) {\n this.__class__ = 'Parsley';\n this.__version__ = '2.4.3';\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)) 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 isMultiple() {\n return this.$element.is('input[type=radio], input[type=checkbox]') || this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple');\n },\n\n // Multiples fields are a real nightmare :(\n // Maybe some refactoring would be appreciated here...\n handleMultiple: function handleMultiple() {\n var _this12 = this;\n\n var name;\n var multiple;\n var parsleyMultipleInstance;\n\n // Handle multiple name\n if (this.options.multiple) ; // We already have our 'multiple' identifier\n else if ('undefined' !== typeof this.$element.attr('name') && this.$element.attr('name').length) this.options.multiple = name = this.$element.attr('name');else if ('undefined' !== typeof this.$element.attr('id') && this.$element.attr('id').length) this.options.multiple = this.$element.attr('id');\n\n // Special select multiple input\n if (this.$element.is('select') && 'undefined' !== typeof this.$element.attr('multiple')) {\n this.options.multiple = this.options.multiple || this.__id__;\n return this.bind('parsleyFieldMultiple');\n\n // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n } else if (!this.options.multiple) {\n 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 (i, input) {\n if ($(input).is('input[type=radio], input[type=checkbox]')) $(input).attr(_this12.options.namespace + 'multiple', _this12.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('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 bind(type, doNotStore) {\n var parsleyInstance;\n\n switch (type) {\n case 'parsleyForm':\n parsleyInstance = $.extend(new ParsleyForm(this.$element, this.domOptions, this.options), new ParsleyAbstract(), window.ParsleyExtend)._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(new parsley_field(this.$element, this.domOptions, this.options, this.parent), new ParsleyAbstract(), window.ParsleyExtend);\n break;\n case 'parsleyFieldMultiple':\n parsleyInstance = $.extend(new parsley_field(this.$element, this.domOptions, this.options, this.parent), new ParsleyMultiple(), new ParsleyAbstract(), window.ParsleyExtend)._init();\n break;\n default:\n throw new Error(type + 'is not a supported Parsley type');\n }\n\n if (this.options.multiple) 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._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n };\n\n var vernums = $.fn.jquery.split('.');\n if (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n }\n if (!vernums.forEach) {\n 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: '2.4.3'\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, ParsleyUI.Field, ParsleyAbstract.prototype);\n $.extend(ParsleyForm.prototype, ParsleyUI.Form, 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) 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 var _window$Parsley;\n\n ParsleyUtils__default.warnOnce('Accessing the method \\'' + method + '\\' through ParsleyValidator is deprecated. Simply call \\'window.Parsley.' + method + '(...)\\'');\n return (_window$Parsley = window.Parsley)[method].apply(_window$Parsley, arguments);\n };\n });\n\n // ### ParsleyUI\n // Deprecated global object\n window.Parsley.UI = ParsleyUI;\n window.ParsleyUI = {\n removeError: function removeError(instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils__default.warnOnce('Accessing ParsleyUI is deprecated. Call \\'removeError\\' on the instance directly. Please comment in issue 1073 as to your need to call this method.');\n return instance.removeError(name, { updateClass: updateClass });\n },\n getErrorsMessages: function getErrorsMessages(instance) {\n ParsleyUtils__default.warnOnce('Accessing ParsleyUI is deprecated. Call \\'getErrorsMessages\\' on the instance directly.');\n return instance.getErrorsMessages();\n }\n };\n $.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils__default.warnOnce('Accessing ParsleyUI is deprecated. Call \\'' + method + '\\' on the instance directly. Please comment in issue 1073 as to your need to call this method.');\n return instance[method](name, { message: message, assert: assert, updateClass: updateClass });\n };\n });\n\n // ### PARSLEY auto-binding\n // Prevent it by setting `ParsleyConfig.autoBind` to `false`\n if (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length) $('[data-parsley-validate]').parsley();\n });\n }\n\n var o = $({});\n var deprecated = function deprecated() {\n 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) return name.substr(eventPrefix.length);\n return name;\n }\n\n // $.listen is deprecated. Use Parsley.on instead.\n $.listen = function (name, callback) {\n var context;\n deprecated();\n if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n context = arguments[1];\n callback = arguments[2];\n }\n\n if ('function' !== typeof callback) throw new Error('Wrong parameters');\n\n window.Parsley.on(eventName(name), adapt(callback, context));\n };\n\n $.listenTo = function (instance, name, fn) {\n deprecated();\n if (!(instance instanceof parsley_field) && !(instance instanceof ParsleyForm)) throw new Error('Must give Parsley instance');\n\n if ('string' !== typeof name || 'function' !== typeof fn) throw new Error('Wrong parameters');\n\n instance.on(eventName(name), adapt(fn));\n };\n\n $.unsubscribe = function (name, fn) {\n deprecated();\n if ('string' !== typeof name || 'function' !== typeof fn) throw new Error('Wrong arguments');\n window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n };\n\n $.unsubscribeTo = function (instance, name) {\n deprecated();\n if (!(instance instanceof parsley_field) && !(instance instanceof ParsleyForm)) throw new Error('Must give Parsley instance');\n instance.off(eventName(name));\n };\n\n $.unsubscribeAll = function (name) {\n deprecated();\n window.Parsley.off(eventName(name));\n $('form,input,textarea,select').each(function () {\n var instance = $(this).data('Parsley');\n if (instance) {\n instance.off(eventName(name));\n }\n });\n };\n\n // $.emit is deprecated. Use jQuery events instead.\n $.emit = function (name, instance) {\n var _instance;\n\n deprecated();\n var instanceGiven = instance instanceof parsley_field || instance instanceof 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 = instance).trigger.apply(_instance, _toConsumableArray(args));\n };\n\n var pubsub = {};\n\n $.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function fn(xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function fn(xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function addAsyncValidator(name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n });\n\n Parsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function validateString(value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator]) throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {}, Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache) Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function handleXhr() {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n });\n\n Parsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n });\n\n window.ParsleyExtend.addAsyncValidator = function () {\n ParsleyUtils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator.apply(Parsley, arguments);\n };\n\n // This is included with the Parsley library itself,\n // thus there is no use in adding it to your project.\n Parsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n });\n\n Parsley.setLocale('en');\n\n /**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune \n * @license MIT\n */\n\n function InputEvent() {\n var _this13 = this;\n\n var globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n $.extend(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: function isNativeEvent(evt) {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: function fakeInputEvent(evt) {\n if (_this13.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: function misbehaves(evt) {\n if (_this13.isNativeEvent(evt)) {\n _this13.behavesOk(evt);\n $(document).on('change.inputevent', evt.data.selector, _this13.fakeInputEvent);\n _this13.fakeInputEvent(evt);\n }\n },\n\n behavesOk: function behavesOk(evt) {\n if (_this13.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, _this13.behavesOk).off('change.inputevent', evt.data.selector, _this13.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: function install() {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n var _arr = ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]'];\n for (var _i = 0; _i < _arr.length; _i++) {\n var selector = _arr[_i];\n $(document).on('input.inputevent', selector, { selector: selector }, _this13.behavesOk).on('change.inputevent', selector, { selector: selector }, _this13.misbehaves);\n }\n },\n\n uninstall: function uninstall() {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n };\n\n var inputevent = new InputEvent();\n\n inputevent.install();\n\n var parsley = Parsley;\n\n return parsley;\n});\n//# sourceMappingURL=parsley.js.map\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :\n typeof define === 'function' && define.amd ? define(['jquery'], factory) :\n global.parsley = factory(global.$)\n}(this, function ($) { 'use strict';\n\n var globalID = 1;\n var pastWarnings = {};\n\n var 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(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })()\n };\n\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(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (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 this.__id__ = ParsleyUtils__default.generateID();\n };\n\n ParsleyAbstract.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n 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 this._resetUI();\n return this._trigger('reset');\n }\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].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n 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 (group, force) {\n ParsleyUtils__default.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n this.parent.$element.find(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`)\n : this.$element;\n }\n };\n\n var 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(...arguments);\n } else {\n if (this.validateNumber) {\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return $.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if ($.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = 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 // @See: http://qiita.com/sakuro/items/1eaa307609ceaaf51123\n email: /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$/i,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n 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 // See http://stackoverflow.com/a/10454560/8279\n var decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n };\n\n 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(...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(...arguments);\n }\n return this._setValidator(...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(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = '1', base = 0} = {}) {\n var regex = typeRegexes[type];\n if (!regex) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!regex.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: {\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 = {};\n\n var diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n };\n\n ParsleyUI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', 'input[type=\"submit\"], button[type=\"submit\"]', evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.$element.attr('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n };\n\n ParsleyUI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = this.options.classHandler.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n\n // Otherwise, if simple element (input, texatrea, select...) it will perfectly host the classes\n if (!this.options.multiple || this.$element.is('select'))\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof this.options.errorsContainer) {\n if ($(this.options.errorsContainer).length)\n return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);\n else\n ParsleyUtils__default.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof this.options.errorsContainer)\n $errorsContainer = this.options.errorsContainer.call(this, this);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n var $from = this.$element;\n if (this.options.multiple)\n $from = $from.parent();\n return $from.after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(ParsleyUtils__default.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this.validate();\n });\n else if (trigger = ParsleyUtils__default.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._eventValidate(event);\n });\n }\n },\n\n _eventValidate: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (/key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n };\n\n var ParsleyForm = function (element, domOptions, options) {\n this.__class__ = 'ParsleyForm';\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 // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var $submitSource = this._$submitSource || this.$element.find('input[type=\"submit\"], button[type=\"submit\"]').first();\n this._$submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if ($submitSource.is('[formnovalidate]'))\n return;\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit($submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._$submitSource = $(event.currentTarget);\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function ($submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if ($submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('').appendTo(this.$element);\n $synthetic.attr({\n name: $submitSource.attr('name'),\n value: $submitSource.attr('value')\n });\n }\n\n this.$element.trigger($.extend($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return ParsleyForm__statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = $.extend({}, event, {preventDefault: () => {\n ParsleyUtils__default.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return ParsleyUtils__default.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return ParsleyForm__statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return ParsleyUtils__default.all(promises);\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `ParsleyField` and `ParsleyFieldMultiple` children\n if (('ParsleyField' === fieldInstance.__class__ || 'ParsleyFieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded))\n if ('undefined' === typeof this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__]) {\n this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n });\n\n $.each(ParsleyUtils__default.difference(oldFields, this.fields), (_, field) => {\n field._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();\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 (!/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 return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n };\n\n var ParsleyField = function (field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'ParsleyField';\n\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n };\n\n var parsley_field__statusMapping = {pending: null, resolved: true, rejected: false};\n\n 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 (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `ParsleyUI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refreshConstraints();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if ($.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils__default.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return parsley_field__statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refreshConstraints();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = ParsleyUtils__default.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return ParsleyUtils__default.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return ParsleyUtils__default.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // 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 return this.addConstraint('type', ['number', {\n step: this.$element.attr('step'),\n base: this.$element.attr('min') || this.$element.attr('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range)$/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 ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.$element.is('input[type=radio]'))\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n\n // Select multiple case\n if (this.$element.is('select') && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n };\n\n var 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 if ('object' === typeof options) {\n $.extend(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && '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__ = '2.4.3';\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 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((i, input) => {\n if ($(input).is('input[type=radio], input[type=checkbox]'))\n $(input).attr(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('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 new ParsleyAbstract(),\n window.ParsleyExtend\n )._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(\n new parsley_field(this.$element, this.domOptions, this.options, this.parent),\n new ParsleyAbstract(),\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 new ParsleyAbstract(),\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._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n };\n\n var vernums = $.fn.jquery.split('.');\n if (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n }\n if (!vernums.forEach) {\n 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: '2.4.3'\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, ParsleyUI.Field, ParsleyAbstract.prototype);\n $.extend(ParsleyForm.prototype, ParsleyUI.Form, 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](...arguments);\n };\n });\n\n // ### ParsleyUI\n // Deprecated global object\n window.Parsley.UI = ParsleyUI;\n window.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils__default.warnOnce(`Accessing ParsleyUI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n ParsleyUtils__default.warnOnce(`Accessing ParsleyUI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n };\n $.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils__default.warnOnce(`Accessing ParsleyUI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n });\n\n // ### PARSLEY auto-binding\n // Prevent it by setting `ParsleyConfig.autoBind` to `false`\n if (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n }\n\n var o = $({});\n var deprecated = function () {\n 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(...args);\n };\n\n var pubsub = {};\n\n $.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n });\n\n Parsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n });\n\n Parsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n });\n\n window.ParsleyExtend.addAsyncValidator = function () {\n ParsleyUtils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n };\n\n // This is included with the Parsley library itself,\n // thus there is no use in adding it to your project.\n Parsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n });\n\n Parsley.setLocale('en');\n\n /**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune \n * @license MIT\n */\n\n function InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n $.extend(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n };\n\n var inputevent = new InputEvent();\n\n inputevent.install();\n\n var parsley = Parsley;\n\n return parsley;\n\n}));\n","import $ from 'jquery';\nimport 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(...args);\n};\n\nexport default {};\n","/**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune \n * @license MIT\n */\n\nimport $ from 'jquery';\n\nfunction InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n $.extend(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n};\n\nexport default new InputEvent();\n","import $ from 'jquery';\n\nvar globalID = 1;\nvar pastWarnings = {};\n\nvar 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(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })()\n};\n\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(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (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 this.__id__ = ParsleyUtils.generateID();\n};\n\nParsleyAbstract.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n 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 this._resetUI();\n return this._trigger('reset');\n }\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].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n 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 (group, force) {\n ParsleyUtils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n this.parent.$element.find(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`)\n : this.$element;\n }\n};\n\nexport default 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(...arguments);\n } else {\n if (this.validateNumber) {\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return $.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if ($.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = 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 // @See: http://qiita.com/sakuro/items/1eaa307609ceaaf51123\n email: /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$/i,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n 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\n// See http://stackoverflow.com/a/10454560/8279\nvar decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n};\n\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(...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(...arguments);\n }\n return this._setValidator(...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(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = '1', base = 0} = {}) {\n var regex = typeRegexes[type];\n if (!regex) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!regex.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: {\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 = {};\n\nvar diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n};\n\nParsleyUI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', 'input[type=\"submit\"], button[type=\"submit\"]', evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.$element.attr('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n};\n\nParsleyUI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorsWrapper\n .addClass('filled')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorsWrapper\n .removeClass('filled')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.$element.attr(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // An element selector could be passed through DOM with `data-parsley-class-handler=#foo`\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handler = this.options.classHandler.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n\n // Otherwise, if simple element (input, texatrea, select...) it will perfectly host the classes\n if (!this.options.multiple || this.$element.is('select'))\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof this.options.errorsContainer) {\n if ($(this.options.errorsContainer).length)\n return $(this.options.errorsContainer).append(this._ui.$errorsWrapper);\n else\n ParsleyUtils.warn('The errors container `' + this.options.errorsContainer + '` does not exist in DOM');\n } else if ('function' === typeof this.options.errorsContainer)\n $errorsContainer = this.options.errorsContainer.call(this, this);\n\n if ('undefined' !== typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n var $from = this.$element;\n if (this.options.multiple)\n $from = $from.parent();\n return $from.after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(ParsleyUtils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this.validate();\n });\n else if (trigger = ParsleyUtils.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._eventValidate(event);\n });\n }\n },\n\n _eventValidate: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (/key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n};\n\nexport default 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\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 // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var $submitSource = this._$submitSource || this.$element.find('input[type=\"submit\"], button[type=\"submit\"]').first();\n this._$submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if ($submitSource.is('[formnovalidate]'))\n return;\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit($submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._$submitSource = $(event.currentTarget);\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function ($submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if ($submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('').appendTo(this.$element);\n $synthetic.attr({\n name: $submitSource.attr('name'),\n value: $submitSource.attr('value')\n });\n }\n\n this.$element.trigger($.extend($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = $.extend({}, event, {preventDefault: () => {\n ParsleyUtils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return ParsleyUtils.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return ParsleyUtils.all(promises);\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `ParsleyField` and `ParsleyFieldMultiple` children\n if (('ParsleyField' === fieldInstance.__class__ || 'ParsleyFieldMultiple' === fieldInstance.__class__) && (true !== fieldInstance.options.excluded))\n if ('undefined' === typeof this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__]) {\n this.fieldsMappedById[fieldInstance.__class__ + '-' + fieldInstance.__id__] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n });\n\n $.each(ParsleyUtils.difference(oldFields, this.fields), (_, field) => {\n field._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();\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 (!/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 return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n};\n\nexport default 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\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\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 (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `ParsleyUI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refreshConstraints();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if ($.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n ParsleyUtils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refreshConstraints();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = ParsleyUtils.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return ParsleyUtils.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return ParsleyUtils.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // 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 return this.addConstraint('type', ['number', {\n step: this.$element.attr('step'),\n base: this.$element.attr('min') || this.$element.attr('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range)$/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 ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.$element.is('input[type=radio]'))\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (this.$element.is('input[type=checkbox]')) {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n\n // Select multiple case\n if (this.$element.is('select') && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n};\n\nexport default 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 if ('object' === typeof options) {\n $.extend(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && '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 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((i, input) => {\n if ($(input).is('input[type=radio], input[type=checkbox]'))\n $(input).attr(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('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 new ParsleyAbstract(),\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 new ParsleyAbstract(),\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 new ParsleyAbstract(),\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._actualizeTriggers();\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, ParsleyUI.Field, ParsleyAbstract.prototype);\n$.extend(ParsleyForm.prototype, ParsleyUI.Form, 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](...arguments);\n };\n});\n\n// ### ParsleyUI\n// Deprecated global object\nwindow.Parsley.UI = ParsleyUI;\nwindow.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils.warnOnce(`Accessing ParsleyUI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n ParsleyUtils.warnOnce(`Accessing ParsleyUI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n};\n$.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n ParsleyUtils.warnOnce(`Accessing ParsleyUI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n});\n\n// ### PARSLEY auto-binding\n// Prevent it by setting `ParsleyConfig.autoBind` to `false`\nif (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n}\n\nexport default Parsley;\n","import $ from 'jquery';\n\nimport Parsley from './main';\n\n$.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n});\n\nParsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.$element.attr('name') || instance.$element.attr('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n});\n\nParsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n});\n\nwindow.ParsleyExtend.addAsyncValidator = function () {\n ParsleyUtils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n};\n","// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\nimport Parsley from '../parsley/main';\n\nParsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\"\n});\n\nParsley.setLocale('en');\n","import $ from 'jquery';\nimport Parsley from './parsley/main';\nimport './parsley/pubsub';\nimport './parsley/remote';\nimport './i18n/en';\nimport inputevent from './vendor/inputevent';\n\ninputevent.install();\n\nexport default Parsley;\n"],"sourceRoot":"/source/"} diff --git a/doc/annotated-source/validator_registry.html b/doc/annotated-source/validator_registry.html index 188e31f90..886ec619e 100644 --- a/doc/annotated-source/validator_registry.html +++ b/doc/annotated-source/validator_registry.html @@ -132,8 +132,7 @@

                          validator_registry.js

                          this.init(validators || {}, catalog || {}); }; -var typeRegexes = { - 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, +var typeRegexes = { @@ -144,6 +143,21 @@

                          validator_registry.js

                          +

                          @See: http://qiita.com/sakuro/items/1eaa307609ceaaf51123

                          + + + +
                            email: /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/i,
                          + + + + +
                        • + @@ -162,11 +176,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          protocol identifier

                          @@ -177,11 +191,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          user:pass authentication

                          @@ -193,11 +207,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          IP address exclusion private & local networks @@ -220,11 +234,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          host name

                          @@ -235,11 +249,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          domain name

                          @@ -250,11 +264,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          TLD identifier

                          @@ -266,11 +280,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          port number

                          @@ -281,11 +295,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          resource path

                          @@ -300,11 +314,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          See http://stackoverflow.com/a/10454560/8279

                          @@ -319,11 +333,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          Number of digits right of decimal point.

                          @@ -334,11 +348,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          Adjust for scientific notation.

                          @@ -354,11 +368,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          Copy prototype’s validators:

                          @@ -375,11 +389,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n

                          @@ -397,11 +411,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          Add a new messages catalog for a given locale. Set locale for this catalog if set === true

                          @@ -420,11 +434,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          Add a specific message for a given constraint in a given locale

                          @@ -442,11 +456,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          Add messages for a given locale

                          @@ -462,11 +476,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          Add a new validator

                          addValidator(‘custom’, { @@ -515,11 +529,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          Old style validator, with fn and priority

                          @@ -547,11 +561,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          Type constraints are a bit different, we have to match their requirements too to find right error message

                          @@ -569,11 +583,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          Kind of light sprintf() implementation

                          @@ -593,11 +607,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          Here is the Parsley default validators list. A validator is an object with the following key values:

                          @@ -644,11 +658,11 @@

                          validator_registry.js

                        • -
                        • +
                        • - +

                          Be careful of rounding errors by using integers.

                          diff --git a/src/parsley/validator_registry.js b/src/parsley/validator_registry.js index b6ddf2382..22f84c5c0 100644 --- a/src/parsley/validator_registry.js +++ b/src/parsley/validator_registry.js @@ -13,7 +13,8 @@ var ParsleyValidatorRegistry = function (validators, catalog) { }; var typeRegexes = { - 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, + // @See: http://qiita.com/sakuro/items/1eaa307609ceaaf51123 + email: /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/i, // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers number: /^-?(\d*\.)?\d+(e[-+]?\d+)?$/i,