{"version":3,"file":"5144d77876bdbe2ed0adf430.js?3.8.2.d0a3b62f4.1729269695286","mappings":"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","sources":["webpack://mono-repo/./src/js/lib/formValidation/dist/js/formValidation.js"],"sourcesContent":["/*!\n * FormValidation (http://formvalidation.io)\n * The best jQuery plugin to validate form fields. Support Bootstrap, Foundation, Pure, SemanticUI, UIKit and custom frameworks\n *\n * @version v0.7.0, built on 2015-08-01 4:57:16 PM\n * @author https://twitter.com/formvalidation\n * @copyright (c) 2013 - 2015 Nguyen Huu Phuoc\n * @license http://formvalidation.io/license/\n */\n// Register the namespace\nwindow.FormValidation = {\n AddOn: {}, // Add-ons\n Framework: {}, // Supported frameworks\n I18n: {}, // i18n\n Validator: {} // Available validators\n};\n\nif (typeof jQuery === 'undefined') {\n throw new Error('FormValidation requires jQuery');\n}\n\n(function($) {\n var version = $.fn.jquery.split(' ')[0].split('.');\n if ((+version[0] < 2 && +version[1] < 9) || (+version[0] === 1 && +version[1] === 9 && +version[2] < 1)) {\n throw new Error('FormValidation requires jQuery version 1.9.1 or higher');\n }\n}(jQuery));\n\n(function($) {\n // TODO: Remove backward compatibility\n /**\n * Constructor\n *\n * @param {jQuery|String} form The form element or selector\n * @param {Object} options The options\n * @param {String} [namespace] The optional namespace which is used for data-{namespace}-xxx attributes and internal data.\n * Currently, it's used to support backward version\n * @constructor\n */\n FormValidation.Base = function(form, options, namespace) {\n this.$form = $(form);\n this.options = $.extend({}, $.fn.formValidation.DEFAULT_OPTIONS, options);\n this._namespace = namespace || 'fv';\n\n this.$invalidFields = $([]); // Array of invalid fields\n this.$submitButton = null; // The submit button which is clicked to submit form\n this.$hiddenButton = null;\n\n // Validating status\n this.STATUS_NOT_VALIDATED = 'NOT_VALIDATED';\n this.STATUS_VALIDATING = 'VALIDATING';\n this.STATUS_INVALID = 'INVALID';\n this.STATUS_VALID = 'VALID';\n this.STATUS_IGNORED = 'IGNORED';\n\n // Default message\n this.DEFAULT_MESSAGE = $.fn.formValidation.DEFAULT_MESSAGE;\n\n // Determine the event that is fired when user change the field value\n // Most modern browsers supports input event except IE 7, 8.\n // IE 9 supports input event but the event is still not fired if I press the backspace key.\n // Get IE version\n // https://gist.github.com/padolsey/527683/#comment-7595\n this._ieVersion = (function() {\n var v = 3, div = document.createElement('div'), a = div.all || [];\n while (div.innerHTML = '', a[0]) {}\n return v > 4 ? v : document.documentMode;\n }());\n\n var el = document.createElement('div');\n this._changeEvent = (this._ieVersion === 9 || !('oninput' in el)) ? 'keyup' : 'input';\n\n // The flag to indicate that the form is ready to submit when a remote/callback validator returns\n this._submitIfValid = null;\n\n // Field elements\n this._cacheFields = {};\n\n this._init();\n };\n\n FormValidation.Base.prototype = {\n constructor: FormValidation.Base,\n\n /**\n * Check if the number of characters of field value exceed the threshold or not\n *\n * @param {jQuery} $field The field element\n * @returns {Boolean}\n */\n _exceedThreshold: function($field) {\n var ns = this._namespace,\n field = $field.attr('data-' + ns + '-field'),\n threshold = this.options.fields[field].threshold || this.options.threshold;\n if (!threshold) {\n return true;\n }\n var cannotType = $.inArray($field.attr('type'), ['button', 'checkbox', 'file', 'hidden', 'image', 'radio', 'reset', 'submit']) !== -1;\n return (cannotType || $field.val().length >= threshold);\n },\n\n /**\n * Init form\n */\n _init: function() {\n var that = this,\n ns = this._namespace,\n options = {\n addOns: {},\n autoFocus: this.$form.attr('data-' + ns + '-autofocus'),\n button: {\n selector: this.$form.attr('data-' + ns + '-button-selector') || this.$form.attr('data-' + ns + '-submitbuttons'), // Support backward\n disabled: this.$form.attr('data-' + ns + '-button-disabled')\n },\n control: {\n valid: this.$form.attr('data-' + ns + '-control-valid'),\n invalid: this.$form.attr('data-' + ns + '-control-invalid')\n },\n err: {\n clazz: this.$form.attr('data-' + ns + '-err-clazz'),\n container: this.$form.attr('data-' + ns + '-err-container') || this.$form.attr('data-' + ns + '-container'), // Support backward\n parent: this.$form.attr('data-' + ns + '-err-parent')\n },\n events: {\n formInit: this.$form.attr('data-' + ns + '-events-form-init'),\n formPreValidate: this.$form.attr('data-' + ns + '-events-form-prevalidate'),\n formError: this.$form.attr('data-' + ns + '-events-form-error'),\n formSuccess: this.$form.attr('data-' + ns + '-events-form-success'),\n fieldAdded: this.$form.attr('data-' + ns + '-events-field-added'),\n fieldRemoved: this.$form.attr('data-' + ns + '-events-field-removed'),\n fieldInit: this.$form.attr('data-' + ns + '-events-field-init'),\n fieldError: this.$form.attr('data-' + ns + '-events-field-error'),\n fieldSuccess: this.$form.attr('data-' + ns + '-events-field-success'),\n fieldStatus: this.$form.attr('data-' + ns + '-events-field-status'),\n localeChanged: this.$form.attr('data-' + ns + '-events-locale-changed'),\n validatorError: this.$form.attr('data-' + ns + '-events-validator-error'),\n validatorSuccess: this.$form.attr('data-' + ns + '-events-validator-success'),\n validatorIgnored: this.$form.attr('data-' + ns + '-events-validator-ignored')\n },\n excluded: this.$form.attr('data-' + ns + '-excluded'),\n icon: {\n valid: this.$form.attr('data-' + ns + '-icon-valid') || this.$form.attr('data-' + ns + '-feedbackicons-valid'), // Support backward\n invalid: this.$form.attr('data-' + ns + '-icon-invalid') || this.$form.attr('data-' + ns + '-feedbackicons-invalid'), // Support backward\n validating: this.$form.attr('data-' + ns + '-icon-validating') || this.$form.attr('data-' + ns + '-feedbackicons-validating'), // Support backward\n feedback: this.$form.attr('data-' + ns + '-icon-feedback')\n },\n live: this.$form.attr('data-' + ns + '-live'),\n locale: this.$form.attr('data-' + ns + '-locale'),\n message: this.$form.attr('data-' + ns + '-message'),\n onPreValidate: this.$form.attr('data-' + ns + '-onprevalidate'),\n onError: this.$form.attr('data-' + ns + '-onerror'),\n onSuccess: this.$form.attr('data-' + ns + '-onsuccess'),\n row: {\n selector: this.$form.attr('data-' + ns + '-row-selector') || this.$form.attr('data-' + ns + '-group'), // Support backward\n valid: this.$form.attr('data-' + ns + '-row-valid'),\n invalid: this.$form.attr('data-' + ns + '-row-invalid'),\n feedback: this.$form.attr('data-' + ns + '-row-feedback')\n },\n threshold: this.$form.attr('data-' + ns + '-threshold'),\n trigger: this.$form.attr('data-' + ns + '-trigger'),\n verbose: this.$form.attr('data-' + ns + '-verbose'),\n fields: {}\n };\n\n this.$form\n // Disable client side validation in HTML 5\n .attr('novalidate', 'novalidate')\n .addClass(this.options.elementClass)\n // Disable the default submission first\n .on('submit.' + ns, function(e) {\n e.preventDefault();\n that.validate();\n })\n .on('click.' + ns, this.options.button.selector, function() {\n that.$submitButton = $(this);\n // The user just click the submit button\n that._submitIfValid = true;\n });\n\n if (this.options.declarative === true || this.options.declarative === 'true') {\n // Find all fields which have either \"name\" or \"data-{namespace}-field\" attribute\n this.$form\n .find('[name], [data-' + ns + '-field]')\n .each(function() {\n var $field = $(this),\n field = $field.attr('name') || $field.attr('data-' + ns + '-field'),\n opts = that._parseOptions($field);\n if (opts) {\n $field.attr('data-' + ns + '-field', field);\n options.fields[field] = $.extend({}, opts, options.fields[field]);\n }\n });\n }\n\n this.options = $.extend(true, this.options, options);\n\n // Normalize the err.parent option\n if ('string' === typeof this.options.err.parent) {\n this.options.err.parent = new RegExp(this.options.err.parent);\n }\n\n // Support backward\n if (this.options.container) {\n this.options.err.container = this.options.container;\n delete this.options.container;\n }\n if (this.options.feedbackIcons) {\n this.options.icon = $.extend(true, this.options.icon, this.options.feedbackIcons);\n delete this.options.feedbackIcons;\n }\n if (this.options.group) {\n this.options.row.selector = this.options.group;\n delete this.options.group;\n }\n if (this.options.submitButtons) {\n this.options.button.selector = this.options.submitButtons;\n delete this.options.submitButtons;\n }\n\n // If the locale is not found, reset it to default one\n if (!FormValidation.I18n[this.options.locale]) {\n this.options.locale = $.fn.formValidation.DEFAULT_OPTIONS.locale;\n }\n\n // Parse the add-on options from HTML attributes\n if (this.options.declarative === true || this.options.declarative === 'true') {\n this.options = $.extend(true, this.options, { addOns: this._parseAddOnOptions() });\n }\n\n // When pressing Enter on any field in the form, the first submit button will do its job.\n // The form then will be submitted.\n // I create a first hidden submit button\n this.$hiddenButton = $('')\n .attr('type', 'submit')\n .prependTo(this.$form)\n .addClass('fv-hidden-submit')\n .css({ display: 'none', width: 0, height: 0 });\n\n this.$form\n .on('click.' + this._namespace, '[type=\"submit\"]', function(e) {\n // #746: Check if the button click handler returns false\n if (!e.isDefaultPrevented()) {\n var $target = $(e.target),\n // The button might contain HTML tag\n $button = $target.is('[type=\"submit\"]') ? $target.eq(0) : $target.parent('[type=\"submit\"]').eq(0);\n\n // Don't perform validation when clicking on the submit button/input which\n // aren't defined by the 'button.selector' option\n if (that.options.button.selector && !$button.is(that.options.button.selector) && !$button.is(that.$hiddenButton)) {\n that.$form.off('submit.' + that._namespace).submit();\n }\n }\n });\n\n for (var field in this.options.fields) {\n this._initField(field);\n }\n\n // Init the add-ons\n for (var addOn in this.options.addOns) {\n if ('function' === typeof FormValidation.AddOn[addOn].init) {\n FormValidation.AddOn[addOn].init(this, this.options.addOns[addOn]);\n }\n }\n\n this.$form.trigger($.Event(this.options.events.formInit), {\n bv: this, // Support backward\n fv: this,\n options: this.options\n });\n\n // Prepare the events\n if (this.options.onPreValidate) {\n this.$form.on(this.options.events.formPreValidate, function(e) {\n FormValidation.Helper.call(that.options.onPreValidate, [e]);\n });\n }\n if (this.options.onSuccess) {\n this.$form.on(this.options.events.formSuccess, function(e) {\n FormValidation.Helper.call(that.options.onSuccess, [e]);\n });\n }\n if (this.options.onError) {\n this.$form.on(this.options.events.formError, function(e) {\n FormValidation.Helper.call(that.options.onError, [e]);\n });\n }\n },\n\n /**\n * Init field\n *\n * @param {String|jQuery} field The field name or field element\n */\n _initField: function(field) {\n var ns = this._namespace,\n fields = $([]);\n switch (typeof field) {\n case 'object':\n fields = field;\n field = field.attr('data-' + ns + '-field');\n break;\n case 'string':\n fields = this.getFieldElements(field);\n fields.attr('data-' + ns + '-field', field);\n break;\n default:\n break;\n }\n\n // We don't need to validate non-existing fields\n if (fields.length === 0) {\n return;\n }\n\n if (this.options.fields[field] === null || this.options.fields[field].validators === null) {\n return;\n }\n\n var validators = this.options.fields[field].validators,\n validatorName,\n alias;\n for (validatorName in validators) {\n alias = validators[validatorName].alias || validatorName;\n if (!FormValidation.Validator[alias]) {\n delete this.options.fields[field].validators[validatorName];\n }\n }\n if (this.options.fields[field].enabled === null) {\n this.options.fields[field].enabled = true;\n }\n\n var that = this,\n total = fields.length,\n type = fields.attr('type'),\n updateAll = (total === 1) || ('radio' === type) || ('checkbox' === type),\n trigger = this._getFieldTrigger(fields.eq(0)),\n events = $.map(trigger, function(item) {\n return item + '.update.' + ns;\n }).join(' ');\n\n for (var i = 0; i < total; i++) {\n var $field = fields.eq(i),\n row = this.options.fields[field].row || this.options.row.selector,\n $parent = $field.closest(row),\n // Allow user to indicate where the error messages are shown\n // Support backward\n container = ('function' === typeof (this.options.fields[field].container || this.options.fields[field].err || this.options.err.container))\n ? (this.options.fields[field].container || this.options.fields[field].err || this.options.err.container).call(this, $field, this)\n : (this.options.fields[field].container || this.options.fields[field].err || this.options.err.container),\n $message = (container && container !== 'tooltip' && container !== 'popover') ? $(container) : this._getMessageContainer($field, row);\n\n if (container && container !== 'tooltip' && container !== 'popover') {\n $message.addClass(this.options.err.clazz);\n }\n\n // Remove all error messages and feedback icons\n $message.find('.' + this.options.err.clazz.split(' ').join('.') + '[data-' + ns + '-validator][data-' + ns + '-for=\"' + field + '\"]').remove();\n $parent.find('i[data-' + ns + '-icon-for=\"' + field + '\"]').remove();\n\n // Whenever the user change the field value, mark it as not validated yet\n $field.off(events).on(events, function() {\n that.updateStatus($(this), that.STATUS_NOT_VALIDATED);\n });\n\n // Create help block elements for showing the error messages\n $field.data(ns + '.messages', $message);\n for (validatorName in validators) {\n $field.data(ns + '.result.' + validatorName, this.STATUS_NOT_VALIDATED);\n\n if (!updateAll || i === total - 1) {\n $('')\n .css('display', 'none')\n .addClass(this.options.err.clazz)\n .attr('data-' + ns + '-validator', validatorName)\n .attr('data-' + ns + '-for', field)\n .attr('data-' + ns + '-result', this.STATUS_NOT_VALIDATED)\n .html(this._getMessage(field, validatorName))\n .appendTo($message);\n }\n\n // Init the validator\n alias = validators[validatorName].alias || validatorName;\n if ('function' === typeof FormValidation.Validator[alias].init) {\n FormValidation.Validator[alias].init(this, $field, this.options.fields[field].validators[validatorName], validatorName);\n }\n }\n\n // Prepare the feedback icons\n if (this.options.fields[field].icon !== false && this.options.fields[field].icon !== 'false'\n && this.options.icon\n && this.options.icon.valid && this.options.icon.invalid && this.options.icon.validating\n && (!updateAll || i === total - 1))\n {\n // $parent.removeClass(this.options.row.valid).removeClass(this.options.row.invalid).addClass(this.options.row.feedback);\n // Keep error messages which are populated from back-end\n $parent.addClass(this.options.row.feedback);\n var $icon = $('')\n .css('display', 'none')\n .addClass(this.options.icon.feedback)\n .attr('data-' + ns + '-icon-for', field)\n .insertAfter($field);\n\n // Store the icon as a data of field element\n (!updateAll ? $field : fields).data(ns + '.icon', $icon);\n\n if ('tooltip' === container || 'popover' === container) {\n (!updateAll ? $field : fields)\n .on(this.options.events.fieldError, function() {\n $parent.addClass('fv-has-tooltip');\n })\n .on(this.options.events.fieldSuccess, function() {\n $parent.removeClass('fv-has-tooltip');\n });\n\n $field\n // Show tooltip/popover message when field gets focus\n .off('focus.container.' + ns)\n .on('focus.container.' + ns, function() {\n that._showTooltip($(this), container);\n })\n // and hide them when losing focus\n .off('blur.container.' + ns)\n .on('blur.container.' + ns, function() {\n that._hideTooltip($(this), container);\n });\n }\n\n if ('string' === typeof this.options.fields[field].icon && this.options.fields[field].icon !== 'true') {\n $icon.appendTo($(this.options.fields[field].icon));\n } else {\n this._fixIcon($field, $icon);\n }\n }\n }\n\n // Prepare the events\n fields\n .on(this.options.events.fieldSuccess, function(e, data) {\n var onSuccess = that.getOptions(data.field, null, 'onSuccess');\n if (onSuccess) {\n FormValidation.Helper.call(onSuccess, [e, data]);\n }\n })\n .on(this.options.events.fieldError, function(e, data) {\n var onError = that.getOptions(data.field, null, 'onError');\n if (onError) {\n FormValidation.Helper.call(onError, [e, data]);\n }\n })\n .on(this.options.events.fieldStatus, function(e, data) {\n var onStatus = that.getOptions(data.field, null, 'onStatus');\n if (onStatus) {\n FormValidation.Helper.call(onStatus, [e, data]);\n }\n })\n .on(this.options.events.validatorError, function(e, data) {\n var onError = that.getOptions(data.field, data.validator, 'onError');\n if (onError) {\n FormValidation.Helper.call(onError, [e, data]);\n }\n })\n .on(this.options.events.validatorIgnored, function(e, data) {\n var onIgnored = that.getOptions(data.field, data.validator, 'onIgnored');\n if (onIgnored) {\n FormValidation.Helper.call(onIgnored, [e, data]);\n }\n })\n .on(this.options.events.validatorSuccess, function(e, data) {\n var onSuccess = that.getOptions(data.field, data.validator, 'onSuccess');\n if (onSuccess) {\n FormValidation.Helper.call(onSuccess, [e, data]);\n }\n });\n\n // Set live mode\n this.onLiveChange(fields, 'live', function() {\n if (that._exceedThreshold($(this))) {\n that.validateField($(this));\n }\n });\n\n fields.trigger($.Event(this.options.events.fieldInit), {\n bv: this, // Support backward\n fv: this,\n field: field,\n element: fields\n });\n },\n\n /**\n * Check if the field is excluded.\n * Returning true means that the field will not be validated\n *\n * @param {jQuery} $field The field element\n * @returns {Boolean}\n */\n _isExcluded: function($field) {\n var ns = this._namespace,\n excludedAttr = $field.attr('data-' + ns + '-excluded'),\n // I still need to check the 'name' attribute while initializing the field\n field = $field.attr('data-' + ns + '-field') || $field.attr('name');\n\n switch (true) {\n case (!!field && this.options.fields && this.options.fields[field] && (this.options.fields[field].excluded === 'true' || this.options.fields[field].excluded === true)):\n case (excludedAttr === 'true'):\n case (excludedAttr === ''):\n return true;\n\n case (!!field && this.options.fields && this.options.fields[field] && (this.options.fields[field].excluded === 'false' || this.options.fields[field].excluded === false)):\n case (excludedAttr === 'false'):\n return false;\n\n case (!!field && this.options.fields && this.options.fields[field] && 'function' === typeof this.options.fields[field].excluded):\n return this.options.fields[field].excluded.call(this, $field, this);\n\n case (!!field && this.options.fields && this.options.fields[field] && 'string' === typeof this.options.fields[field].excluded):\n case (excludedAttr):\n return FormValidation.Helper.call(this.options.fields[field].excluded, [$field, this]);\n\n default:\n if (this.options.excluded) {\n // Convert to array first\n if ('string' === typeof this.options.excluded) {\n this.options.excluded = $.map(this.options.excluded.split(','), function(item) {\n // Trim the spaces\n return $.trim(item);\n });\n }\n\n var length = this.options.excluded.length;\n for (var i = 0; i < length; i++) {\n if (('string' === typeof this.options.excluded[i] && $field.is(this.options.excluded[i]))\n || ('function' === typeof this.options.excluded[i] && this.options.excluded[i].call(this, $field, this) === true))\n {\n return true;\n }\n }\n }\n return false;\n }\n },\n\n /**\n * Get a field changed trigger event\n *\n * @param {jQuery} $field The field element\n * @returns {String[]} The event names triggered on field change\n */\n _getFieldTrigger: function($field) {\n var ns = this._namespace,\n trigger = $field.data(ns + '.trigger');\n if (trigger) {\n return trigger;\n }\n\n // IE10/11 auto fires input event of elements using the placeholder attribute\n // https://connect.microsoft.com/IE/feedback/details/856700/\n var type = $field.attr('type'),\n name = $field.attr('data-' + ns + '-field'),\n event = ('radio' === type || 'checkbox' === type || 'file' === type || 'SELECT' === $field.get(0).tagName)\n ? 'change'\n : (this._ieVersion >= 10 && $field.attr('placeholder') ? 'keyup' : this._changeEvent);\n trigger = ((this.options.fields[name] ? this.options.fields[name].trigger : null) || this.options.trigger || event).split(' ');\n\n // Since the trigger data is used many times, I need to cache it to use later\n $field.data(ns + '.trigger', trigger);\n\n return trigger;\n },\n\n /**\n * Get the error message for given field and validator\n *\n * @param {String} field The field name\n * @param {String} validatorName The validator name\n * @returns {String}\n */\n _getMessage: function(field, validatorName) {\n if (!this.options.fields[field] || !this.options.fields[field].validators) {\n return '';\n }\n var validators = this.options.fields[field].validators,\n alias = (validators[validatorName] && validators[validatorName].alias) ? validators[validatorName].alias : validatorName;\n if (!FormValidation.Validator[alias]) {\n return '';\n }\n\n switch (true) {\n case !!validators[validatorName].message:\n return validators[validatorName].message;\n case !!this.options.fields[field].message:\n return this.options.fields[field].message;\n case !!this.options.message:\n return this.options.message;\n case (!!FormValidation.I18n[this.options.locale] && !!FormValidation.I18n[this.options.locale][alias] && !!FormValidation.I18n[this.options.locale][alias]['default']):\n return FormValidation.I18n[this.options.locale][alias]['default'];\n default:\n return this.DEFAULT_MESSAGE;\n }\n },\n\n /**\n * Get the element to place the error messages\n *\n * @param {jQuery} $field The field element\n * @param {String} row\n * @returns {jQuery}\n */\n _getMessageContainer: function($field, row) {\n if (!this.options.err.parent) {\n throw new Error('The err.parent option is not defined');\n }\n\n var $parent = $field.parent();\n if ($parent.is(row)) {\n return $parent;\n }\n\n var cssClasses = $parent.attr('class');\n if (!cssClasses) {\n return this._getMessageContainer($parent, row);\n }\n\n if (this.options.err.parent.test(cssClasses)) {\n return $parent;\n }\n\n return this._getMessageContainer($parent, row);\n },\n\n /**\n * Parse the add-on options from HTML attributes\n *\n * @returns {Object}\n */\n _parseAddOnOptions: function() {\n var ns = this._namespace,\n names = this.$form.attr('data-' + ns + '-addons'),\n addOns = this.options.addOns || {};\n\n if (names) {\n names = names.replace(/\\s/g, '').split(',');\n for (var i = 0; i < names.length; i++) {\n if (!addOns[names[i]]) {\n addOns[names[i]] = {};\n }\n }\n }\n\n // Try to parse each add-on options\n var addOn, attrMap, attr, option;\n for (addOn in addOns) {\n if (!FormValidation.AddOn[addOn]) {\n // Add-on is not found\n delete addOns[addOn];\n continue;\n }\n\n attrMap = FormValidation.AddOn[addOn].html5Attributes;\n if (attrMap) {\n for (attr in attrMap) {\n option = this.$form.attr('data-' + ns + '-addons-' + addOn.toLowerCase() + '-' + attr.toLowerCase());\n if (option) {\n addOns[addOn][attrMap[attr]] = option;\n }\n }\n }\n }\n\n return addOns;\n },\n\n /**\n * Parse the validator options from HTML attributes\n *\n * @param {jQuery} $field The field element\n * @returns {Object}\n */\n _parseOptions: function($field) {\n var ns = this._namespace,\n field = $field.attr('name') || $field.attr('data-' + ns + '-field'),\n validators = {},\n aliasAttr = new RegExp('^data-' + ns + '-([a-z]+)-alias$'),\n validatorSet = $.extend({}, FormValidation.Validator),\n validator,\n v, // Validator name\n attrName,\n enabled,\n optionName,\n optionAttrName,\n optionValue,\n html5AttrName,\n html5AttrMap;\n\n // Determine whether the alias validator is used by checking the data-fv-validator-alias attribute\n $.each($field.get(0).attributes, function(i, attribute) {\n if (attribute.value && aliasAttr.test(attribute.name)) {\n v = attribute.name.split('-')[2];\n if (validatorSet[attribute.value]) {\n validatorSet[v] = validatorSet[attribute.value];\n validatorSet[v].alias = attribute.value;\n }\n }\n });\n\n for (v in validatorSet) {\n validator = validatorSet[v];\n attrName = 'data-' + ns + '-' + v.toLowerCase(),\n enabled = $field.attr(attrName) + '';\n html5AttrMap = ('function' === typeof validator.enableByHtml5) ? validator.enableByHtml5($field) : null;\n\n if ((html5AttrMap && enabled !== 'false')\n || (html5AttrMap !== true && ('' === enabled || 'true' === enabled || attrName === enabled.toLowerCase())))\n {\n // Try to parse the options via attributes\n validator.html5Attributes = $.extend({}, {\n message: 'message',\n onerror: 'onError',\n onsuccess: 'onSuccess',\n transformer: 'transformer'\n }, validator.html5Attributes);\n validators[v] = $.extend({}, html5AttrMap === true ? {} : html5AttrMap, validators[v]);\n if (validator.alias) {\n validators[v].alias = validator.alias;\n }\n\n for (html5AttrName in validator.html5Attributes) {\n optionName = validator.html5Attributes[html5AttrName];\n optionAttrName = 'data-' + ns + '-' + v.toLowerCase() + '-' + html5AttrName;\n optionValue = $field.attr(optionAttrName);\n if (optionValue) {\n if ('true' === optionValue || optionAttrName === optionValue.toLowerCase()) {\n optionValue = true;\n } else if ('false' === optionValue) {\n optionValue = false;\n }\n validators[v][optionName] = optionValue;\n }\n }\n }\n }\n\n var opts = {\n autoFocus: $field.attr('data-' + ns + '-autofocus'),\n err: $field.attr('data-' + ns + '-err-container') || $field.attr('data-' + ns + '-container'), // Support backward\n enabled: $field.attr('data-' + ns + '-enabled'),\n excluded: $field.attr('data-' + ns + '-excluded'),\n icon: $field.attr('data-' + ns + '-icon') || $field.attr('data-' + ns + '-feedbackicons') || (this.options.fields && this.options.fields[field] ? this.options.fields[field].feedbackIcons : null), // Support backward\n message: $field.attr('data-' + ns + '-message'),\n onError: $field.attr('data-' + ns + '-onerror'),\n onStatus: $field.attr('data-' + ns + '-onstatus'),\n onSuccess: $field.attr('data-' + ns + '-onsuccess'),\n row: $field.attr('data-' + ns + '-row') || $field.attr('data-' + ns + '-group') || (this.options.fields && this.options.fields[field] ? this.options.fields[field].group : null), // Support backward\n selector: $field.attr('data-' + ns + '-selector'),\n threshold: $field.attr('data-' + ns + '-threshold'),\n transformer: $field.attr('data-' + ns + '-transformer'),\n trigger: $field.attr('data-' + ns + '-trigger'),\n verbose: $field.attr('data-' + ns + '-verbose'),\n validators: validators\n },\n emptyOptions = $.isEmptyObject(opts), // Check if the field options are set using HTML attributes\n emptyValidators = $.isEmptyObject(validators); // Check if the field validators are set using HTML attributes\n\n if (!emptyValidators || (!emptyOptions && this.options.fields && this.options.fields[field])) {\n //opts.validators = validators;\n return opts;\n } else {\n return null;\n }\n },\n\n /**\n * Called when all validations are completed\n */\n _submit: function() {\n var isValid = this.isValid();\n if (isValid === null) {\n return;\n }\n\n var eventType = isValid ? this.options.events.formSuccess : this.options.events.formError,\n e = $.Event(eventType);\n\n this.$form.trigger(e);\n\n // Call default handler\n // Check if whether the submit button is clicked\n if (this.$submitButton) {\n isValid ? this._onSuccess(e) : this._onError(e);\n }\n },\n\n // ~~~~~~\n // Events\n // ~~~~~~\n\n /**\n * The default handler of error.form.fv event.\n * It will be called when there is a invalid field\n *\n * @param {jQuery.Event} e The jQuery event object\n */\n _onError: function(e) {\n if (e.isDefaultPrevented()) {\n return;\n }\n\n if ('submitted' === this.options.live) {\n // Enable live mode\n this.options.live = 'enabled';\n\n var that = this;\n for (var field in this.options.fields) {\n (function(f) {\n var fields = that.getFieldElements(f);\n if (fields.length) {\n that.onLiveChange(fields, 'live', function() {\n if (that._exceedThreshold($(this))) {\n that.validateField($(this));\n }\n });\n }\n })(field);\n }\n }\n\n // Determined the first invalid field which will be focused on automatically\n var ns = this._namespace;\n for (var i = 0; i < this.$invalidFields.length; i++) {\n var $field = this.$invalidFields.eq(i),\n autoFocus = this.isOptionEnabled($field.attr('data-' + ns + '-field'), 'autoFocus');\n if (autoFocus) {\n // Focus the field\n $field.focus();\n break;\n }\n }\n },\n\n /**\n * Called after validating a field element\n *\n * @param {jQuery} $field The field element\n * @param {String} [validatorName] The validator name\n */\n _onFieldValidated: function($field, validatorName) {\n var ns = this._namespace,\n field = $field.attr('data-' + ns + '-field'),\n validators = this.options.fields[field].validators,\n counter = {},\n numValidators = 0,\n data = {\n bv: this, // Support backward\n fv: this,\n field: field,\n element: $field,\n validator: validatorName,\n result: $field.data(ns + '.response.' + validatorName)\n };\n\n // Trigger an event after given validator completes\n if (validatorName) {\n switch ($field.data(ns + '.result.' + validatorName)) {\n case this.STATUS_INVALID:\n $field.trigger($.Event(this.options.events.validatorError), data);\n break;\n case this.STATUS_VALID:\n $field.trigger($.Event(this.options.events.validatorSuccess), data);\n break;\n case this.STATUS_IGNORED:\n $field.trigger($.Event(this.options.events.validatorIgnored), data);\n break;\n default:\n break;\n }\n }\n\n counter[this.STATUS_NOT_VALIDATED] = 0;\n counter[this.STATUS_VALIDATING] = 0;\n counter[this.STATUS_INVALID] = 0;\n counter[this.STATUS_VALID] = 0;\n counter[this.STATUS_IGNORED] = 0;\n\n for (var v in validators) {\n if (validators[v].enabled === false) {\n continue;\n }\n\n numValidators++;\n var result = $field.data(ns + '.result.' + v);\n if (result) {\n counter[result]++;\n }\n }\n\n // The sum of valid fields now also include ignored fields\n if (counter[this.STATUS_VALID] + counter[this.STATUS_IGNORED] === numValidators) {\n // Remove from the list of invalid fields\n this.$invalidFields = this.$invalidFields.not($field);\n\n $field.trigger($.Event(this.options.events.fieldSuccess), data);\n }\n // If all validators are completed and there is at least one validator which doesn't pass\n else if ((counter[this.STATUS_NOT_VALIDATED] === 0 || !this.isOptionEnabled(field, 'verbose')) && counter[this.STATUS_VALIDATING] === 0 && counter[this.STATUS_INVALID] > 0) {\n // Add to the list of invalid fields\n this.$invalidFields = this.$invalidFields.add($field);\n\n $field.trigger($.Event(this.options.events.fieldError), data);\n }\n },\n\n /**\n * The default handler of success.form.fv event.\n * It will be called when all the fields are valid\n *\n * @param {jQuery.Event} e The jQuery event object\n */\n _onSuccess: function(e) {\n if (e.isDefaultPrevented()) {\n return;\n }\n\n // Submit the form\n this.disableSubmitButtons(true).defaultSubmit();\n },\n\n // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n // Abstract methods\n // Need to be implemented by sub-class that supports specific framework\n // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n /**\n * Specific framework might need to adjust the icon position\n *\n * @param {jQuery} $field The field element\n * @param {jQuery} $icon The icon element\n */\n _fixIcon: function($field, $icon) {\n },\n\n /**\n * Create a tooltip or popover\n * It will be shown when focusing on the field\n *\n * @param {jQuery} $field The field element\n * @param {String} message The message\n * @param {String} type Can be 'tooltip' or 'popover'\n */\n _createTooltip: function($field, message, type) {\n },\n\n /**\n * Destroy the tooltip or popover\n *\n * @param {jQuery} $field The field element\n * @param {String} type Can be 'tooltip' or 'popover'\n */\n _destroyTooltip: function($field, type) {\n },\n\n /**\n * Hide a tooltip or popover\n *\n * @param {jQuery} $field The field element\n * @param {String} type Can be 'tooltip' or 'popover'\n */\n _hideTooltip: function($field, type) {\n },\n\n /**\n * Show a tooltip or popover\n *\n * @param {jQuery} $field The field element\n * @param {String} type Can be 'tooltip' or 'popover'\n */\n _showTooltip: function($field, type) {\n },\n\n // ~~~~~~~~~~~~~~\n // Public methods\n // ~~~~~~~~~~~~~~\n\n /**\n * Submit the form using default submission.\n * It also does not perform any validations when submitting the form\n */\n defaultSubmit: function() {\n var ns = this._namespace;\n if (this.$submitButton) {\n // Create hidden input to send the submit buttons\n $('')\n .attr({\n 'type': 'hidden',\n name: this.$submitButton.attr('name')\n })\n .attr('data-' + ns + '-submit-hidden', '')\n .val(this.$submitButton.val())\n .appendTo(this.$form);\n }\n\n // Submit form\n this.$form.off('submit.' + ns).submit();\n },\n\n /**\n * Disable/enable submit buttons\n *\n * @param {Boolean} disabled Can be true or false\n * @returns {FormValidation.Base}\n */\n disableSubmitButtons: function(disabled) {\n if (!disabled) {\n this.$form\n .find(this.options.button.selector)\n .removeAttr('disabled')\n .removeClass(this.options.button.disabled);\n } else if (this.options.live !== 'disabled') {\n // Don't disable if the live validating mode is disabled\n this.$form\n .find(this.options.button.selector)\n .attr('disabled', 'disabled')\n .addClass(this.options.button.disabled);\n }\n\n return this;\n },\n\n /**\n * Retrieve the field elements by given name\n *\n * @param {String} field The field name\n * @returns {null|jQuery[]}\n */\n getFieldElements: function(field) {\n if (!this._cacheFields[field]) {\n if (this.options.fields[field] && this.options.fields[field].selector) {\n // Look for the field inside the form first\n var f = this.$form.find(this.options.fields[field].selector);\n // If not found, search in entire document\n this._cacheFields[field] = f.length ? f : $(this.options.fields[field].selector);\n } else {\n this._cacheFields[field] = this.$form.find('[name=\"' + field + '\"]');\n }\n }\n\n return this._cacheFields[field];\n },\n\n /**\n * Get the field value after applying transformer\n *\n * @param {String|jQuery} field The field name or field element\n * @param {String} validatorName The validator name\n * @returns {String}\n */\n getFieldValue: function(field, validatorName) {\n var $field, ns = this._namespace;\n if ('string' === typeof field) {\n $field = this.getFieldElements(field);\n if ($field.length === 0) {\n return null;\n }\n } else {\n $field = field;\n field = $field.attr('data-' + ns + '-field');\n }\n\n if (!field || !this.options.fields[field]) {\n return $field.val();\n }\n\n var transformer = (this.options.fields[field].validators && this.options.fields[field].validators[validatorName]\n ? this.options.fields[field].validators[validatorName].transformer : null)\n || this.options.fields[field].transformer;\n return transformer ? FormValidation.Helper.call(transformer, [$field, validatorName, this]) : $field.val();\n },\n\n /**\n * Get the namespace\n *\n * @returns {String}\n */\n getNamespace: function() {\n return this._namespace;\n },\n\n /**\n * Get the field options\n *\n * @param {String|jQuery} [field] The field name or field element. If it is not set, the method returns the form options\n * @param {String} [validator] The name of validator. It null, the method returns form options\n * @param {String} [option] The option name\n * @return {String|Object}\n */\n getOptions: function(field, validator, option) {\n var ns = this._namespace;\n if (!field) {\n return option ? this.options[option] : this.options;\n }\n if ('object' === typeof field) {\n field = field.attr('data-' + ns + '-field');\n }\n if (!this.options.fields[field]) {\n return null;\n }\n\n var options = this.options.fields[field];\n if (!validator) {\n return option ? options[option] : options;\n }\n if (!options.validators || !options.validators[validator]) {\n return null;\n }\n\n return option ? options.validators[validator][option] : options.validators[validator];\n },\n\n /**\n * Get the validating result of field\n *\n * @param {String|jQuery} field The field name or field element\n * @param {String} validatorName The validator name\n * @returns {String} The status. Can be 'NOT_VALIDATED', 'VALIDATING', 'INVALID', 'VALID' or 'IGNORED'\n */\n getStatus: function(field, validatorName) {\n var ns = this._namespace;\n switch (typeof field) {\n case 'object':\n return field.data(ns + '.result.' + validatorName);\n case 'string':\n /* falls through */\n default:\n return this.getFieldElements(field).eq(0).data(ns + '.result.' + validatorName);\n }\n },\n\n /**\n * Check whether or not a field option is enabled\n *\n * @param {String} field The field name\n * @param {String} option The option name, \"verbose\", \"autoFocus\", for example\n * @returns {Boolean}\n */\n isOptionEnabled: function(field, option) {\n if (this.options.fields[field] && (this.options.fields[field][option] === 'true' || this.options.fields[field][option] === true)) {\n return true;\n }\n if (this.options.fields[field] && (this.options.fields[field][option] === 'false' || this.options.fields[field][option] === false)) {\n return false;\n }\n return this.options[option] === 'true' || this.options[option] === true;\n },\n\n /**\n * Check the form validity\n *\n * @returns {Boolean|null} Returns one of three values\n * - true, if all fields are valid\n * - false, if there is one invalid field\n * - null, if there is at least one field which is not validated yet or being validated\n */\n isValid: function() {\n for (var field in this.options.fields) {\n var isValidField = this.isValidField(field);\n if (isValidField === null) {\n return null;\n }\n if (isValidField === false) {\n return false;\n }\n }\n\n return true;\n },\n\n /**\n * Check if all fields inside a given container are valid.\n * It's useful when working with a wizard-like such as tab, collapse\n *\n * @param {String|jQuery} container The container selector or element\n * @returns {Boolean|null} Returns one of three values\n * - true, if all fields inside the container are valid\n * - false, if there is one invalid field inside the container\n * - null, if the container consists of at least one field which is not validated yet or being validated\n */\n isValidContainer: function(container) {\n var that = this,\n ns = this._namespace,\n fields = [],\n $container = ('string' === typeof container) ? $(container) : container;\n if ($container.length === 0) {\n return true;\n }\n\n $container.find('[data-' + ns + '-field]').each(function() {\n var $field = $(this);\n if (!that._isExcluded($field)) {\n fields.push($field);\n }\n });\n\n var total = fields.length;\n for (var i = 0; i < total; i++) {\n var $f = fields[i],\n field = $f.attr('data-' + ns + '-field'),\n $errors = $f.data(ns + '.messages')\n .find('.' + this.options.err.clazz.split(' ').join('.') + '[data-' + ns + '-validator][data-' + ns + '-for=\"' + field + '\"]');\n\n if (this.options.fields && this.options.fields[field]\n && (this.options.fields[field].enabled === 'false' || this.options.fields[field].enabled === false))\n {\n continue;\n }\n\n if ($errors.filter('[data-' + ns + '-result=\"' + this.STATUS_INVALID + '\"]').length > 0) {\n return false;\n }\n\n // If the field is not validated\n if ($errors.filter('[data-' + ns + '-result=\"' + this.STATUS_NOT_VALIDATED + '\"]').length > 0\n || $errors.filter('[data-' + ns + '-result=\"' + this.STATUS_VALIDATING + '\"]').length > 0)\n {\n return null;\n }\n }\n\n return true;\n },\n\n /**\n * Check if the field is valid or not\n *\n * @param {String|jQuery} field The field name or field element\n * @returns {Boolean|null} Returns one of three values\n * - true, if the field passes all validators\n * - false, if the field doesn't pass any validator\n * - null, if there is at least one validator which isn't validated yet or being validated\n */\n isValidField: function(field) {\n var ns = this._namespace,\n fields = $([]);\n switch (typeof field) {\n case 'object':\n fields = field;\n field = field.attr('data-' + ns + '-field');\n break;\n case 'string':\n fields = this.getFieldElements(field);\n break;\n default:\n break;\n }\n if (fields.length === 0 || !this.options.fields[field]\n || this.options.fields[field].enabled === 'false' || this.options.fields[field].enabled === false)\n {\n return true;\n }\n\n var type = fields.attr('type'),\n total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length,\n $field, validatorName, status;\n for (var i = 0; i < total; i++) {\n $field = fields.eq(i);\n if (this._isExcluded($field)) {\n continue;\n }\n\n for (validatorName in this.options.fields[field].validators) {\n if (this.options.fields[field].validators[validatorName].enabled === false) {\n continue;\n }\n\n status = $field.data(ns + '.result.' + validatorName);\n if (status === this.STATUS_VALIDATING || status === this.STATUS_NOT_VALIDATED) {\n return null;\n } else if (status === this.STATUS_INVALID) {\n return false;\n }\n }\n }\n\n return true;\n },\n\n /**\n * Detach a handler function for a field live change event\n *\n * @param {jQuery[]} $fields The field elements\n * @param {String} namespace The event namespace\n * @returns {FormValidation.Base}\n */\n offLiveChange: function($fields, namespace) {\n if ($fields === null || $fields.length === 0) {\n return this;\n }\n\n var ns = this._namespace,\n trigger = this._getFieldTrigger($fields.eq(0)),\n events = $.map(trigger, function(item) {\n return item + '.' + namespace + '.' + ns;\n }).join(' ');\n\n $fields.off(events);\n return this;\n },\n\n /**\n * Attach a handler function for a field live change event\n *\n * @param {jQuery[]} $fields The field elements\n * @param {String} namespace The event namespace\n * @param {Function} handler The handler function\n * @returns {FormValidation.Base}\n */\n onLiveChange: function($fields, namespace, handler) {\n if ($fields === null || $fields.length === 0) {\n return this;\n }\n\n var ns = this._namespace,\n trigger = this._getFieldTrigger($fields.eq(0)),\n events = $.map(trigger, function(item) {\n return item + '.' + namespace + '.' + ns;\n }).join(' ');\n\n switch (this.options.live) {\n case 'submitted':\n break;\n case 'disabled':\n $fields.off(events);\n break;\n case 'enabled':\n /* falls through */\n default:\n $fields.off(events).on(events, function(e) {\n handler.apply(this, arguments);\n });\n break;\n }\n\n return this;\n },\n\n /**\n * Update the error message\n *\n * @param {String|jQuery} field The field name or field element\n * @param {String} validator The validator name\n * @param {String} message The message\n * @returns {FormValidation.Base}\n */\n updateMessage: function(field, validator, message) {\n var that = this,\n ns = this._namespace,\n $fields = $([]);\n switch (typeof field) {\n case 'object':\n $fields = field;\n field = field.attr('data-' + ns + '-field');\n break;\n case 'string':\n $fields = this.getFieldElements(field);\n break;\n default:\n break;\n }\n\n $fields.each(function() {\n $(this)\n .data(ns + '.messages')\n .find('.' + that.options.err.clazz + '[data-' + ns + '-validator=\"' + validator + '\"][data-' + ns + '-for=\"' + field + '\"]').html(message);\n });\n\n return this;\n },\n\n /**\n * Update all validating results of field\n *\n * @param {String|jQuery} field The field name or field element\n * @param {String} status The status. Can be 'NOT_VALIDATED', 'VALIDATING', 'INVALID', 'VALID' or 'IGNORED'\n * @param {String} [validatorName] The validator name. If null, the method updates validity result for all validators\n * @returns {FormValidation.Base}\n */\n updateStatus: function(field, status, validatorName) {\n var ns = this._namespace,\n fields = $([]);\n switch (typeof field) {\n case 'object':\n fields = field;\n field = field.attr('data-' + ns + '-field');\n break;\n case 'string':\n fields = this.getFieldElements(field);\n break;\n default:\n break;\n }\n\n if (!field || !this.options.fields[field]) {\n return this;\n }\n\n if (status === this.STATUS_NOT_VALIDATED) {\n // Reset the flag\n // To prevent the form from doing submit when a deferred validator returns true while typing\n this._submitIfValid = false;\n }\n\n var that = this,\n type = fields.attr('type'),\n row = this.options.fields[field].row || this.options.row.selector,\n total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length;\n\n for (var i = 0; i < total; i++) {\n var $field = fields.eq(i);\n if (this._isExcluded($field)) {\n continue;\n }\n\n var $parent = $field.closest(row),\n $message = $field.data(ns + '.messages'),\n $allErrors = $message.find('.' + this.options.err.clazz.split(' ').join('.') + '[data-' + ns + '-validator][data-' + ns + '-for=\"' + field + '\"]'),\n $errors = validatorName ? $allErrors.filter('[data-' + ns + '-validator=\"' + validatorName + '\"]') : $allErrors,\n $icon = $field.data(ns + '.icon'),\n // Support backward\n container = ('function' === typeof (this.options.fields[field].container || this.options.fields[field].err || this.options.err.container))\n ? (this.options.fields[field].container || this.options.fields[field].err || this.options.err.container).call(this, $field, this)\n : (this.options.fields[field].container || this.options.fields[field].err || this.options.err.container),\n isValidField = null,\n isValidating,\n isNotValidated;\n\n // Update status\n if (validatorName) {\n $field.data(ns + '.result.' + validatorName, status);\n } else {\n for (var v in this.options.fields[field].validators) {\n $field.data(ns + '.result.' + v, status);\n }\n }\n\n // Show/hide error elements and feedback icons\n $errors.attr('data-' + ns + '-result', status);\n\n switch (status) {\n case this.STATUS_VALIDATING:\n isValidField = null;\n this.disableSubmitButtons(true);\n $field.removeClass(this.options.control.valid).removeClass(this.options.control.invalid);\n $parent.removeClass(this.options.row.valid).removeClass(this.options.row.invalid);\n if ($icon) {\n $icon.removeClass(this.options.icon.valid).removeClass(this.options.icon.invalid).addClass(this.options.icon.validating).show();\n }\n break;\n\n case this.STATUS_INVALID:\n isValidField = false;\n this.disableSubmitButtons(true);\n $field.removeClass(this.options.control.valid).addClass(this.options.control.invalid);\n $parent.removeClass(this.options.row.valid).addClass(this.options.row.invalid);\n if ($icon) {\n $icon.removeClass(this.options.icon.valid).removeClass(this.options.icon.validating).addClass(this.options.icon.invalid).show();\n }\n break;\n\n case this.STATUS_IGNORED: // Treat ignored fields like they are valid with some specialties\n case this.STATUS_VALID:\n isValidating = ($allErrors.filter('[data-' + ns + '-result=\"' + this.STATUS_VALIDATING +'\"]').length > 0);\n isNotValidated = ($allErrors.filter('[data-' + ns + '-result=\"' + this.STATUS_NOT_VALIDATED +'\"]').length > 0);\n\n var numIgnored = $allErrors.filter('[data-' + ns + '-result=\"' + this.STATUS_IGNORED +'\"]').length;\n\n // If the field is valid (passes all validators)\n isValidField = (isValidating || isNotValidated) // There are some validators that have not done\n ? null\n // All validators are completed\n : ($allErrors.filter('[data-' + ns + '-result=\"' + this.STATUS_VALID +'\"]').length + numIgnored === $allErrors.length);\n\n $field.removeClass(this.options.control.valid).removeClass(this.options.control.invalid);\n\n if (isValidField === true) {\n this.disableSubmitButtons(this.isValid() === false);\n if (status === this.STATUS_VALID) {\n $field.addClass(this.options.control.valid);\n }\n } else if (isValidField === false) {\n this.disableSubmitButtons(true);\n if (status === this.STATUS_VALID) {\n $field.addClass(this.options.control.invalid);\n }\n }\n\n if ($icon) {\n $icon.removeClass(this.options.icon.invalid).removeClass(this.options.icon.validating).removeClass(this.options.icon.valid);\n if (status === this.STATUS_VALID || numIgnored !== $allErrors.length) {\n $icon.addClass(isValidating\n ? this.options.icon.validating\n : (isValidField === null ? '' : (isValidField ? this.options.icon.valid : this.options.icon.invalid)))\n .show();\n }\n }\n\n var isValidContainer = this.isValidContainer($parent);\n if (isValidContainer !== null) {\n $parent.removeClass(this.options.row.valid).removeClass(this.options.row.invalid);\n if (status === this.STATUS_VALID || numIgnored !== $allErrors.length) {\n $parent.addClass(isValidContainer ? this.options.row.valid : this.options.row.invalid);\n }\n }\n break;\n\n case this.STATUS_NOT_VALIDATED:\n /* falls through */\n default:\n isValidField = null;\n this.disableSubmitButtons(false);\n $field.removeClass(this.options.control.valid).removeClass(this.options.control.invalid);\n $parent.removeClass(this.options.row.valid).removeClass(this.options.row.invalid);\n if ($icon) {\n $icon.removeClass(this.options.icon.valid).removeClass(this.options.icon.invalid).removeClass(this.options.icon.validating).hide();\n }\n break;\n }\n\n if ($icon && ('tooltip' === container || 'popover' === container)) {\n (isValidField === false)\n // Only show the first error message\n ? this._createTooltip($field, $allErrors.filter('[data-' + ns + '-result=\"' + that.STATUS_INVALID + '\"]').eq(0).html(), container)\n : this._destroyTooltip($field, container);\n } else {\n (status === this.STATUS_INVALID) ? $errors.show() : $errors.hide();\n }\n\n // Trigger an event\n $field.trigger($.Event(this.options.events.fieldStatus), {\n bv: this, // Support backward\n fv: this,\n field: field,\n element: $field,\n status: status\n });\n this._onFieldValidated($field, validatorName);\n }\n\n return this;\n },\n\n /**\n * Validate the form\n *\n * @returns {FormValidation.Base}\n */\n validate: function() {\n if ($.isEmptyObject(this.options.fields)) {\n this._submit();\n return this;\n }\n this.$form.trigger($.Event(this.options.events.formPreValidate));\n\n this.disableSubmitButtons(true);\n this._submitIfValid = false;\n for (var field in this.options.fields) {\n this.validateField(field);\n }\n\n this._submit();\n this._submitIfValid = true;\n\n return this;\n },\n\n /**\n * Validate given field\n *\n * @param {String|jQuery} field The field name or field element\n * @returns {FormValidation.Base}\n */\n validateField: function(field) {\n var ns = this._namespace,\n fields = $([]);\n switch (typeof field) {\n case 'object':\n fields = field;\n field = field.attr('data-' + ns + '-field');\n break;\n case 'string':\n fields = this.getFieldElements(field);\n break;\n default:\n break;\n }\n\n if (fields.length === 0 || !this.options.fields[field]\n || this.options.fields[field].enabled === 'false' || this.options.fields[field].enabled === false)\n {\n return this;\n }\n\n var that = this,\n type = fields.attr('type'),\n total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length,\n updateAll = ('radio' === type || 'checkbox' === type),\n validators = this.options.fields[field].validators,\n verbose = this.isOptionEnabled(field, 'verbose'),\n validatorName,\n alias,\n validateResult;\n\n for (var i = 0; i < total; i++) {\n var $field = fields.eq(i);\n if (this._isExcluded($field)) {\n continue;\n }\n\n var stop = false;\n for (validatorName in validators) {\n if ($field.data(ns + '.dfs.' + validatorName)) {\n $field.data(ns + '.dfs.' + validatorName).reject();\n }\n if (stop) {\n break;\n }\n\n // Don't validate field if it is already done\n var result = $field.data(ns + '.result.' + validatorName);\n if (result === this.STATUS_VALID || result === this.STATUS_INVALID) {\n this._onFieldValidated($field, validatorName);\n continue;\n } else if (validators[validatorName].enabled === false) {\n // Changed in v0.6.2:\n // When the field validator is disabled, it should be treated as STATUS_IGNORED instead of STATUS_VALID\n // By doing that, the field with only disabled and ignored validators will not have success/error class\n this.updateStatus(updateAll ? field : $field, this.STATUS_IGNORED, validatorName);\n continue;\n }\n\n $field.data(ns + '.result.' + validatorName, this.STATUS_VALIDATING);\n\n // Check whether or not the validator is just an alias of another\n alias = validators[validatorName].alias || validatorName;\n validateResult = FormValidation.Validator[alias].validate(this, $field, validators[validatorName], validatorName);\n\n // validateResult can be a $.Deferred object ...\n if ('object' === typeof validateResult && validateResult.resolve) {\n this.updateStatus(updateAll ? field : $field, this.STATUS_VALIDATING, validatorName);\n $field.data(ns + '.dfs.' + validatorName, validateResult);\n\n validateResult.done(function($f, v, response) {\n // v is validator name\n $f.removeData(ns + '.dfs.' + v).data(ns + '.response.' + v, response);\n if (response.message) {\n that.updateMessage($f, v, response.message);\n }\n\n that.updateStatus(updateAll ? $f.attr('data-' + ns + '-field') : $f,\n response.valid === true ? that.STATUS_VALID : (response.valid === false ? that.STATUS_INVALID : that.STATUS_IGNORED),\n v);\n\n if (response.valid && that._submitIfValid === true) {\n // If a remote validator returns true and the form is ready to submit, then do it\n that._submit();\n } else if (response.valid === false && !verbose) {\n stop = true;\n }\n });\n }\n // ... or object { valid: true/false/null, message: 'dynamic message', otherKey: value, ... }\n else if ('object' === typeof validateResult && validateResult.valid !== undefined) {\n $field.data(ns + '.response.' + validatorName, validateResult);\n if (validateResult.message) {\n this.updateMessage(updateAll ? field : $field, validatorName, validateResult.message);\n }\n this.updateStatus(updateAll ? field : $field,\n validateResult.valid === true ? this.STATUS_VALID : (validateResult.valid === false ? this.STATUS_INVALID : this.STATUS_IGNORED),\n validatorName);\n if (validateResult.valid === false && !verbose) {\n break;\n }\n }\n // ... or a boolean value\n else if ('boolean' === typeof validateResult) {\n $field.data(ns + '.response.' + validatorName, validateResult);\n this.updateStatus(updateAll ? field : $field, validateResult ? this.STATUS_VALID : this.STATUS_INVALID, validatorName);\n if (!validateResult && !verbose) {\n break;\n }\n }\n // ... or null\n // to indicate that the field should be ignored for current validator\n else if (null === validateResult) {\n $field.data(ns + '.response.' + validatorName, validateResult);\n this.updateStatus(updateAll ? field : $field, this.STATUS_IGNORED, validatorName);\n }\n }\n }\n\n return this;\n },\n\n // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n // Useful APIs which aren't used internally\n // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n /**\n * Add a new field\n *\n * @param {String|jQuery} field The field name or field element\n * @param {Object} [options] The validator rules\n * @returns {FormValidation.Base}\n */\n addField: function(field, options) {\n var ns = this._namespace,\n fields = $([]);\n switch (typeof field) {\n case 'object':\n fields = field;\n field = field.attr('data-' + ns + '-field') || field.attr('name');\n break;\n case 'string':\n delete this._cacheFields[field];\n fields = this.getFieldElements(field);\n break;\n default:\n break;\n }\n\n fields.attr('data-' + ns + '-field', field);\n\n var type = fields.attr('type'),\n total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length;\n\n for (var i = 0; i < total; i++) {\n var $field = fields.eq(i);\n\n // Try to parse the options from HTML attributes\n var opts = this._parseOptions($field);\n opts = (opts === null) ? options : $.extend(true, opts, options);\n\n this.options.fields[field] = $.extend(true, this.options.fields[field], opts);\n\n // Update the cache\n this._cacheFields[field] = this._cacheFields[field] ? this._cacheFields[field].add($field) : $field;\n\n // Init the element\n this._initField(('checkbox' === type || 'radio' === type) ? field : $field);\n }\n\n this.disableSubmitButtons(false);\n // Trigger an event\n this.$form.trigger($.Event(this.options.events.fieldAdded), {\n field: field,\n element: fields,\n options: this.options.fields[field]\n });\n\n return this;\n },\n\n /**\n * Destroy the plugin\n * It will remove all error messages, feedback icons and turn off the events\n */\n destroy: function() {\n var ns = this._namespace, i, field, fields, $field, validator, $icon, row, alias;\n\n // Destroy the validators first\n for (field in this.options.fields) {\n fields = this.getFieldElements(field);\n for (i = 0; i < fields.length; i++) {\n $field = fields.eq(i);\n for (validator in this.options.fields[field].validators) {\n if ($field.data(ns + '.dfs.' + validator)) {\n $field.data(ns + '.dfs.' + validator).reject();\n }\n $field.removeData(ns + '.result.' + validator)\n .removeData(ns + '.response.' + validator)\n .removeData(ns + '.dfs.' + validator);\n\n // Destroy the validator\n alias = this.options.fields[field].validators[validator].alias || validator;\n if ('function' === typeof FormValidation.Validator[alias].destroy) {\n FormValidation.Validator[alias].destroy(this, $field, this.options.fields[field].validators[validator], validator);\n }\n }\n }\n }\n\n // Remove messages and icons\n for (field in this.options.fields) {\n fields = this.getFieldElements(field);\n row = this.options.fields[field].row || this.options.row.selector;\n for (i = 0; i < fields.length; i++) {\n $field = fields.eq(i);\n $field\n // Remove all error messages\n .data(ns + '.messages')\n .find('.' + this.options.err.clazz.split(' ').join('.') + '[data-' + ns + '-validator][data-' + ns + '-for=\"' + field + '\"]').remove().end()\n .end()\n .removeData(ns + '.messages')\n // Remove feedback classes\n .closest(row)\n .removeClass(this.options.row.valid)\n .removeClass(this.options.row.invalid)\n .removeClass(this.options.row.feedback)\n .end()\n // Turn off events\n .off('.' + ns)\n .removeAttr('data-' + ns + '-field');\n\n // Remove feedback icons, tooltip/popover container\n // Support backward\n var container = ('function' === typeof (this.options.fields[field].container || this.options.fields[field].err || this.options.err.container))\n ? (this.options.fields[field].container || this.options.fields[field].err || this.options.err.container).call(this, $field, this)\n : (this.options.fields[field].container || this.options.fields[field].err || this.options.err.container);\n if ('tooltip' === container || 'popover' === container) {\n this._destroyTooltip($field, container);\n }\n\n $icon = $field.data(ns + '.icon');\n if ($icon) {\n $icon.remove();\n }\n $field.removeData(ns + '.icon')\n // It's safe to remove trigger data here, because it might be used when destroying the validator\n .removeData(ns + '.trigger');\n }\n }\n\n // Destroy the add-ons\n for (var addOn in this.options.addOns) {\n if ('function' === typeof FormValidation.AddOn[addOn].destroy) {\n FormValidation.AddOn[addOn].destroy(this, this.options.addOns[addOn]);\n }\n }\n\n this.disableSubmitButtons(false); // Enable submit buttons\n this.$hiddenButton.remove(); // Remove the hidden button\n\n this.$form\n .removeClass(this.options.elementClass)\n .off('.' + ns)\n .removeData('bootstrapValidator') // Support backward\n .removeData('formValidation')\n // Remove generated hidden elements\n .find('[data-' + ns + '-submit-hidden]').remove().end()\n .find('[type=\"submit\"]')\n .off('click.' + ns);\n },\n\n /**\n * Enable/Disable all validators to given field\n *\n * @param {String} field The field name\n * @param {Boolean} enabled Enable/Disable field validators\n * @param {String} [validatorName] The validator name. If null, all validators will be enabled/disabled\n * @returns {FormValidation.Base}\n */\n enableFieldValidators: function(field, enabled, validatorName) {\n var validators = this.options.fields[field].validators;\n\n // Enable/disable particular validator\n if (validatorName\n && validators\n && validators[validatorName] && validators[validatorName].enabled !== enabled)\n {\n this.options.fields[field].validators[validatorName].enabled = enabled;\n this.updateStatus(field, this.STATUS_NOT_VALIDATED, validatorName);\n }\n // Enable/disable all validators\n else if (!validatorName && this.options.fields[field].enabled !== enabled) {\n this.options.fields[field].enabled = enabled;\n for (var v in validators) {\n this.enableFieldValidators(field, enabled, v);\n }\n }\n\n return this;\n },\n\n /**\n * Some validators have option which its value is dynamic.\n * For example, the zipCode validator has the country option which might be changed dynamically by a select element.\n *\n * @param {jQuery|String} field The field name or element\n * @param {String|Function} option The option which can be determined by:\n * - a string\n * - name of field which defines the value\n * - name of function which returns the value\n * - a function returns the value\n *\n * The callback function has the format of\n * callback: function(value, validator, $field) {\n * // value is the value of field\n * // validator is the BootstrapValidator instance\n * // $field is the field element\n * }\n *\n * @returns {String}\n */\n getDynamicOption: function(field, option) {\n var $field = ('string' === typeof field) ? this.getFieldElements(field) : field,\n value = $field.val();\n\n // Option can be determined by\n // ... a function\n if ('function' === typeof option) {\n return FormValidation.Helper.call(option, [value, this, $field]);\n }\n // ... value of other field\n else if ('string' === typeof option) {\n var $f = this.getFieldElements(option);\n if ($f.length) {\n return $f.val();\n }\n // ... return value of callback\n else {\n return FormValidation.Helper.call(option, [value, this, $field]) || option;\n }\n }\n\n return null;\n },\n\n /**\n * Get the form element\n *\n * @returns {jQuery}\n */\n getForm: function() {\n return this.$form;\n },\n\n /**\n * Get the list of invalid fields\n *\n * @returns {jQuery[]}\n */\n getInvalidFields: function() {\n return this.$invalidFields;\n },\n\n /**\n * Get the current locale\n *\n * @return {String}\n */\n getLocale: function() {\n return this.options.locale;\n },\n\n /**\n * Get the error messages\n *\n * @param {String|jQuery} [field] The field name or field element\n * If the field is not defined, the method returns all error messages of all fields\n * @param {String} [validator] The name of validator\n * If the validator is not defined, the method returns error messages of all validators\n * @returns {String[]}\n */\n getMessages: function(field, validator) {\n var that = this,\n ns = this._namespace,\n messages = [],\n $fields = $([]);\n\n switch (true) {\n case (field && 'object' === typeof field):\n $fields = field;\n break;\n case (field && 'string' === typeof field):\n var f = this.getFieldElements(field);\n if (f.length > 0) {\n var type = f.attr('type');\n $fields = ('radio' === type || 'checkbox' === type) ? f.eq(0) : f;\n }\n break;\n default:\n $fields = this.$invalidFields;\n break;\n }\n\n var filter = validator ? '[data-' + ns + '-validator=\"' + validator + '\"]' : '';\n $fields.each(function() {\n messages = messages.concat(\n $(this)\n .data(ns + '.messages')\n .find('.' + that.options.err.clazz + '[data-' + ns + '-for=\"' + $(this).attr('data-' + ns + '-field') + '\"][data-' + ns + '-result=\"' + that.STATUS_INVALID + '\"]' + filter)\n .map(function() {\n var v = $(this).attr('data-' + ns + '-validator'),\n f = $(this).attr('data-' + ns + '-for');\n return (that.options.fields[f].validators[v].enabled === false) ? '' : $(this).html();\n })\n .get()\n );\n });\n\n return messages;\n },\n\n /**\n * Returns the clicked submit button\n *\n * @returns {jQuery}\n */\n getSubmitButton: function() {\n return this.$submitButton;\n },\n\n /**\n * Remove a given field\n *\n * @param {String|jQuery} field The field name or field element\n * @returns {FormValidation.Base}\n */\n removeField: function(field) {\n var ns = this._namespace,\n fields = $([]);\n switch (typeof field) {\n case 'object':\n fields = field;\n field = field.attr('data-' + ns + '-field') || field.attr('name');\n fields.attr('data-' + ns + '-field', field);\n break;\n case 'string':\n fields = this.getFieldElements(field);\n break;\n default:\n break;\n }\n\n if (fields.length === 0) {\n return this;\n }\n\n var type = fields.attr('type'),\n total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length;\n\n for (var i = 0; i < total; i++) {\n var $field = fields.eq(i);\n\n // Remove from the list of invalid fields\n this.$invalidFields = this.$invalidFields.not($field);\n\n // Update the cache\n this._cacheFields[field] = this._cacheFields[field].not($field);\n }\n\n if (!this._cacheFields[field] || this._cacheFields[field].length === 0) {\n delete this.options.fields[field];\n }\n if ('checkbox' === type || 'radio' === type) {\n this._initField(field);\n }\n\n this.disableSubmitButtons(false);\n // Trigger an event\n this.$form.trigger($.Event(this.options.events.fieldRemoved), {\n field: field,\n element: fields\n });\n\n return this;\n },\n\n /**\n * Reset given field\n *\n * @param {String|jQuery} field The field name or field element\n * @param {Boolean} [resetValue] If true, the method resets field value to empty or remove checked/selected attribute (for radio/checkbox)\n * @returns {FormValidation.Base}\n */\n resetField: function(field, resetValue) {\n var ns = this._namespace,\n $fields = $([]);\n switch (typeof field) {\n case 'object':\n $fields = field;\n field = field.attr('data-' + ns + '-field');\n break;\n case 'string':\n $fields = this.getFieldElements(field);\n break;\n default:\n break;\n }\n\n var total = $fields.length;\n if (this.options.fields[field]) {\n for (var i = 0; i < total; i++) {\n for (var validator in this.options.fields[field].validators) {\n $fields.eq(i).removeData(ns + '.dfs.' + validator);\n }\n }\n }\n\n if (resetValue) {\n var type = $fields.attr('type');\n ('radio' === type || 'checkbox' === type) ? $fields.prop('checked', false).removeAttr('selected') : $fields.val('');\n }\n\n // Mark field as not validated yet\n this.updateStatus(field, this.STATUS_NOT_VALIDATED);\n\n return this;\n },\n\n /**\n * Reset the form\n *\n * @param {Boolean} [resetValue] If true, the method resets field value to empty or remove checked/selected attribute (for radio/checkbox)\n * @returns {FormValidation.Base}\n */\n resetForm: function(resetValue) {\n for (var field in this.options.fields) {\n this.resetField(field, resetValue);\n }\n\n this.$invalidFields = $([]);\n this.$submitButton = null;\n\n // Enable submit buttons\n this.disableSubmitButtons(false);\n\n return this;\n },\n\n /**\n * Revalidate given field\n * It's used when you need to revalidate the field which its value is updated by other plugin\n *\n * @param {String|jQuery} field The field name of field element\n * @returns {FormValidation.Base}\n */\n revalidateField: function(field) {\n this.updateStatus(field, this.STATUS_NOT_VALIDATED)\n .validateField(field);\n\n return this;\n },\n\n /**\n * Set the locale\n *\n * @param {String} locale The locale in format of countrycode_LANGUAGECODE\n * @returns {FormValidation.Base}\n */\n setLocale: function(locale) {\n this.options.locale = locale;\n this.$form.trigger($.Event(this.options.events.localeChanged), {\n locale: locale,\n bv: this, // Support backward\n fv: this\n });\n\n return this;\n },\n\n /**\n * Update the option of a specific validator\n *\n * @param {String|jQuery} field The field name or field element\n * @param {String} validator The validator name\n * @param {String} option The option name\n * @param {String} value The value to set\n * @returns {FormValidation.Base}\n */\n updateOption: function(field, validator, option, value) {\n var ns = this._namespace;\n if ('object' === typeof field) {\n field = field.attr('data-' + ns + '-field');\n }\n if (this.options.fields[field] && this.options.fields[field].validators[validator]) {\n this.options.fields[field].validators[validator][option] = value;\n this.updateStatus(field, this.STATUS_NOT_VALIDATED, validator);\n }\n\n return this;\n },\n\n /**\n * Validate given container\n * It can be used with isValidContainer() when you want to work with wizard form\n *\n * @param {String|jQuery} container The container selector or element\n * @returns {FormValidation.Base}\n */\n validateContainer: function(container) {\n var that = this,\n ns = this._namespace,\n fields = [],\n $container = ('string' === typeof container) ? $(container) : container;\n if ($container.length === 0) {\n return this;\n }\n\n $container.find('[data-' + ns + '-field]').each(function() {\n var $field = $(this);\n if (!that._isExcluded($field)) {\n fields.push($field);\n }\n });\n\n var total = fields.length;\n for (var i = 0; i < total; i++) {\n this.validateField(fields[i]);\n }\n\n return this;\n }\n };\n\n // Plugin definition\n $.fn.formValidation = function(option) {\n var params = arguments;\n return this.each(function() {\n var $this = $(this),\n data = $this.data('formValidation'),\n options = 'object' === typeof option && option;\n if (!data) {\n var framework = (options.framework || $this.attr('data-fv-framework') || 'bootstrap').toLowerCase(),\n clazz = framework.substr(0, 1).toUpperCase() + framework.substr(1);\n\n if (typeof FormValidation.Framework[clazz] === 'undefined') {\n throw new Error('The class FormValidation.Framework.' + clazz + ' is not implemented');\n }\n\n data = new FormValidation.Framework[clazz](this, options);\n $this.addClass('fv-form-' + framework)\n .data('formValidation', data);\n }\n\n // Allow to call plugin method\n if ('string' === typeof option) {\n data[option].apply(data, Array.prototype.slice.call(params, 1));\n }\n });\n };\n\n $.fn.formValidation.Constructor = FormValidation.Base;\n\n // Default message\n $.fn.formValidation.DEFAULT_MESSAGE = 'This value is not valid';\n\n // The default options sorted in alphabetical order\n $.fn.formValidation.DEFAULT_OPTIONS = {\n // The first invalid field will be focused automatically\n autoFocus: true,\n\n // Support declarative usage (setting options via HTML 5 attributes)\n // Setting to false can improve the performance\n declarative: true,\n\n // The form CSS class\n elementClass: 'fv-form',\n\n // Use custom event name to avoid window.onerror being invoked by jQuery\n // See #630\n events: {\n // Support backward\n formInit: 'init.form.fv',\n formPreValidate: 'prevalidate.form.fv',\n formError: 'err.form.fv',\n formSuccess: 'success.form.fv',\n fieldAdded: 'added.field.fv',\n fieldRemoved: 'removed.field.fv',\n fieldInit: 'init.field.fv',\n fieldError: 'err.field.fv',\n fieldSuccess: 'success.field.fv',\n fieldStatus: 'status.field.fv',\n localeChanged: 'changed.locale.fv',\n validatorError: 'err.validator.fv',\n validatorSuccess: 'success.validator.fv',\n validatorIgnored: 'ignored.validator.fv'\n },\n\n // Indicate fields which won't be validated\n // By default, the plugin will not validate the following kind of fields:\n // - disabled\n // - hidden\n // - invisible\n //\n // The setting consists of jQuery filters. Accept 3 formats:\n // - A string. Use a comma to separate filter\n // - An array. Each element is a filter\n // - An array. Each element can be a callback function\n // function($field, validator) {\n // $field is jQuery object representing the field element\n // validator is the BootstrapValidator instance\n // return true or false;\n // }\n //\n // The 3 following settings are equivalent:\n //\n // 1) ':disabled, :hidden, :not(:visible)'\n // 2) [':disabled', ':hidden', ':not(:visible)']\n // 3) [':disabled', ':hidden', function($field) {\n // return !$field.is(':visible');\n // }]\n excluded: [':disabled', ':hidden', ':not(:visible)'],\n\n // Map the field name with validator rules\n fields: null,\n\n // Live validating option\n // Can be one of 3 values:\n // - enabled: The plugin validates fields as soon as they are changed\n // - disabled: Disable the live validating. The error messages are only shown after the form is submitted\n // - submitted: The live validating is enabled after the form is submitted\n live: 'enabled',\n\n // Locale in the format of languagecode_COUNTRYCODE\n locale: 'en_US',\n\n // Default invalid message\n message: null,\n\n // The field will not be live validated if its length is less than this number of characters\n threshold: null,\n\n // Whether to be verbose when validating a field or not.\n // Possible values:\n // - true: when a field has multiple validators, all of them will be checked, and respectively - if errors occur in\n // multiple validators, all of them will be displayed to the user\n // - false: when a field has multiple validators, validation for this field will be terminated upon the first encountered error.\n // Thus, only the very first error message related to this field will be displayed to the user\n verbose: true,\n\n // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n // These options mostly are overridden by specific framework\n // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n button: {\n // The submit buttons selector\n // These buttons will be disabled to prevent the valid form from multiple submissions\n // Don't perform validation when clicking on the submit button/input which have formnovalidate attribute\n selector: '[type=\"submit\"]:not([formnovalidate])',\n\n // The disabled class\n disabled: ''\n },\n\n control: {\n // The CSS class for valid control\n valid: '',\n\n // The CSS class for invalid control\n invalid: ''\n },\n\n err: {\n // The CSS class of each message element\n clazz: '',\n\n // The error messages container. It can be:\n // - 'tooltip' if you want to use Bootstrap tooltip to show error messages\n // - 'popover' if you want to use Bootstrap popover to show error messages\n // - a CSS selector indicating the container\n // In the first two cases, since the tooltip/popover should be small enough, the plugin only shows only one error message\n // You also can define the message container for particular field\n container: null,\n\n // Used to determine where the messages are placed\n parent: null\n },\n\n // Shows ok/error/loading icons based on the field validity.\n icon: {\n valid: null,\n invalid: null,\n validating: null,\n feedback: ''\n },\n\n row: {\n // The CSS selector for indicating the element consists of the field\n // You should adjust this option if your form group consists of many fields which not all of them need to be validated\n selector: null,\n valid: '',\n invalid: '',\n feedback: ''\n }\n };\n}(jQuery));\n;(function($) {\n // Helper methods, which can be used in validator class\n FormValidation.Helper = {\n /**\n * Execute a callback function\n *\n * @param {String|Function} functionName Can be\n * - name of global function\n * - name of namespace function (such as A.B.C)\n * - a function\n * @param {Array} args The callback arguments\n */\n call: function(functionName, args) {\n if ('function' === typeof functionName) {\n return functionName.apply(this, args);\n } else if ('string' === typeof functionName) {\n if ('()' === functionName.substring(functionName.length - 2)) {\n functionName = functionName.substring(0, functionName.length - 2);\n }\n var ns = functionName.split('.'),\n func = ns.pop(),\n context = window;\n for (var i = 0; i < ns.length; i++) {\n context = context[ns[i]];\n }\n\n return (typeof context[func] === 'undefined') ? null : context[func].apply(this, args);\n }\n },\n\n /**\n * Validate a date\n *\n * @param {Number} year The full year in 4 digits\n * @param {Number} month The month number\n * @param {Number} day The day number\n * @param {Boolean} [notInFuture] If true, the date must not be in the future\n * @returns {Boolean}\n */\n date: function(year, month, day, notInFuture) {\n if (isNaN(year) || isNaN(month) || isNaN(day)) {\n return false;\n }\n if (day.length > 2 || month.length > 2 || year.length > 4) {\n return false;\n }\n\n day = parseInt(day, 10);\n month = parseInt(month, 10);\n year = parseInt(year, 10);\n\n if (year < 1000 || year > 9999 || month <= 0 || month > 12) {\n return false;\n }\n var numDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n // Update the number of days in Feb of leap year\n if (year % 400 === 0 || (year % 100 !== 0 && year % 4 === 0)) {\n numDays[1] = 29;\n }\n\n // Check the day\n if (day <= 0 || day > numDays[month - 1]) {\n return false;\n }\n\n if (notInFuture === true) {\n var currentDate = new Date(),\n currentYear = currentDate.getFullYear(),\n currentMonth = currentDate.getMonth(),\n currentDay = currentDate.getDate();\n return (year < currentYear\n || (year === currentYear && month - 1 < currentMonth)\n || (year === currentYear && month - 1 === currentMonth && day < currentDay));\n }\n\n return true;\n },\n\n /**\n * Format a string\n * It's used to format the error message\n * format('The field must between %s and %s', [10, 20]) = 'The field must between 10 and 20'\n *\n * @param {String} message\n * @param {Array} parameters\n * @returns {String}\n */\n format: function(message, parameters) {\n if (!$.isArray(parameters)) {\n parameters = [parameters];\n }\n\n for (var i in parameters) {\n message = message.replace('%s', parameters[i]);\n }\n\n return message;\n },\n\n /**\n * Implement Luhn validation algorithm\n * Credit to https://gist.github.com/ShirtlessKirk/2134376\n *\n * @see http://en.wikipedia.org/wiki/Luhn\n * @param {String} value\n * @returns {Boolean}\n */\n luhn: function(value) {\n var length = value.length,\n mul = 0,\n prodArr = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]],\n sum = 0;\n\n while (length--) {\n sum += prodArr[mul][parseInt(value.charAt(length), 10)];\n mul ^= 1;\n }\n\n return (sum % 10 === 0 && sum > 0);\n },\n\n /**\n * Implement modulus 11, 10 (ISO 7064) algorithm\n *\n * @param {String} value\n * @returns {Boolean}\n */\n mod11And10: function(value) {\n var check = 5,\n length = value.length;\n for (var i = 0; i < length; i++) {\n check = (((check || 10) * 2) % 11 + parseInt(value.charAt(i), 10)) % 10;\n }\n return (check === 1);\n },\n\n /**\n * Implements Mod 37, 36 (ISO 7064) algorithm\n * Usages:\n * mod37And36('A12425GABC1234002M')\n * mod37And36('002006673085', '0123456789')\n *\n * @param {String} value\n * @param {String} [alphabet]\n * @returns {Boolean}\n */\n mod37And36: function(value, alphabet) {\n alphabet = alphabet || '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n var modulus = alphabet.length,\n length = value.length,\n check = Math.floor(modulus / 2);\n for (var i = 0; i < length; i++) {\n check = (((check || modulus) * 2) % (modulus + 1) + alphabet.indexOf(value.charAt(i))) % modulus;\n }\n return (check === 1);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n base64: {\n 'default': 'Please enter a valid base 64 encoded'\n }\n }\n });\n\n FormValidation.Validator.base64 = {\n /**\n * Return true if the input value is a base 64 encoded string.\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(value);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n between: {\n 'default': 'Please enter a value between %s and %s',\n notInclusive: 'Please enter a value between %s and %s strictly'\n }\n }\n });\n\n FormValidation.Validator.between = {\n html5Attributes: {\n message: 'message',\n min: 'min',\n max: 'max',\n inclusive: 'inclusive'\n },\n\n enableByHtml5: function($field) {\n if ('range' === $field.attr('type')) {\n return {\n min: $field.attr('min'),\n max: $field.attr('max')\n };\n }\n\n return false;\n },\n\n /**\n * Return true if the input value is between (strictly or not) two given numbers\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - min\n * - max\n *\n * The min, max keys define the number which the field value compares to. min, max can be\n * - A number\n * - Name of field which its value defines the number\n * - Name of callback function that returns the number\n * - A callback function that returns the number\n *\n * - inclusive [optional]: Can be true or false. Default is true\n * - message: The invalid message\n * @returns {Boolean|Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n\t\t\tvalue = this._format(value);\n\n var locale = validator.getLocale(),\n min = $.isNumeric(options.min) ? options.min : validator.getDynamicOption($field, options.min),\n max = $.isNumeric(options.max) ? options.max : validator.getDynamicOption($field, options.max),\n minValue = this._format(min),\n maxValue = this._format(max);\n\n\t\t\treturn (options.inclusive === true || options.inclusive === undefined)\n ? {\n valid: $.isNumeric(value) && parseFloat(value) >= minValue && parseFloat(value) <= maxValue,\n message: FormValidation.Helper.format(options.message || FormValidation.I18n[locale].between['default'], [min, max])\n }\n : {\n valid: $.isNumeric(value) && parseFloat(value) > minValue && parseFloat(value) < maxValue,\n message: FormValidation.Helper.format(options.message || FormValidation.I18n[locale].between.notInclusive, [min, max])\n };\n },\n\n _format: function(value) {\n return (value + '').replace(',', '.');\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n bic: {\n 'default': 'Please enter a valid BIC number'\n }\n }\n });\n\n FormValidation.Validator.bic = {\n /**\n * Validate an Business Identifier Code (BIC), also known as ISO 9362, SWIFT-BIC, SWIFT ID or SWIFT code\n *\n * For more information see http://en.wikipedia.org/wiki/ISO_9362\n *\n * @todo The 5 and 6 characters are an ISO 3166-1 country code, this could also be validated\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * @returns {Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n return /^[a-zA-Z]{6}[a-zA-Z0-9]{2}([a-zA-Z0-9]{3})?$/.test(value);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.Validator.blank = {\n /**\n * Placeholder validator that can be used to display a custom validation message\n * returned from the server\n * Example:\n *\n * (1) a \"blank\" validator is applied to an input field.\n * (2) data is entered via the UI that is unable to be validated client-side.\n * (3) server returns a 400 with JSON data that contains the field that failed\n * validation and an associated message.\n * (4) ajax 400 call handler does the following:\n *\n * fv.updateMessage(field, 'blank', errorMessage);\n * fv.updateStatus(field, 'INVALID', 'blank');\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n return true;\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n callback: {\n 'default': 'Please enter a valid value'\n }\n }\n });\n\n FormValidation.Validator.callback = {\n html5Attributes: {\n message: 'message',\n callback: 'callback'\n },\n\n /**\n * Return result from the callback method\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - callback: The callback method that passes parameters:\n * callback: function(fieldValue, validator, $field) {\n * // fieldValue is the value of field\n * // validator is instance of FormValidation.Base\n * // $field is the field element\n * }\n * - message: The invalid message\n * @returns {Deferred}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName),\n dfd = new $.Deferred(),\n result = { valid: true };\n\n if (options.callback) {\n var response = FormValidation.Helper.call(options.callback, [value, validator, $field]);\n result = ('boolean' === typeof response || null === response) ? { valid: response } : response;\n }\n\n dfd.resolve($field, validatorName, result);\n return dfd;\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n choice: {\n 'default': 'Please enter a valid value',\n less: 'Please choose %s options at minimum',\n more: 'Please choose %s options at maximum',\n between: 'Please choose %s - %s options'\n }\n }\n });\n\n FormValidation.Validator.choice = {\n html5Attributes: {\n message: 'message',\n min: 'min',\n max: 'max'\n },\n\n /**\n * Check if the number of checked boxes are less or more than a given number\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consists of following keys:\n * - min\n * - max\n *\n * At least one of two keys is required\n * The min, max keys define the number which the field value compares to. min, max can be\n * - A number\n * - Name of field which its value defines the number\n * - Name of callback function that returns the number\n * - A callback function that returns the number\n *\n * - message: The invalid message\n * @returns {Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var locale = validator.getLocale(),\n ns = validator.getNamespace(),\n numChoices = $field.is('select')\n ? validator.getFieldElements($field.attr('data-' + ns + '-field')).find('option').filter(':selected').length\n : validator.getFieldElements($field.attr('data-' + ns + '-field')).filter(':checked').length,\n min = options.min ? ($.isNumeric(options.min) ? options.min : validator.getDynamicOption($field, options.min)) : null,\n max = options.max ? ($.isNumeric(options.max) ? options.max : validator.getDynamicOption($field, options.max)) : null,\n isValid = true,\n message = options.message || FormValidation.I18n[locale].choice['default'];\n\n if ((min && numChoices < parseInt(min, 10)) || (max && numChoices > parseInt(max, 10))) {\n isValid = false;\n }\n\n switch (true) {\n case (!!min && !!max):\n message = FormValidation.Helper.format(options.message || FormValidation.I18n[locale].choice.between, [parseInt(min, 10), parseInt(max, 10)]);\n break;\n\n case (!!min):\n message = FormValidation.Helper.format(options.message || FormValidation.I18n[locale].choice.less, parseInt(min, 10));\n break;\n\n case (!!max):\n message = FormValidation.Helper.format(options.message || FormValidation.I18n[locale].choice.more, parseInt(max, 10));\n break;\n\n default:\n break;\n }\n\n return { valid: isValid, message: message };\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n color: {\n 'default': 'Please enter a valid color'\n }\n }\n });\n\n FormValidation.Validator.color = {\n html5Attributes: {\n message: 'message',\n type: 'type'\n },\n\n enableByHtml5: function($field) {\n return ('color' === $field.attr('type'));\n },\n\n SUPPORTED_TYPES: [\n 'hex', 'rgb', 'rgba', 'hsl', 'hsla', 'keyword'\n ],\n\n KEYWORD_COLORS: [\n // Colors start with A\n 'aliceblue', 'antiquewhite', 'aqua', 'aquamarine', 'azure',\n // B\n 'beige', 'bisque', 'black', 'blanchedalmond', 'blue', 'blueviolet', 'brown', 'burlywood',\n // C\n 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan',\n // D\n 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki', 'darkmagenta',\n 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue',\n 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray',\n 'dimgrey', 'dodgerblue',\n // F\n 'firebrick', 'floralwhite', 'forestgreen', 'fuchsia',\n // G\n 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'gray', 'green', 'greenyellow', 'grey',\n // H\n 'honeydew', 'hotpink',\n // I\n 'indianred', 'indigo', 'ivory',\n // K\n 'khaki',\n // L\n 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan',\n 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen',\n 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'lime', 'limegreen',\n 'linen',\n // M\n 'magenta', 'maroon', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen',\n 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream',\n 'mistyrose', 'moccasin',\n // N\n 'navajowhite', 'navy',\n // O\n 'oldlace', 'olive', 'olivedrab', 'orange', 'orangered', 'orchid',\n // P\n 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink',\n 'plum', 'powderblue', 'purple',\n // R\n 'red', 'rosybrown', 'royalblue',\n // S\n 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'silver', 'skyblue', 'slateblue',\n 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue',\n // T\n 'tan', 'teal', 'thistle', 'tomato', 'transparent', 'turquoise',\n // V\n 'violet',\n // W\n 'wheat', 'white', 'whitesmoke',\n // Y\n 'yellow', 'yellowgreen'\n ],\n\n /**\n * Return true if the input value is a valid color\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * - type: The array of valid color types\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n // Only accept 6 hex character values due to the HTML 5 spec\n // See http://www.w3.org/TR/html-markup/input.color.html#input.color.attrs.value\n if (this.enableByHtml5($field)) {\n return /^#[0-9A-F]{6}$/i.test(value);\n }\n\n var types = options.type || this.SUPPORTED_TYPES;\n if (!$.isArray(types)) {\n types = types.replace(/s/g, '').split(',');\n }\n\n var method,\n type,\n isValid = false;\n\n for (var i = 0; i < types.length; i++) {\n type = types[i];\n method = '_' + type.toLowerCase();\n isValid = isValid || this[method](value);\n if (isValid) {\n return true;\n }\n }\n\n return false;\n },\n\n _hex: function(value) {\n return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(value);\n },\n\n _hsl: function(value) {\n return /^hsl\\((\\s*(-?\\d+)\\s*,)(\\s*(\\b(0?\\d{1,2}|100)\\b%)\\s*,)(\\s*(\\b(0?\\d{1,2}|100)\\b%)\\s*)\\)$/.test(value);\n },\n\n _hsla: function(value) {\n return /^hsla\\((\\s*(-?\\d+)\\s*,)(\\s*(\\b(0?\\d{1,2}|100)\\b%)\\s*,){2}(\\s*(0?(\\.\\d+)?|1(\\.0+)?)\\s*)\\)$/.test(value);\n },\n\n _keyword: function(value) {\n return $.inArray(value, this.KEYWORD_COLORS) >= 0;\n },\n\n _rgb: function(value) {\n var regexInteger = /^rgb\\((\\s*(\\b([01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\b)\\s*,){2}(\\s*(\\b([01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\b)\\s*)\\)$/,\n regexPercent = /^rgb\\((\\s*(\\b(0?\\d{1,2}|100)\\b%)\\s*,){2}(\\s*(\\b(0?\\d{1,2}|100)\\b%)\\s*)\\)$/;\n return regexInteger.test(value) || regexPercent.test(value);\n },\n\n _rgba: function(value) {\n var regexInteger = /^rgba\\((\\s*(\\b([01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\b)\\s*,){3}(\\s*(0?(\\.\\d+)?|1(\\.0+)?)\\s*)\\)$/,\n regexPercent = /^rgba\\((\\s*(\\b(0?\\d{1,2}|100)\\b%)\\s*,){3}(\\s*(0?(\\.\\d+)?|1(\\.0+)?)\\s*)\\)$/;\n return regexInteger.test(value) || regexPercent.test(value);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n creditCard: {\n 'default': 'Please enter a valid credit card number'\n }\n }\n });\n\n FormValidation.Validator.creditCard = {\n /**\n * Return true if the input value is valid credit card number\n * Based on https://gist.github.com/DiegoSalazar/4075533\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} [options] Can consist of the following key:\n * - message: The invalid message\n * @returns {Boolean|Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n // Accept only digits, dashes or spaces\n if (/[^0-9-\\s]+/.test(value)) {\n return false;\n }\n value = value.replace(/\\D/g, '');\n\n if (!FormValidation.Helper.luhn(value)) {\n return false;\n }\n\n // Validate the card number based on prefix (IIN ranges) and length\n var cards = {\n AMERICAN_EXPRESS: {\n length: [15],\n prefix: ['34', '37']\n },\n DINERS_CLUB: {\n length: [14],\n prefix: ['300', '301', '302', '303', '304', '305', '36']\n },\n DINERS_CLUB_US: {\n length: [16],\n prefix: ['54', '55']\n },\n DISCOVER: {\n length: [16],\n prefix: ['6011', '622126', '622127', '622128', '622129', '62213',\n '62214', '62215', '62216', '62217', '62218', '62219',\n '6222', '6223', '6224', '6225', '6226', '6227', '6228',\n '62290', '62291', '622920', '622921', '622922', '622923',\n '622924', '622925', '644', '645', '646', '647', '648',\n '649', '65']\n },\n JCB: {\n length: [16],\n prefix: ['3528', '3529', '353', '354', '355', '356', '357', '358']\n },\n LASER: {\n length: [16, 17, 18, 19],\n prefix: ['6304', '6706', '6771', '6709']\n },\n MAESTRO: {\n length: [12, 13, 14, 15, 16, 17, 18, 19],\n prefix: ['5018', '5020', '5038', '6304', '6759', '6761', '6762', '6763', '6764', '6765', '6766']\n },\n MASTERCARD: {\n length: [16],\n prefix: ['51', '52', '53', '54', '55']\n },\n SOLO: {\n length: [16, 18, 19],\n prefix: ['6334', '6767']\n },\n UNIONPAY: {\n length: [16, 17, 18, 19],\n prefix: ['622126', '622127', '622128', '622129', '62213', '62214',\n '62215', '62216', '62217', '62218', '62219', '6222', '6223',\n '6224', '6225', '6226', '6227', '6228', '62290', '62291',\n '622920', '622921', '622922', '622923', '622924', '622925']\n },\n VISA: {\n length: [16],\n prefix: ['4']\n }\n };\n\n var type, i;\n for (type in cards) {\n for (i in cards[type].prefix) {\n if (value.substr(0, cards[type].prefix[i].length) === cards[type].prefix[i] // Check the prefix\n && $.inArray(value.length, cards[type].length) !== -1) // and length\n {\n return {\n valid: true,\n type: type\n };\n }\n }\n }\n\n return false;\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n cusip: {\n 'default': 'Please enter a valid CUSIP number'\n }\n }\n });\n\n FormValidation.Validator.cusip = {\n /**\n * Validate a CUSIP number\n *\n * @see http://en.wikipedia.org/wiki/CUSIP\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} [options] Can consist of the following keys:\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n value = value.toUpperCase();\n if (!/^[0-9A-Z]{9}$/.test(value)) {\n return false;\n }\n\n var converted = $.map(value.split(''), function(item) {\n var code = item.charCodeAt(0);\n return (code >= 'A'.charCodeAt(0) && code <= 'Z'.charCodeAt(0))\n // Replace A, B, C, ..., Z with 10, 11, ..., 35\n ? (code - 'A'.charCodeAt(0) + 10)\n : item;\n }),\n length = converted.length,\n sum = 0;\n for (var i = 0; i < length - 1; i++) {\n var num = parseInt(converted[i], 10);\n if (i % 2 !== 0) {\n num *= 2;\n }\n if (num > 9) {\n num -= 9;\n }\n sum += num;\n }\n\n sum = (10 - (sum % 10)) % 10;\n return sum === parseInt(converted[length - 1], 10);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n cvv: {\n 'default': 'Please enter a valid CVV number'\n }\n }\n });\n\n FormValidation.Validator.cvv = {\n html5Attributes: {\n message: 'message',\n ccfield: 'creditCardField'\n },\n\n /**\n * Bind the validator on the live change of the credit card field\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consists of the following key:\n * - creditCardField: The credit card number field\n */\n init: function(validator, $field, options, validatorName) {\n if (options.creditCardField) {\n var creditCardField = validator.getFieldElements(options.creditCardField);\n validator.onLiveChange(creditCardField, 'live_' + validatorName, function() {\n var status = validator.getStatus($field, validatorName);\n if (status !== validator.STATUS_NOT_VALIDATED) {\n validator.revalidateField($field);\n }\n });\n }\n },\n\n /**\n * Unbind the validator on the live change of the credit card field\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consists of the following key:\n * - creditCardField: The credit card number field\n */\n destroy: function(validator, $field, options, validatorName) {\n if (options.creditCardField) {\n var creditCardField = validator.getFieldElements(options.creditCardField);\n validator.offLiveChange(creditCardField, 'live_' + validatorName);\n }\n },\n\n /**\n * Return true if the input value is a valid CVV number.\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - creditCardField: The credit card number field. It can be null\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n if (!/^[0-9]{3,4}$/.test(value)) {\n return false;\n }\n\n if (!options.creditCardField) {\n return true;\n }\n\n // Get the credit card number\n var creditCard = validator.getFieldElements(options.creditCardField).val();\n if (creditCard === '') {\n return true;\n }\n\n creditCard = creditCard.replace(/\\D/g, '');\n\n // Supported credit card types\n var cards = {\n AMERICAN_EXPRESS: {\n length: [15],\n prefix: ['34', '37']\n },\n DINERS_CLUB: {\n length: [14],\n prefix: ['300', '301', '302', '303', '304', '305', '36']\n },\n DINERS_CLUB_US: {\n length: [16],\n prefix: ['54', '55']\n },\n DISCOVER: {\n length: [16],\n prefix: ['6011', '622126', '622127', '622128', '622129', '62213',\n '62214', '62215', '62216', '62217', '62218', '62219',\n '6222', '6223', '6224', '6225', '6226', '6227', '6228',\n '62290', '62291', '622920', '622921', '622922', '622923',\n '622924', '622925', '644', '645', '646', '647', '648',\n '649', '65']\n },\n JCB: {\n length: [16],\n prefix: ['3528', '3529', '353', '354', '355', '356', '357', '358']\n },\n LASER: {\n length: [16, 17, 18, 19],\n prefix: ['6304', '6706', '6771', '6709']\n },\n MAESTRO: {\n length: [12, 13, 14, 15, 16, 17, 18, 19],\n prefix: ['5018', '5020', '5038', '6304', '6759', '6761', '6762', '6763', '6764', '6765', '6766']\n },\n MASTERCARD: {\n length: [16],\n prefix: ['51', '52', '53', '54', '55']\n },\n SOLO: {\n length: [16, 18, 19],\n prefix: ['6334', '6767']\n },\n UNIONPAY: {\n length: [16, 17, 18, 19],\n prefix: ['622126', '622127', '622128', '622129', '62213', '62214',\n '62215', '62216', '62217', '62218', '62219', '6222', '6223',\n '6224', '6225', '6226', '6227', '6228', '62290', '62291',\n '622920', '622921', '622922', '622923', '622924', '622925']\n },\n VISA: {\n length: [16],\n prefix: ['4']\n }\n };\n var type, i, creditCardType = null;\n for (type in cards) {\n for (i in cards[type].prefix) {\n if (creditCard.substr(0, cards[type].prefix[i].length) === cards[type].prefix[i] // Check the prefix\n && $.inArray(creditCard.length, cards[type].length) !== -1) // and length\n {\n creditCardType = type;\n break;\n }\n }\n }\n\n return (creditCardType === null)\n ? false\n : (('AMERICAN_EXPRESS' === creditCardType) ? (value.length === 4) : (value.length === 3));\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n date: {\n 'default': 'Please enter a valid date',\n min: 'Please enter a date after %s',\n max: 'Please enter a date before %s',\n range: 'Please enter a date in the range %s - %s'\n }\n }\n });\n\n FormValidation.Validator.date = {\n html5Attributes: {\n message: 'message',\n format: 'format',\n min: 'min',\n max: 'max',\n separator: 'separator'\n },\n\n /**\n * Return true if the input value is valid date\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * - min: the minimum date\n * - max: the maximum date\n * - separator: Use to separate the date, month, and year.\n * By default, it is /\n * - format: The date format. Default is MM/DD/YYYY\n * The format can be:\n *\n * i) date: Consist of DD, MM, YYYY parts which are separated by the separator option\n * ii) date and time:\n * The time can consist of h, m, s parts which are separated by :\n * ii) date, time and A (indicating AM or PM)\n * @returns {Boolean|Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n options.format = options.format || 'MM/DD/YYYY';\n\n // #683: Force the format to YYYY-MM-DD as the default browser behaviour when using type=\"date\" attribute\n if ($field.attr('type') === 'date') {\n options.format = 'YYYY-MM-DD';\n }\n\n var locale = validator.getLocale(),\n message = options.message || FormValidation.I18n[locale].date['default'],\n formats = options.format.split(' '),\n dateFormat = formats[0],\n timeFormat = (formats.length > 1) ? formats[1] : null,\n amOrPm = (formats.length > 2) ? formats[2] : null,\n sections = value.split(' '),\n date = sections[0],\n time = (sections.length > 1) ? sections[1] : null;\n\n if (formats.length !== sections.length) {\n return {\n valid: false,\n message: message\n };\n }\n\n // Determine the separator\n var separator = options.separator;\n if (!separator) {\n separator = (date.indexOf('/') !== -1)\n ? '/'\n : ((date.indexOf('-') !== -1) ? '-' : ((date.indexOf('.') !== -1) ? '.' : null));\n }\n if (separator === null || date.indexOf(separator) === -1) {\n return {\n valid: false,\n message: message\n };\n }\n\n // Determine the date\n date = date.split(separator);\n dateFormat = dateFormat.split(separator);\n if (date.length !== dateFormat.length) {\n return {\n valid: false,\n message: message\n };\n }\n\n var year = date[$.inArray('YYYY', dateFormat)],\n month = date[$.inArray('MM', dateFormat)],\n day = date[$.inArray('DD', dateFormat)];\n\n if (!year || !month || !day || year.length !== 4) {\n return {\n valid: false,\n message: message\n };\n }\n\n // Determine the time\n var minutes = null, hours = null, seconds = null;\n if (timeFormat) {\n timeFormat = timeFormat.split(':');\n time = time.split(':');\n\n if (timeFormat.length !== time.length) {\n return {\n valid: false,\n message: message\n };\n }\n\n hours = time.length > 0 ? time[0] : null;\n minutes = time.length > 1 ? time[1] : null;\n seconds = time.length > 2 ? time[2] : null;\n\n if (hours === '' || minutes === '' || seconds === '') {\n return {\n valid: false,\n message: message\n };\n }\n\n // Validate seconds\n if (seconds) {\n if (isNaN(seconds) || seconds.length > 2) {\n return {\n valid: false,\n message: message\n };\n }\n seconds = parseInt(seconds, 10);\n if (seconds < 0 || seconds > 60) {\n return {\n valid: false,\n message: message\n };\n }\n }\n\n // Validate hours\n if (hours) {\n if (isNaN(hours) || hours.length > 2) {\n return {\n valid: false,\n message: message\n };\n }\n hours = parseInt(hours, 10);\n if (hours < 0 || hours >= 24 || (amOrPm && hours > 12)) {\n return {\n valid: false,\n message: message\n };\n }\n }\n\n // Validate minutes\n if (minutes) {\n if (isNaN(minutes) || minutes.length > 2) {\n return {\n valid: false,\n message: message\n };\n }\n minutes = parseInt(minutes, 10);\n if (minutes < 0 || minutes > 59) {\n return {\n valid: false,\n message: message\n };\n }\n }\n }\n\n // Validate day, month, and year\n var valid = FormValidation.Helper.date(year, month, day),\n // declare the date, min and max objects\n min = null,\n max = null,\n minOption = options.min,\n maxOption = options.max;\n\n if (minOption) {\n if (isNaN(Date.parse(minOption))) {\n minOption = validator.getDynamicOption($field, minOption);\n }\n\n min = minOption instanceof Date ? minOption : this._parseDate(minOption, dateFormat, separator);\n // In order to avoid displaying a date string like \"Mon Dec 08 2014 19:14:12 GMT+0000 (WET)\"\n minOption = minOption instanceof Date ? this._formatDate(minOption, options.format) : minOption;\n }\n\n if (maxOption) {\n if (isNaN(Date.parse(maxOption))) {\n maxOption = validator.getDynamicOption($field, maxOption);\n }\n\n max = maxOption instanceof Date ? maxOption : this._parseDate(maxOption, dateFormat, separator);\n // In order to avoid displaying a date string like \"Mon Dec 08 2014 19:14:12 GMT+0000 (WET)\"\n maxOption = maxOption instanceof Date ? this._formatDate(maxOption, options.format) : maxOption;\n }\n\n date = new Date(year, month -1, day, hours, minutes, seconds);\n\n switch (true) {\n case (minOption && !maxOption && valid):\n valid = date.getTime() >= min.getTime();\n message = options.message || FormValidation.Helper.format(FormValidation.I18n[locale].date.min, minOption);\n break;\n\n case (maxOption && !minOption && valid):\n valid = date.getTime() <= max.getTime();\n message = options.message || FormValidation.Helper.format(FormValidation.I18n[locale].date.max, maxOption);\n break;\n\n case (maxOption && minOption && valid):\n valid = date.getTime() <= max.getTime() && date.getTime() >= min.getTime();\n message = options.message || FormValidation.Helper.format(FormValidation.I18n[locale].date.range, [minOption, maxOption]);\n break;\n\n default:\n break;\n }\n\n return {\n valid: valid,\n date: date,\n message: message\n };\n },\n\n /**\n * Return a date object after parsing the date string\n *\n * @param {String} date The date string to parse\n * @param {String} format The date format\n * The format can be:\n * - date: Consist of DD, MM, YYYY parts which are separated by the separator option\n * - date and time:\n * The time can consist of h, m, s parts which are separated by :\n * @param {String} separator The separator used to separate the date, month, and year\n * @returns {Date}\n */\n _parseDate: function(date, format, separator) {\n var minutes = 0, hours = 0, seconds = 0,\n sections = date.split(' '),\n dateSection = sections[0],\n timeSection = (sections.length > 1) ? sections[1] : null;\n\n dateSection = dateSection.split(separator);\n var year = dateSection[$.inArray('YYYY', format)],\n month = dateSection[$.inArray('MM', format)],\n day = dateSection[$.inArray('DD', format)];\n if (timeSection) {\n timeSection = timeSection.split(':');\n hours = timeSection.length > 0 ? timeSection[0] : null;\n minutes = timeSection.length > 1 ? timeSection[1] : null;\n seconds = timeSection.length > 2 ? timeSection[2] : null;\n }\n\n return new Date(year, month -1, day, hours, minutes, seconds);\n },\n\n /**\n * Format date\n *\n * @param {Date} date The date object to format\n * @param {String} format The date format\n * The format can consist of the following tokens:\n * d Day of the month without leading zeros (1 through 31)\n * dd Day of the month with leading zeros (01 through 31)\n * m Month without leading zeros (1 through 12)\n * mm Month with leading zeros (01 through 12)\n * yy Last two digits of year (for example: 14)\n * yyyy Full four digits of year (for example: 2014)\n * h Hours without leading zeros (1 through 12)\n * hh Hours with leading zeros (01 through 12)\n * H Hours without leading zeros (0 through 23)\n * HH Hours with leading zeros (00 through 23)\n * M Minutes without leading zeros (0 through 59)\n * MM Minutes with leading zeros (00 through 59)\n * s Seconds without leading zeros (0 through 59)\n * ss Seconds with leading zeros (00 through 59)\n * @returns {String}\n */\n _formatDate: function(date, format) {\n format = format\n .replace(/Y/g, 'y')\n .replace(/M/g, 'm')\n .replace(/D/g, 'd')\n .replace(/:m/g, ':M')\n .replace(/:mm/g, ':MM')\n .replace(/:S/, ':s')\n .replace(/:SS/, ':ss');\n\n var replacer = {\n d: function(date) {\n return date.getDate();\n },\n dd: function(date) {\n var d = date.getDate();\n return (d < 10) ? '0' + d : d;\n },\n m: function(date) {\n return date.getMonth() + 1;\n },\n mm: function(date) {\n var m = date.getMonth() + 1;\n return m < 10 ? '0' + m : m;\n },\n yy: function(date) {\n return ('' + date.getFullYear()).substr(2);\n },\n yyyy: function(date) {\n return date.getFullYear();\n },\n h: function(date) {\n return date.getHours() % 12 || 12;\n },\n hh: function(date) {\n var h = date.getHours() % 12 || 12;\n return h < 10 ? '0' + h : h;\n },\n H: function(date) {\n return date.getHours();\n },\n HH: function(date) {\n var H = date.getHours();\n return H < 10 ? '0' + H : H;\n },\n M: function(date) {\n return date.getMinutes();\n },\n MM: function(date) {\n var M = date.getMinutes();\n return M < 10 ? '0' + M : M;\n },\n s: function(date) {\n return date.getSeconds();\n },\n ss: function(date) {\n var s = date.getSeconds();\n return s < 10 ? '0' + s : s;\n }\n };\n\n return format.replace(/d{1,4}|m{1,4}|yy(?:yy)?|([HhMs])\\1?|\"[^\"]*\"|'[^']*'/g, function(match) {\n return replacer[match] ? replacer[match](date) : match.slice(1, match.length - 1);\n });\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n different: {\n 'default': 'Please enter a different value'\n }\n }\n });\n\n FormValidation.Validator.different = {\n html5Attributes: {\n message: 'message',\n field: 'field'\n },\n\n /**\n * Bind the validator on the live change of the field to compare with current one\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consists of the following key:\n * - field: The name of field that will be used to compare with current one\n */\n init: function(validator, $field, options, validatorName) {\n var fields = options.field.split(',');\n for (var i = 0; i < fields.length; i++) {\n var compareWith = validator.getFieldElements(fields[i]);\n validator.onLiveChange(compareWith, 'live_' + validatorName, function() {\n var status = validator.getStatus($field, validatorName);\n if (status !== validator.STATUS_NOT_VALIDATED) {\n validator.revalidateField($field);\n }\n });\n }\n },\n\n /**\n * Unbind the validator on the live change of the field to compare with current one\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consists of the following key:\n * - field: The name of field that will be used to compare with current one\n */\n destroy: function(validator, $field, options, validatorName) {\n var fields = options.field.split(',');\n for (var i = 0; i < fields.length; i++) {\n var compareWith = validator.getFieldElements(fields[i]);\n validator.offLiveChange(compareWith, 'live_' + validatorName);\n }\n },\n\n /**\n * Return true if the input value is different with given field's value\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consists of the following key:\n * - field: The name of field that will be used to compare with current one\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n var fields = options.field.split(','),\n isValid = true;\n\n for (var i = 0; i < fields.length; i++) {\n var compareWith = validator.getFieldElements(fields[i]);\n if (compareWith == null || compareWith.length === 0) {\n continue;\n }\n\n var compareValue = validator.getFieldValue(compareWith, validatorName);\n if (value === compareValue) {\n isValid = false;\n } else if (compareValue !== '') {\n validator.updateStatus(compareWith, validator.STATUS_VALID, validatorName);\n }\n }\n\n return isValid;\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n digits: {\n 'default': 'Please enter only digits'\n }\n }\n });\n\n FormValidation.Validator.digits = {\n /**\n * Return true if the input value contains digits only\n *\n * @param {FormValidation.Base} validator Validate plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} [options]\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n return /^\\d+$/.test(value);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n ean: {\n 'default': 'Please enter a valid EAN number'\n }\n }\n });\n\n FormValidation.Validator.ean = {\n /**\n * Validate EAN (International Article Number)\n *\n * @see http://en.wikipedia.org/wiki/European_Article_Number\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n if (!/^(\\d{8}|\\d{12}|\\d{13})$/.test(value)) {\n return false;\n }\n\n var length = value.length,\n sum = 0,\n weight = (length === 8) ? [3, 1] : [1, 3];\n for (var i = 0; i < length - 1; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i % 2];\n }\n sum = (10 - sum % 10) % 10;\n return (sum + '' === value.charAt(length - 1));\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n ein: {\n 'default': 'Please enter a valid EIN number'\n }\n }\n });\n\n FormValidation.Validator.ein = {\n // The first two digits are called campus\n // See http://en.wikipedia.org/wiki/Employer_Identification_Number\n // http://www.irs.gov/Businesses/Small-Businesses-&-Self-Employed/How-EINs-are-Assigned-and-Valid-EIN-Prefixes\n CAMPUS: {\n ANDOVER: ['10', '12'],\n ATLANTA: ['60', '67'],\n AUSTIN: ['50', '53'],\n BROOKHAVEN: ['01', '02', '03', '04', '05', '06', '11', '13', '14', '16', '21', '22', '23', '25', '34', '51', '52', '54', '55', '56', '57', '58', '59', '65'],\n CINCINNATI: ['30', '32', '35', '36', '37', '38', '61'],\n FRESNO: ['15', '24'],\n KANSAS_CITY: ['40', '44'],\n MEMPHIS: ['94', '95'],\n OGDEN: ['80', '90'],\n PHILADELPHIA: ['33', '39', '41', '42', '43', '46', '48', '62', '63', '64', '66', '68', '71', '72', '73', '74', '75', '76', '77', '81', '82', '83', '84', '85', '86', '87', '88', '91', '92', '93', '98', '99'],\n INTERNET: ['20', '26', '27', '45', '46'],\n SMALL_BUSINESS_ADMINISTRATION: ['31']\n },\n\n /**\n * Validate EIN (Employer Identification Number) which is also known as\n * Federal Employer Identification Number (FEIN) or Federal Tax Identification Number\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * @returns {Object|Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n if (!/^[0-9]{2}-?[0-9]{7}$/.test(value)) {\n return false;\n }\n // Check the first two digits\n var campus = value.substr(0, 2) + '';\n for (var key in this.CAMPUS) {\n if ($.inArray(campus, this.CAMPUS[key]) !== -1) {\n return {\n valid: true,\n campus: key\n };\n }\n }\n\n return false;\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n emailAddress: {\n 'default': 'Please enter a valid email address'\n }\n }\n });\n\n FormValidation.Validator.emailAddress = {\n html5Attributes: {\n message: 'message',\n multiple: 'multiple',\n separator: 'separator'\n },\n\n enableByHtml5: function($field) {\n return ('email' === $field.attr('type'));\n },\n\n /**\n * Return true if and only if the input value is a valid email address\n *\n * @param {FormValidation.Base} validator Validate plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} [options]\n * - multiple: Allow multiple email addresses, separated by a comma or semicolon; default is false.\n * - separator: Regex for character or characters expected as separator between addresses; default is comma /[,;]/, i.e. comma or semicolon.\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n // Email address regular expression\n // http://stackoverflow.com/questions/46155/validate-email-address-in-javascript\n var emailRegExp = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,\n allowMultiple = options.multiple === true || options.multiple === 'true';\n\n if (allowMultiple) {\n var separator = options.separator || /[,;]/,\n addresses = this._splitEmailAddresses(value, separator);\n\n for (var i = 0; i < addresses.length; i++) {\n if (!emailRegExp.test(addresses[i])) {\n return false;\n }\n }\n\n return true;\n } else {\n return emailRegExp.test(value);\n }\n },\n\n _splitEmailAddresses: function(emailAddresses, separator) {\n var quotedFragments = emailAddresses.split(/\"/),\n quotedFragmentCount = quotedFragments.length,\n emailAddressArray = [],\n nextEmailAddress = '';\n\n for (var i = 0; i < quotedFragmentCount; i++) {\n if (i % 2 === 0) {\n var splitEmailAddressFragments = quotedFragments[i].split(separator),\n splitEmailAddressFragmentCount = splitEmailAddressFragments.length;\n\n if (splitEmailAddressFragmentCount === 1) {\n nextEmailAddress += splitEmailAddressFragments[0];\n } else {\n emailAddressArray.push(nextEmailAddress + splitEmailAddressFragments[0]);\n\n for (var j = 1; j < splitEmailAddressFragmentCount - 1; j++) {\n emailAddressArray.push(splitEmailAddressFragments[j]);\n }\n nextEmailAddress = splitEmailAddressFragments[splitEmailAddressFragmentCount - 1];\n }\n } else {\n nextEmailAddress += '\"' + quotedFragments[i];\n if (i < quotedFragmentCount - 1) {\n nextEmailAddress += '\"';\n }\n }\n }\n\n emailAddressArray.push(nextEmailAddress);\n return emailAddressArray;\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n file: {\n 'default': 'Please choose a valid file'\n }\n }\n });\n\n FormValidation.Validator.file = {\n html5Attributes: {\n extension: 'extension',\n maxfiles: 'maxFiles',\n minfiles: 'minFiles',\n maxsize: 'maxSize',\n minsize: 'minSize',\n maxtotalsize: 'maxTotalSize',\n mintotalsize: 'minTotalSize',\n message: 'message',\n type: 'type'\n },\n\n /**\n * Validate upload file. Use HTML 5 API if the browser supports\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - extension: The allowed extensions, separated by a comma\n * - maxFiles: The maximum number of files\n * - minFiles: The minimum number of files\n * - maxSize: The maximum size in bytes\n * - minSize: The minimum size in bytes\n * - maxTotalSize: The maximum size in bytes for all files\n * - minTotalSize: The minimum size in bytes for all files\n * - message: The invalid message\n * - type: The allowed MIME type, separated by a comma\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n var ext,\n extensions = options.extension ? options.extension.toLowerCase().split(',') : null,\n types = options.type ? options.type.toLowerCase().split(',') : null,\n html5 = (window.File && window.FileList && window.FileReader);\n\n if (html5) {\n // Get FileList instance\n var files = $field.get(0).files,\n total = files.length,\n totalSize = 0;\n\n if ((options.maxFiles && total > parseInt(options.maxFiles, 10)) // Check the maxFiles\n || (options.minFiles && total < parseInt(options.minFiles, 10))) // Check the minFiles\n {\n return false;\n }\n\n for (var i = 0; i < total; i++) {\n totalSize += files[i].size;\n ext = files[i].name.substr(files[i].name.lastIndexOf('.') + 1);\n\n if ((options.minSize && files[i].size < parseInt(options.minSize, 10)) // Check the minSize\n || (options.maxSize && files[i].size > parseInt(options.maxSize, 10)) // Check the maxSize\n || (extensions && $.inArray(ext.toLowerCase(), extensions) === -1) // Check file extension\n || (files[i].type && types && $.inArray(files[i].type.toLowerCase(), types) === -1)) // Check file type\n {\n return false;\n }\n }\n\n if ((options.maxTotalSize && totalSize > parseInt(options.maxTotalSize, 10)) // Check the maxTotalSize\n || (options.minTotalSize && totalSize < parseInt(options.minTotalSize, 10))) // Check the minTotalSize\n {\n return false;\n }\n } else {\n // Check file extension\n ext = value.substr(value.lastIndexOf('.') + 1);\n if (extensions && $.inArray(ext.toLowerCase(), extensions) === -1) {\n return false;\n }\n }\n\n return true;\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n greaterThan: {\n 'default': 'Please enter a value greater than or equal to %s',\n notInclusive: 'Please enter a value greater than %s'\n }\n }\n });\n\n FormValidation.Validator.greaterThan = {\n html5Attributes: {\n message: 'message',\n value: 'value',\n inclusive: 'inclusive'\n },\n\n enableByHtml5: function($field) {\n var type = $field.attr('type'),\n min = $field.attr('min');\n if (min && type !== 'date') {\n return {\n value: min\n };\n }\n\n return false;\n },\n\n /**\n * Return true if the input value is greater than or equals to given number\n *\n * @param {FormValidation.Base} validator Validate plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - value: Define the number to compare with. It can be\n * - A number\n * - Name of field which its value defines the number\n * - Name of callback function that returns the number\n * - A callback function that returns the number\n *\n * - inclusive [optional]: Can be true or false. Default is true\n * - message: The invalid message\n * @returns {Boolean|Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n value = this._format(value);\n\n var locale = validator.getLocale(),\n compareTo = $.isNumeric(options.value) ? options.value : validator.getDynamicOption($field, options.value),\n compareToValue = this._format(compareTo);\n\n\t\t\treturn (options.inclusive === true || options.inclusive === undefined)\n ? {\n valid: $.isNumeric(value) && parseFloat(value) >= compareToValue,\n message: FormValidation.Helper.format(options.message || FormValidation.I18n[locale].greaterThan['default'], compareTo)\n }\n : {\n valid: $.isNumeric(value) && parseFloat(value) > compareToValue,\n message: FormValidation.Helper.format(options.message || FormValidation.I18n[locale].greaterThan.notInclusive, compareTo)\n };\n },\n\n _format: function(value) {\n return (value + '').replace(',', '.');\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n grid: {\n 'default': 'Please enter a valid GRId number'\n }\n }\n });\n\n FormValidation.Validator.grid = {\n /**\n * Validate GRId (Global Release Identifier)\n *\n * @see http://en.wikipedia.org/wiki/Global_Release_Identifier\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n value = value.toUpperCase();\n if (!/^[GRID:]*([0-9A-Z]{2})[-\\s]*([0-9A-Z]{5})[-\\s]*([0-9A-Z]{10})[-\\s]*([0-9A-Z]{1})$/g.test(value)) {\n return false;\n }\n value = value.replace(/\\s/g, '').replace(/-/g, '');\n if ('GRID:' === value.substr(0, 5)) {\n value = value.substr(5);\n }\n return FormValidation.Helper.mod37And36(value);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n hex: {\n 'default': 'Please enter a valid hexadecimal number'\n }\n }\n });\n\n FormValidation.Validator.hex = {\n /**\n * Return true if and only if the input value is a valid hexadecimal number\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consist of key:\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n return /^[0-9a-fA-F]+$/.test(value);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n iban: {\n 'default': 'Please enter a valid IBAN number',\n country: 'Please enter a valid IBAN number in %s',\n countries: {\n AD: 'Andorra',\n AE: 'United Arab Emirates',\n AL: 'Albania',\n AO: 'Angola',\n AT: 'Austria',\n AZ: 'Azerbaijan',\n BA: 'Bosnia and Herzegovina',\n BE: 'Belgium',\n BF: 'Burkina Faso',\n BG: 'Bulgaria',\n BH: 'Bahrain',\n BI: 'Burundi',\n BJ: 'Benin',\n BR: 'Brazil',\n CH: 'Switzerland',\n CI: 'Ivory Coast',\n CM: 'Cameroon',\n CR: 'Costa Rica',\n CV: 'Cape Verde',\n CY: 'Cyprus',\n CZ: 'Czech Republic',\n DE: 'Germany',\n DK: 'Denmark',\n DO: 'Dominican Republic',\n DZ: 'Algeria',\n EE: 'Estonia',\n ES: 'Spain',\n FI: 'Finland',\n FO: 'Faroe Islands',\n FR: 'France',\n GB: 'United Kingdom',\n GE: 'Georgia',\n GI: 'Gibraltar',\n GL: 'Greenland',\n GR: 'Greece',\n GT: 'Guatemala',\n HR: 'Croatia',\n HU: 'Hungary',\n IE: 'Ireland',\n IL: 'Israel',\n IR: 'Iran',\n IS: 'Iceland',\n IT: 'Italy',\n JO: 'Jordan',\n KW: 'Kuwait',\n KZ: 'Kazakhstan',\n LB: 'Lebanon',\n LI: 'Liechtenstein',\n LT: 'Lithuania',\n LU: 'Luxembourg',\n LV: 'Latvia',\n MC: 'Monaco',\n MD: 'Moldova',\n ME: 'Montenegro',\n MG: 'Madagascar',\n MK: 'Macedonia',\n ML: 'Mali',\n MR: 'Mauritania',\n MT: 'Malta',\n MU: 'Mauritius',\n MZ: 'Mozambique',\n NL: 'Netherlands',\n NO: 'Norway',\n PK: 'Pakistan',\n PL: 'Poland',\n PS: 'Palestine',\n PT: 'Portugal',\n QA: 'Qatar',\n RO: 'Romania',\n RS: 'Serbia',\n SA: 'Saudi Arabia',\n SE: 'Sweden',\n SI: 'Slovenia',\n SK: 'Slovakia',\n SM: 'San Marino',\n SN: 'Senegal',\n TL: 'East Timor',\n TN: 'Tunisia',\n TR: 'Turkey',\n VG: 'Virgin Islands, British',\n XK: 'Republic of Kosovo'\n }\n }\n }\n });\n\n FormValidation.Validator.iban = {\n html5Attributes: {\n message: 'message',\n country: 'country',\n sepa: 'sepa'\n },\n\n // http://www.swift.com/dsp/resources/documents/IBAN_Registry.pdf\n // http://en.wikipedia.org/wiki/International_Bank_Account_Number#IBAN_formats_by_country\n REGEX: {\n AD: 'AD[0-9]{2}[0-9]{4}[0-9]{4}[A-Z0-9]{12}', // Andorra\n AE: 'AE[0-9]{2}[0-9]{3}[0-9]{16}', // United Arab Emirates\n AL: 'AL[0-9]{2}[0-9]{8}[A-Z0-9]{16}', // Albania\n AO: 'AO[0-9]{2}[0-9]{21}', // Angola\n AT: 'AT[0-9]{2}[0-9]{5}[0-9]{11}', // Austria\n AZ: 'AZ[0-9]{2}[A-Z]{4}[A-Z0-9]{20}', // Azerbaijan\n BA: 'BA[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{8}[0-9]{2}', // Bosnia and Herzegovina\n BE: 'BE[0-9]{2}[0-9]{3}[0-9]{7}[0-9]{2}', // Belgium\n BF: 'BF[0-9]{2}[0-9]{23}', // Burkina Faso\n BG: 'BG[0-9]{2}[A-Z]{4}[0-9]{4}[0-9]{2}[A-Z0-9]{8}', // Bulgaria\n BH: 'BH[0-9]{2}[A-Z]{4}[A-Z0-9]{14}', // Bahrain\n BI: 'BI[0-9]{2}[0-9]{12}', // Burundi\n BJ: 'BJ[0-9]{2}[A-Z]{1}[0-9]{23}', // Benin\n BR: 'BR[0-9]{2}[0-9]{8}[0-9]{5}[0-9]{10}[A-Z][A-Z0-9]', // Brazil\n CH: 'CH[0-9]{2}[0-9]{5}[A-Z0-9]{12}', // Switzerland\n CI: 'CI[0-9]{2}[A-Z]{1}[0-9]{23}', // Ivory Coast\n CM: 'CM[0-9]{2}[0-9]{23}', // Cameroon\n CR: 'CR[0-9]{2}[0-9]{3}[0-9]{14}', // Costa Rica\n CV: 'CV[0-9]{2}[0-9]{21}', // Cape Verde\n CY: 'CY[0-9]{2}[0-9]{3}[0-9]{5}[A-Z0-9]{16}', // Cyprus\n CZ: 'CZ[0-9]{2}[0-9]{20}', // Czech Republic\n DE: 'DE[0-9]{2}[0-9]{8}[0-9]{10}', // Germany\n DK: 'DK[0-9]{2}[0-9]{14}', // Denmark\n DO: 'DO[0-9]{2}[A-Z0-9]{4}[0-9]{20}', // Dominican Republic\n DZ: 'DZ[0-9]{2}[0-9]{20}', // Algeria\n EE: 'EE[0-9]{2}[0-9]{2}[0-9]{2}[0-9]{11}[0-9]{1}', // Estonia\n ES: 'ES[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{1}[0-9]{1}[0-9]{10}', // Spain\n FI: 'FI[0-9]{2}[0-9]{6}[0-9]{7}[0-9]{1}', // Finland\n FO: 'FO[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}', // Faroe Islands\n FR: 'FR[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}', // France\n GB: 'GB[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}', // United Kingdom\n GE: 'GE[0-9]{2}[A-Z]{2}[0-9]{16}', // Georgia\n GI: 'GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}', // Gibraltar\n GL: 'GL[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}', // Greenland\n GR: 'GR[0-9]{2}[0-9]{3}[0-9]{4}[A-Z0-9]{16}', // Greece\n GT: 'GT[0-9]{2}[A-Z0-9]{4}[A-Z0-9]{20}', // Guatemala\n HR: 'HR[0-9]{2}[0-9]{7}[0-9]{10}', // Croatia\n HU: 'HU[0-9]{2}[0-9]{3}[0-9]{4}[0-9]{1}[0-9]{15}[0-9]{1}', // Hungary\n IE: 'IE[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}', // Ireland\n IL: 'IL[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{13}', // Israel\n IR: 'IR[0-9]{2}[0-9]{22}', // Iran\n IS: 'IS[0-9]{2}[0-9]{4}[0-9]{2}[0-9]{6}[0-9]{10}', // Iceland\n IT: 'IT[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}', // Italy\n JO: 'JO[0-9]{2}[A-Z]{4}[0-9]{4}[0]{8}[A-Z0-9]{10}', // Jordan\n KW: 'KW[0-9]{2}[A-Z]{4}[0-9]{22}', // Kuwait\n KZ: 'KZ[0-9]{2}[0-9]{3}[A-Z0-9]{13}', // Kazakhstan\n LB: 'LB[0-9]{2}[0-9]{4}[A-Z0-9]{20}', // Lebanon\n LI: 'LI[0-9]{2}[0-9]{5}[A-Z0-9]{12}', // Liechtenstein\n LT: 'LT[0-9]{2}[0-9]{5}[0-9]{11}', // Lithuania\n LU: 'LU[0-9]{2}[0-9]{3}[A-Z0-9]{13}', // Luxembourg\n LV: 'LV[0-9]{2}[A-Z]{4}[A-Z0-9]{13}', // Latvia\n MC: 'MC[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}', // Monaco\n MD: 'MD[0-9]{2}[A-Z0-9]{20}', // Moldova\n ME: 'ME[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}', // Montenegro\n MG: 'MG[0-9]{2}[0-9]{23}', // Madagascar\n MK: 'MK[0-9]{2}[0-9]{3}[A-Z0-9]{10}[0-9]{2}', // Macedonia\n ML: 'ML[0-9]{2}[A-Z]{1}[0-9]{23}', // Mali\n MR: 'MR13[0-9]{5}[0-9]{5}[0-9]{11}[0-9]{2}', // Mauritania\n MT: 'MT[0-9]{2}[A-Z]{4}[0-9]{5}[A-Z0-9]{18}', // Malta\n MU: 'MU[0-9]{2}[A-Z]{4}[0-9]{2}[0-9]{2}[0-9]{12}[0-9]{3}[A-Z]{3}', // Mauritius\n MZ: 'MZ[0-9]{2}[0-9]{21}', // Mozambique\n NL: 'NL[0-9]{2}[A-Z]{4}[0-9]{10}', // Netherlands\n NO: 'NO[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{1}', // Norway\n PK: 'PK[0-9]{2}[A-Z]{4}[A-Z0-9]{16}', // Pakistan\n PL: 'PL[0-9]{2}[0-9]{8}[0-9]{16}', // Poland\n PS: 'PS[0-9]{2}[A-Z]{4}[A-Z0-9]{21}', // Palestinian\n PT: 'PT[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{11}[0-9]{2}', // Portugal\n QA: 'QA[0-9]{2}[A-Z]{4}[A-Z0-9]{21}', // Qatar\n RO: 'RO[0-9]{2}[A-Z]{4}[A-Z0-9]{16}', // Romania\n RS: 'RS[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}', // Serbia\n SA: 'SA[0-9]{2}[0-9]{2}[A-Z0-9]{18}', // Saudi Arabia\n SE: 'SE[0-9]{2}[0-9]{3}[0-9]{16}[0-9]{1}', // Sweden\n SI: 'SI[0-9]{2}[0-9]{5}[0-9]{8}[0-9]{2}', // Slovenia\n SK: 'SK[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{10}', // Slovakia\n SM: 'SM[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}', // San Marino\n SN: 'SN[0-9]{2}[A-Z]{1}[0-9]{23}', // Senegal\n TL: 'TL38[0-9]{3}[0-9]{14}[0-9]{2}', // East Timor\n TN: 'TN59[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}', // Tunisia\n TR: 'TR[0-9]{2}[0-9]{5}[A-Z0-9]{1}[A-Z0-9]{16}', // Turkey\n VG: 'VG[0-9]{2}[A-Z]{4}[0-9]{16}', // Virgin Islands, British\n XK: 'XK[0-9]{2}[0-9]{4}[0-9]{10}[0-9]{2}' // Republic of Kosovo\n },\n\n // List of SEPA country codes\n SEPA_COUNTRIES: [\n 'AT', 'BE', 'BG', 'CH', 'CY', 'CZ', 'DE', 'DK', 'EE', 'ES',\n 'FI', 'FR', 'GB', 'GI', 'GR', 'HR', 'HU', 'IE', 'IS', 'IT',\n 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'NL', 'NO', 'PL', 'PT',\n 'RO', 'SE', 'SI', 'SK', 'SM'\n ],\n\n /**\n * Validate an International Bank Account Number (IBAN)\n * To test it, take the sample IBAN from\n * http://www.nordea.com/Our+services/International+products+and+services/Cash+Management/IBAN+countries/908462.html\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * - country: The ISO 3166-1 country code. It can be\n * - A country code\n * - Name of field which its value defines the country code\n * - Name of callback function that returns the country code\n * - A callback function that returns the country code\n * - sepa: Set it to true (false) to indicate that the IBAN number must be (not be) from SEPA countries\n * By default, this option is not defined\n * @returns {Boolean|Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n value = value.replace(/[^a-zA-Z0-9]/g, '').toUpperCase();\n var country = options.country;\n if (!country) {\n country = value.substr(0, 2);\n } else if (typeof country !== 'string' || !this.REGEX[country]) {\n // Determine the country code\n country = validator.getDynamicOption($field, country);\n }\n\n var locale = validator.getLocale();\n if (!this.REGEX[country]) {\n return false;\n }\n\n // Check whether or not the sepa option is enabled\n if (typeof options.sepa !== undefined) {\n var isSepaCountry = $.inArray(country, this.SEPA_COUNTRIES) !== -1;\n if (((options.sepa === 'true' || options.sepa === true) && !isSepaCountry)\n || ((options.sepa === 'false' || options.sepa === false) && isSepaCountry))\n {\n return false;\n }\n }\n\n if (!(new RegExp('^' + this.REGEX[country] + '$')).test(value)) {\n return {\n valid: false,\n message: FormValidation.Helper.format(options.message || FormValidation.I18n[locale].iban.country, FormValidation.I18n[locale].iban.countries[country])\n };\n }\n\n value = value.substr(4) + value.substr(0, 4);\n value = $.map(value.split(''), function(n) {\n var code = n.charCodeAt(0);\n return (code >= 'A'.charCodeAt(0) && code <= 'Z'.charCodeAt(0))\n // Replace A, B, C, ..., Z with 10, 11, ..., 35\n ? (code - 'A'.charCodeAt(0) + 10)\n : n;\n });\n value = value.join('');\n\n var temp = parseInt(value.substr(0, 1), 10),\n length = value.length;\n for (var i = 1; i < length; ++i) {\n temp = (temp * 10 + parseInt(value.substr(i, 1), 10)) % 97;\n }\n\n return {\n valid: (temp === 1),\n message: FormValidation.Helper.format(options.message || FormValidation.I18n[locale].iban.country, FormValidation.I18n[locale].iban.countries[country])\n };\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n id: {\n 'default': 'Please enter a valid identification number',\n country: 'Please enter a valid identification number in %s',\n countries: {\n BA: 'Bosnia and Herzegovina',\n BG: 'Bulgaria',\n BR: 'Brazil',\n CH: 'Switzerland',\n CL: 'Chile',\n CN: 'China',\n CZ: 'Czech Republic',\n DK: 'Denmark',\n EE: 'Estonia',\n ES: 'Spain',\n FI: 'Finland',\n HR: 'Croatia',\n IE: 'Ireland',\n IS: 'Iceland',\n LT: 'Lithuania',\n LV: 'Latvia',\n ME: 'Montenegro',\n MK: 'Macedonia',\n NL: 'Netherlands',\n PL: 'Poland',\n RO: 'Romania',\n RS: 'Serbia',\n SE: 'Sweden',\n SI: 'Slovenia',\n SK: 'Slovakia',\n SM: 'San Marino',\n TH: 'Thailand',\n ZA: 'South Africa'\n }\n }\n }\n });\n\n FormValidation.Validator.id = {\n html5Attributes: {\n message: 'message',\n country: 'country'\n },\n\n // Supported country codes\n COUNTRY_CODES: [\n 'BA', 'BG', 'BR', 'CH', 'CL', 'CN', 'CZ', 'DK', 'EE', 'ES', 'FI', 'HR', 'IE', 'IS', 'LT', 'LV', 'ME', 'MK', 'NL',\n 'PL', 'RO', 'RS', 'SE', 'SI', 'SK', 'SM', 'TH', 'ZA'\n ],\n\n /**\n * Validate identification number in different countries\n *\n * @see http://en.wikipedia.org/wiki/National_identification_number\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consist of key:\n * - message: The invalid message\n * - country: The ISO 3166-1 country code. It can be\n * - One of country code defined in COUNTRY_CODES\n * - Name of field which its value defines the country code\n * - Name of callback function that returns the country code\n * - A callback function that returns the country code\n * @returns {Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n var locale = validator.getLocale(),\n country = options.country;\n if (!country) {\n country = value.substr(0, 2);\n } else if (typeof country !== 'string' || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {\n // Determine the country code\n country = validator.getDynamicOption($field, country);\n }\n\n if ($.inArray(country, this.COUNTRY_CODES) === -1) {\n return true;\n }\n\n var method = ['_', country.toLowerCase()].join(''),\n result = this[method](value);\n result = (result === true || result === false) ? { valid: result } : result;\n result.message = FormValidation.Helper.format(options.message || FormValidation.I18n[locale].id.country, FormValidation.I18n[locale].id.countries[country.toUpperCase()]);\n\n return result;\n },\n\n /**\n * Validate Unique Master Citizen Number which uses in\n * - Bosnia and Herzegovina (country code: BA)\n * - Macedonia (MK)\n * - Montenegro (ME)\n * - Serbia (RS)\n * - Slovenia (SI)\n *\n * @see http://en.wikipedia.org/wiki/Unique_Master_Citizen_Number\n * @param {String} value The ID\n * @param {String} countryCode The ISO country code, can be BA, MK, ME, RS, SI\n * @returns {Boolean}\n */\n _validateJMBG: function(value, countryCode) {\n if (!/^\\d{13}$/.test(value)) {\n return false;\n }\n var day = parseInt(value.substr(0, 2), 10),\n month = parseInt(value.substr(2, 2), 10),\n year = parseInt(value.substr(4, 3), 10),\n rr = parseInt(value.substr(7, 2), 10),\n k = parseInt(value.substr(12, 1), 10);\n\n // Validate date of birth\n // FIXME: Validate the year of birth\n if (day > 31 || month > 12) {\n return false;\n }\n\n // Validate checksum\n var sum = 0;\n for (var i = 0; i < 6; i++) {\n sum += (7 - i) * (parseInt(value.charAt(i), 10) + parseInt(value.charAt(i + 6), 10));\n }\n sum = 11 - sum % 11;\n if (sum === 10 || sum === 11) {\n sum = 0;\n }\n if (sum !== k) {\n return false;\n }\n\n // Validate political region\n // rr is the political region of birth, which can be in ranges:\n // 10-19: Bosnia and Herzegovina\n // 20-29: Montenegro\n // 30-39: Croatia (not used anymore)\n // 41-49: Macedonia\n // 50-59: Slovenia (only 50 is used)\n // 70-79: Central Serbia\n // 80-89: Serbian province of Vojvodina\n // 90-99: Kosovo\n switch (countryCode.toUpperCase()) {\n case 'BA':\n return (10 <= rr && rr <= 19);\n case 'MK':\n return (41 <= rr && rr <= 49);\n case 'ME':\n return (20 <= rr && rr <= 29);\n case 'RS':\n return (70 <= rr && rr <= 99);\n case 'SI':\n return (50 <= rr && rr <= 59);\n default:\n return true;\n }\n },\n\n _ba: function(value) {\n return this._validateJMBG(value, 'BA');\n },\n _mk: function(value) {\n return this._validateJMBG(value, 'MK');\n },\n _me: function(value) {\n return this._validateJMBG(value, 'ME');\n },\n _rs: function(value) {\n return this._validateJMBG(value, 'RS');\n },\n\n /**\n * Examples: 0101006500006\n */\n _si: function(value) {\n return this._validateJMBG(value, 'SI');\n },\n\n /**\n * Validate Bulgarian national identification number (EGN)\n *\n * @see http://en.wikipedia.org/wiki/Uniform_civil_number\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _bg: function(value) {\n if (!/^\\d{10}$/.test(value) && !/^\\d{6}\\s\\d{3}\\s\\d{1}$/.test(value)) {\n return false;\n }\n value = value.replace(/\\s/g, '');\n // Check the birth date\n var year = parseInt(value.substr(0, 2), 10) + 1900,\n month = parseInt(value.substr(2, 2), 10),\n day = parseInt(value.substr(4, 2), 10);\n if (month > 40) {\n year += 100;\n month -= 40;\n } else if (month > 20) {\n year -= 100;\n month -= 20;\n }\n\n if (!FormValidation.Helper.date(year, month, day)) {\n return false;\n }\n\n var sum = 0,\n weight = [2, 4, 8, 5, 10, 9, 7, 3, 6];\n for (var i = 0; i < 9; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = (sum % 11) % 10;\n return (sum + '' === value.substr(9, 1));\n },\n\n /**\n * Validate Brazilian national identification number (CPF)\n *\n * @see http://en.wikipedia.org/wiki/Cadastro_de_Pessoas_F%C3%ADsicas\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _br: function(value) {\n value = value.replace(/\\D/g, '');\n\n if (!/^\\d{11}$/.test(value) || /^1{11}|2{11}|3{11}|4{11}|5{11}|6{11}|7{11}|8{11}|9{11}|0{11}$/.test(value)) {\n return false;\n }\n\n var d1 = 0;\n for (var i = 0; i < 9; i++) {\n d1 += (10 - i) * parseInt(value.charAt(i), 10);\n }\n d1 = 11 - d1 % 11;\n if (d1 === 10 || d1 === 11) {\n d1 = 0;\n }\n if (d1 + '' !== value.charAt(9)) {\n return false;\n }\n\n var d2 = 0;\n for (i = 0; i < 10; i++) {\n d2 += (11 - i) * parseInt(value.charAt(i), 10);\n }\n d2 = 11 - d2 % 11;\n if (d2 === 10 || d2 === 11) {\n d2 = 0;\n }\n\n return (d2 + '' === value.charAt(10));\n },\n\n /**\n * Validate Swiss Social Security Number (AHV-Nr/No AVS)\n *\n * @see http://en.wikipedia.org/wiki/National_identification_number#Switzerland\n * @see http://www.bsv.admin.ch/themen/ahv/00011/02185/index.html?lang=de\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _ch: function(value) {\n if (!/^756[\\.]{0,1}[0-9]{4}[\\.]{0,1}[0-9]{4}[\\.]{0,1}[0-9]{2}$/.test(value)) {\n return false;\n }\n value = value.replace(/\\D/g, '').substr(3);\n var length = value.length,\n sum = 0,\n weight = (length === 8) ? [3, 1] : [1, 3];\n for (var i = 0; i < length - 1; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i % 2];\n }\n sum = 10 - sum % 10;\n return (sum + '' === value.charAt(length - 1));\n },\n\n /**\n * Validate Chilean national identification number (RUN/RUT)\n *\n * @see http://en.wikipedia.org/wiki/National_identification_number#Chile\n * @see https://palena.sii.cl/cvc/dte/ee_empresas_emisoras.html for samples\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _cl: function(value) {\n if (!/^\\d{7,8}[-]{0,1}[0-9K]$/i.test(value)) {\n return false;\n }\n value = value.replace(/\\-/g, '');\n while (value.length < 9) {\n value = '0' + value;\n }\n var sum = 0,\n weight = [3, 2, 7, 6, 5, 4, 3, 2];\n for (var i = 0; i < 8; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = 11 - sum % 11;\n if (sum === 11) {\n sum = 0;\n } else if (sum === 10) {\n sum = 'K';\n }\n return sum + '' === value.charAt(8).toUpperCase();\n },\n\n /**\n * Validate Chinese citizen identification number\n *\n * Rules:\n * - For current 18-digit system (since 1st Oct 1999, defined by GB11643—1999 national standard):\n * - Digit 0-5: Must be a valid administrative division code of China PR.\n * - Digit 6-13: Must be a valid YYYYMMDD date of birth. A future date is tolerated.\n * - Digit 14-16: Order code, any integer.\n * - Digit 17: An ISO 7064:1983, MOD 11-2 checksum.\n * Both upper/lower case of X are tolerated.\n * - For deprecated 15-digit system:\n * - Digit 0-5: Must be a valid administrative division code of China PR.\n * - Digit 6-11: Must be a valid YYMMDD date of birth, indicating the year of 19XX.\n * - Digit 12-14: Order code, any integer.\n * Lists of valid administrative division codes of China PR can be seen here:\n * \n * Published and maintained by National Bureau of Statistics of China PR.\n * NOTE: Current and deprecated codes MUST BOTH be considered valid.\n * Many Chinese citizens born in once existed administrative divisions!\n *\n * @see http://en.wikipedia.org/wiki/Resident_Identity_Card#Identity_card_number\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _cn: function(value) {\n // Basic format check (18 or 15 digits, considering X in checksum)\n value = value.trim();\n if (!/^\\d{15}$/.test(value) && !/^\\d{17}[\\dXx]{1}$/.test(value)) {\n return false;\n }\n\n // Check China PR Administrative division code\n var adminDivisionCodes = {\n 11: {\n 0: [0],\n 1: [[0, 9], [11, 17]],\n 2: [0, 28, 29]\n },\n 12: {\n 0: [0],\n 1: [[0, 16]],\n 2: [0, 21, 23, 25]\n },\n 13: {\n 0: [0],\n 1: [[0, 5], 7, 8, 21, [23, 33], [81, 85]],\n 2: [[0, 5], [7, 9], [23, 25], 27, 29, 30, 81, 83],\n 3: [[0, 4], [21, 24]],\n 4: [[0, 4], 6, 21, [23, 35], 81],\n 5: [[0, 3], [21, 35], 81, 82],\n 6: [[0, 4], [21, 38], [81, 84]],\n 7: [[0, 3], 5, 6, [21, 33]],\n 8: [[0, 4], [21, 28]],\n 9: [[0, 3], [21, 30], [81, 84]],\n 10: [[0, 3], [22, 26], 28, 81, 82],\n 11: [[0, 2], [21, 28], 81, 82]\n },\n 14: {\n 0: [0],\n 1: [0, 1, [5, 10], [21, 23], 81],\n 2: [[0, 3], 11, 12, [21, 27]],\n 3: [[0, 3], 11, 21, 22],\n 4: [[0, 2], 11, 21, [23, 31], 81],\n 5: [[0, 2], 21, 22, 24, 25, 81],\n 6: [[0, 3], [21, 24]],\n 7: [[0, 2], [21, 29], 81],\n 8: [[0, 2], [21, 30], 81, 82],\n 9: [[0, 2], [21, 32], 81],\n 10: [[0, 2], [21, 34], 81, 82],\n 11: [[0, 2], [21, 30], 81, 82],\n 23: [[0, 3], 22, 23, [25, 30], 32, 33]\n },\n 15: {\n 0: [0],\n 1: [[0, 5], [21, 25]],\n 2: [[0, 7], [21, 23]],\n 3: [[0, 4]],\n 4: [[0, 4], [21, 26], [28, 30]],\n 5: [[0, 2], [21, 26], 81],\n 6: [[0, 2], [21, 27]],\n 7: [[0, 3], [21, 27], [81, 85]],\n 8: [[0, 2], [21, 26]],\n 9: [[0, 2], [21, 29], 81],\n 22: [[0, 2], [21, 24]],\n 25: [[0, 2], [22, 31]],\n 26: [[0, 2], [24, 27], [29, 32], 34],\n 28: [0, 1, [22, 27]],\n 29: [0, [21, 23]]\n },\n 21: {\n 0: [0],\n 1: [[0, 6], [11, 14], [22, 24], 81],\n 2: [[0, 4], [11, 13], 24, [81, 83]],\n 3: [[0, 4], 11, 21, 23, 81],\n 4: [[0, 4], 11, [21, 23]],\n 5: [[0, 5], 21, 22],\n 6: [[0, 4], 24, 81, 82],\n 7: [[0, 3], 11, 26, 27, 81, 82],\n 8: [[0, 4], 11, 81, 82],\n 9: [[0, 5], 11, 21, 22],\n 10: [[0, 5], 11, 21, 81],\n 11: [[0, 3], 21, 22],\n 12: [[0, 2], 4, 21, 23, 24, 81, 82],\n 13: [[0, 3], 21, 22, 24, 81, 82],\n 14: [[0, 4], 21, 22, 81]\n },\n 22: {\n 0: [0],\n 1: [[0, 6], 12, 22, [81, 83]],\n 2: [[0, 4], 11, 21, [81, 84]],\n 3: [[0, 3], 22, 23, 81, 82],\n 4: [[0, 3], 21, 22],\n 5: [[0, 3], 21, 23, 24, 81, 82],\n 6: [[0, 2], 4, 5, [21, 23], 25, 81],\n 7: [[0, 2], [21, 24], 81],\n 8: [[0, 2], 21, 22, 81, 82],\n 24: [[0, 6], 24, 26]\n },\n 23: {\n 0: [0],\n 1: [[0, 12], 21, [23, 29], [81, 84]],\n 2: [[0, 8], 21, [23, 25], 27, [29, 31], 81],\n 3: [[0, 7], 21, 81, 82],\n 4: [[0, 7], 21, 22],\n 5: [[0, 3], 5, 6, [21, 24]],\n 6: [[0, 6], [21, 24]],\n 7: [[0, 16], 22, 81],\n 8: [[0, 5], 11, 22, 26, 28, 33, 81, 82],\n 9: [[0, 4], 21],\n 10: [[0, 5], 24, 25, 81, [83, 85]],\n 11: [[0, 2], 21, 23, 24, 81, 82],\n 12: [[0, 2], [21, 26], [81, 83]],\n 27: [[0, 4], [21, 23]]\n },\n 31: {\n 0: [0],\n 1: [0, 1, [3, 10], [12, 20]],\n 2: [0, 30]\n },\n 32: {\n 0: [0],\n 1: [[0, 7], 11, [13, 18], 24, 25],\n 2: [[0, 6], 11, 81, 82],\n 3: [[0, 5], 11, 12, [21, 24], 81, 82],\n 4: [[0, 2], 4, 5, 11, 12, 81, 82],\n 5: [[0, 9], [81, 85]],\n 6: [[0, 2], 11, 12, 21, 23, [81, 84]],\n 7: [0, 1, 3, 5, 6, [21, 24]],\n 8: [[0, 4], 11, 26, [29, 31]],\n 9: [[0, 3], [21, 25], 28, 81, 82],\n 10: [[0, 3], 11, 12, 23, 81, 84, 88],\n 11: [[0, 2], 11, 12, [81, 83]],\n 12: [[0, 4], [81, 84]],\n 13: [[0, 2], 11, [21, 24]]\n },\n 33: {\n 0: [0],\n 1: [[0, 6], [8, 10], 22, 27, 82, 83, 85],\n 2: [0, 1, [3, 6], 11, 12, 25, 26, [81, 83]],\n 3: [[0, 4], 22, 24, [26, 29], 81, 82],\n 4: [[0, 2], 11, 21, 24, [81, 83]],\n 5: [[0, 3], [21, 23]],\n 6: [[0, 2], 21, 24, [81, 83]],\n 7: [[0, 3], 23, 26, 27, [81, 84]],\n 8: [[0, 3], 22, 24, 25, 81],\n 9: [[0, 3], 21, 22],\n 10: [[0, 4], [21, 24], 81, 82],\n 11: [[0, 2], [21, 27], 81]\n },\n 34: {\n 0: [0],\n 1: [[0, 4], 11, [21, 24], 81],\n 2: [[0, 4], 7, 8, [21, 23], 25],\n 3: [[0, 4], 11, [21, 23]],\n 4: [[0, 6], 21],\n 5: [[0, 4], 6, [21, 23]],\n 6: [[0, 4], 21],\n 7: [[0, 3], 11, 21],\n 8: [[0, 3], 11, [22, 28], 81],\n 10: [[0, 4], [21, 24]],\n 11: [[0, 3], 22, [24, 26], 81, 82],\n 12: [[0, 4], 21, 22, 25, 26, 82],\n 13: [[0, 2], [21, 24]],\n 14: [[0, 2], [21, 24]],\n 15: [[0, 3], [21, 25]],\n 16: [[0, 2], [21, 23]],\n 17: [[0, 2], [21, 23]],\n 18: [[0, 2], [21, 25], 81]\n },\n 35: {\n 0: [0],\n 1: [[0, 5], 11, [21, 25], 28, 81, 82],\n 2: [[0, 6], [11, 13]],\n 3: [[0, 5], 22],\n 4: [[0, 3], 21, [23, 30], 81],\n 5: [[0, 5], 21, [24, 27], [81, 83]],\n 6: [[0, 3], [22, 29], 81],\n 7: [[0, 2], [21, 25], [81, 84]],\n 8: [[0, 2], [21, 25], 81],\n 9: [[0, 2], [21, 26], 81, 82]\n },\n 36: {\n 0: [0],\n 1: [[0, 5], 11, [21, 24]],\n 2: [[0, 3], 22, 81],\n 3: [[0, 2], 13, [21, 23]],\n 4: [[0, 3], 21, [23, 30], 81, 82],\n 5: [[0, 2], 21],\n 6: [[0, 2], 22, 81],\n 7: [[0, 2], [21, 35], 81, 82],\n 8: [[0, 3], [21, 30], 81],\n 9: [[0, 2], [21, 26], [81, 83]],\n 10: [[0, 2], [21, 30]],\n 11: [[0, 2], [21, 30], 81]\n },\n 37: {\n 0: [0],\n 1: [[0, 5], 12, 13, [24, 26], 81],\n 2: [[0, 3], 5, [11, 14], [81, 85]],\n 3: [[0, 6], [21, 23]],\n 4: [[0, 6], 81],\n 5: [[0, 3], [21, 23]],\n 6: [[0, 2], [11, 13], 34, [81, 87]],\n 7: [[0, 5], 24, 25, [81, 86]],\n 8: [[0, 2], 11, [26, 32], [81, 83]],\n 9: [[0, 3], 11, 21, 23, 82, 83],\n 10: [[0, 2], [81, 83]],\n 11: [[0, 3], 21, 22],\n 12: [[0, 3]],\n 13: [[0, 2], 11, 12, [21, 29]],\n 14: [[0, 2], [21, 28], 81, 82],\n 15: [[0, 2], [21, 26], 81],\n 16: [[0, 2], [21, 26]],\n 17: [[0, 2], [21, 28]]\n },\n 41: {\n 0: [0],\n 1: [[0, 6], 8, 22, [81, 85]],\n 2: [[0, 5], 11, [21, 25]],\n 3: [[0, 7], 11, [22, 29], 81],\n 4: [[0, 4], 11, [21, 23], 25, 81, 82],\n 5: [[0, 3], 5, 6, 22, 23, 26, 27, 81],\n 6: [[0, 3], 11, 21, 22],\n 7: [[0, 4], 11, 21, [24, 28], 81, 82],\n 8: [[0, 4], 11, [21, 23], 25, [81, 83]],\n 9: [[0, 2], 22, 23, [26, 28]],\n 10: [[0, 2], [23, 25], 81, 82],\n 11: [[0, 4], [21, 23]],\n 12: [[0, 2], 21, 22, 24, 81, 82],\n 13: [[0, 3], [21, 30], 81],\n 14: [[0, 3], [21, 26], 81],\n 15: [[0, 3], [21, 28]],\n 16: [[0, 2], [21, 28], 81],\n 17: [[0, 2], [21, 29]],\n 90: [0, 1]\n },\n 42: {\n 0: [0],\n 1: [[0, 7], [11, 17]],\n 2: [[0, 5], 22, 81],\n 3: [[0, 3], [21, 25], 81],\n 5: [[0, 6], [25, 29], [81, 83]],\n 6: [[0, 2], 6, 7, [24, 26], [82, 84]],\n 7: [[0, 4]],\n 8: [[0, 2], 4, 21, 22, 81],\n 9: [[0, 2], [21, 23], 81, 82, 84],\n 10: [[0, 3], [22, 24], 81, 83, 87],\n 11: [[0, 2], [21, 27], 81, 82],\n 12: [[0, 2], [21, 24], 81],\n 13: [[0, 3], 21, 81],\n 28: [[0, 2], 22, 23, [25, 28]],\n 90: [0, [4, 6], 21]\n },\n 43: {\n 0: [0],\n 1: [[0, 5], 11, 12, 21, 22, 24, 81],\n 2: [[0, 4], 11, 21, [23, 25], 81],\n 3: [[0, 2], 4, 21, 81, 82],\n 4: [0, 1, [5, 8], 12, [21, 24], 26, 81, 82],\n 5: [[0, 3], 11, [21, 25], [27, 29], 81],\n 6: [[0, 3], 11, 21, 23, 24, 26, 81, 82],\n 7: [[0, 3], [21, 26], 81],\n 8: [[0, 2], 11, 21, 22],\n 9: [[0, 3], [21, 23], 81],\n 10: [[0, 3], [21, 28], 81],\n 11: [[0, 3], [21, 29]],\n 12: [[0, 2], [21, 30], 81],\n 13: [[0, 2], 21, 22, 81, 82],\n 31: [0, 1, [22, 27], 30]\n },\n 44: {\n 0: [0],\n 1: [[0, 7], [11, 16], 83, 84],\n 2: [[0, 5], 21, 22, 24, 29, 32, 33, 81, 82],\n 3: [0, 1, [3, 8]],\n 4: [[0, 4]],\n 5: [0, 1, [6, 15], 23, 82, 83],\n 6: [0, 1, [4, 8]],\n 7: [0, 1, [3, 5], 81, [83, 85]],\n 8: [[0, 4], 11, 23, 25, [81, 83]],\n 9: [[0, 3], 23, [81, 83]],\n 12: [[0, 3], [23, 26], 83, 84],\n 13: [[0, 3], [22, 24], 81],\n 14: [[0, 2], [21, 24], 26, 27, 81],\n 15: [[0, 2], 21, 23, 81],\n 16: [[0, 2], [21, 25]],\n 17: [[0, 2], 21, 23, 81],\n 18: [[0, 3], 21, 23, [25, 27], 81, 82],\n 19: [0],\n 20: [0],\n 51: [[0, 3], 21, 22],\n 52: [[0, 3], 21, 22, 24, 81],\n 53: [[0, 2], [21, 23], 81]\n },\n 45: {\n 0: [0],\n 1: [[0, 9], [21, 27]],\n 2: [[0, 5], [21, 26]],\n 3: [[0, 5], 11, 12, [21, 32]],\n 4: [0, 1, [3, 6], 11, [21, 23], 81],\n 5: [[0, 3], 12, 21],\n 6: [[0, 3], 21, 81],\n 7: [[0, 3], 21, 22],\n 8: [[0, 4], 21, 81],\n 9: [[0, 3], [21, 24], 81],\n 10: [[0, 2], [21, 31]],\n 11: [[0, 2], [21, 23]],\n 12: [[0, 2], [21, 29], 81],\n 13: [[0, 2], [21, 24], 81],\n 14: [[0, 2], [21, 25], 81]\n },\n 46: {\n 0: [0],\n 1: [0, 1, [5, 8]],\n 2: [0, 1],\n 3: [0, [21, 23]],\n 90: [[0, 3], [5, 7], [21, 39]]\n },\n 50: {\n 0: [0],\n 1: [[0, 19]],\n 2: [0, [22, 38], [40, 43]],\n 3: [0, [81, 84]]\n },\n 51: {\n 0: [0],\n 1: [0, 1, [4, 8], [12, 15], [21, 24], 29, 31, 32, [81, 84]],\n 3: [[0, 4], 11, 21, 22],\n 4: [[0, 3], 11, 21, 22],\n 5: [[0, 4], 21, 22, 24, 25],\n 6: [0, 1, 3, 23, 26, [81, 83]],\n 7: [0, 1, 3, 4, [22, 27], 81],\n 8: [[0, 2], 11, 12, [21, 24]],\n 9: [[0, 4], [21, 23]],\n 10: [[0, 2], 11, 24, 25, 28],\n 11: [[0, 2], [11, 13], 23, 24, 26, 29, 32, 33, 81],\n 13: [[0, 4], [21, 25], 81],\n 14: [[0, 2], [21, 25]],\n 15: [[0, 3], [21, 29]],\n 16: [[0, 3], [21, 23], 81],\n 17: [[0, 3], [21, 25], 81],\n 18: [[0, 3], [21, 27]],\n 19: [[0, 3], [21, 23]],\n 20: [[0, 2], 21, 22, 81],\n 32: [0, [21, 33]],\n 33: [0, [21, 38]],\n 34: [0, 1, [22, 37]]\n },\n 52: {\n 0: [0],\n 1: [[0, 3], [11, 15], [21, 23], 81],\n 2: [0, 1, 3, 21, 22],\n 3: [[0, 3], [21, 30], 81, 82],\n 4: [[0, 2], [21, 25]],\n 5: [[0, 2], [21, 27]],\n 6: [[0, 3], [21, 28]],\n 22: [0, 1, [22, 30]],\n 23: [0, 1, [22, 28]],\n 24: [0, 1, [22, 28]],\n 26: [0, 1, [22, 36]],\n 27: [[0, 2], 22, 23, [25, 32]]\n },\n 53: {\n 0: [0],\n 1: [[0, 3], [11, 14], 21, 22, [24, 29], 81],\n 3: [[0, 2], [21, 26], 28, 81],\n 4: [[0, 2], [21, 28]],\n 5: [[0, 2], [21, 24]],\n 6: [[0, 2], [21, 30]],\n 7: [[0, 2], [21, 24]],\n 8: [[0, 2], [21, 29]],\n 9: [[0, 2], [21, 27]],\n 23: [0, 1, [22, 29], 31],\n 25: [[0, 4], [22, 32]],\n 26: [0, 1, [21, 28]],\n 27: [0, 1, [22, 30]], 28: [0, 1, 22, 23],\n 29: [0, 1, [22, 32]],\n 31: [0, 2, 3, [22, 24]],\n 34: [0, [21, 23]],\n 33: [0, 21, [23, 25]],\n 35: [0, [21, 28]]\n },\n 54: {\n 0: [0],\n 1: [[0, 2], [21, 27]],\n 21: [0, [21, 29], 32, 33],\n 22: [0, [21, 29], [31, 33]],\n 23: [0, 1, [22, 38]],\n 24: [0, [21, 31]],\n 25: [0, [21, 27]],\n 26: [0, [21, 27]]\n },\n 61: {\n 0: [0],\n 1: [[0, 4], [11, 16], 22, [24, 26]],\n 2: [[0, 4], 22],\n 3: [[0, 4], [21, 24], [26, 31]],\n 4: [[0, 4], [22, 31], 81],\n 5: [[0, 2], [21, 28], 81, 82],\n 6: [[0, 2], [21, 32]],\n 7: [[0, 2], [21, 30]],\n 8: [[0, 2], [21, 31]],\n 9: [[0, 2], [21, 29]],\n 10: [[0, 2], [21, 26]]\n },\n 62: {\n 0: [0],\n 1: [[0, 5], 11, [21, 23]],\n 2: [0, 1],\n 3: [[0, 2], 21],\n 4: [[0, 3], [21, 23]],\n 5: [[0, 3], [21, 25]],\n 6: [[0, 2], [21, 23]],\n 7: [[0, 2], [21, 25]],\n 8: [[0, 2], [21, 26]],\n 9: [[0, 2], [21, 24], 81, 82],\n 10: [[0, 2], [21, 27]],\n 11: [[0, 2], [21, 26]],\n 12: [[0, 2], [21, 28]],\n 24: [0, 21, [24, 29]],\n 26: [0, 21, [23, 30]],\n 29: [0, 1, [21, 27]],\n 30: [0, 1, [21, 27]]\n },\n 63: {\n 0: [0],\n 1: [[0, 5], [21, 23]],\n 2: [0, 2, [21, 25]],\n 21: [0, [21, 23], [26, 28]],\n 22: [0, [21, 24]],\n 23: [0, [21, 24]],\n 25: [0, [21, 25]],\n 26: [0, [21, 26]],\n 27: [0, 1, [21, 26]],\n 28: [[0, 2], [21, 23]]\n },\n 64: {\n 0: [0],\n 1: [0, 1, [4, 6], 21, 22, 81],\n 2: [[0, 3], 5, [21, 23]],\n 3: [[0, 3], [21, 24], 81],\n 4: [[0, 2], [21, 25]],\n 5: [[0, 2], 21, 22]\n },\n 65: {\n 0: [0],\n 1: [[0, 9], 21],\n 2: [[0, 5]],\n 21: [0, 1, 22, 23],\n 22: [0, 1, 22, 23],\n 23: [[0, 3], [23, 25], 27, 28],\n 28: [0, 1, [22, 29]],\n 29: [0, 1, [22, 29]],\n 30: [0, 1, [22, 24]], 31: [0, 1, [21, 31]],\n 32: [0, 1, [21, 27]],\n 40: [0, 2, 3, [21, 28]],\n 42: [[0, 2], 21, [23, 26]],\n 43: [0, 1, [21, 26]],\n 90: [[0, 4]], 27: [[0, 2], 22, 23]\n },\n 71: { 0: [0] },\n 81: { 0: [0] },\n 82: { 0: [0] }\n };\n\n var provincial = parseInt(value.substr(0, 2), 10),\n prefectural = parseInt(value.substr(2, 2), 10),\n county = parseInt(value.substr(4, 2), 10);\n\n if (!adminDivisionCodes[provincial] || !adminDivisionCodes[provincial][prefectural]) {\n return false;\n }\n var inRange = false,\n rangeDef = adminDivisionCodes[provincial][prefectural];\n for (var i = 0; i < rangeDef.length; i++) {\n if (($.isArray(rangeDef[i]) && rangeDef[i][0] <= county && county <= rangeDef[i][1])\n || (!$.isArray(rangeDef[i]) && county === rangeDef[i]))\n {\n inRange = true;\n break;\n }\n }\n\n if (!inRange) {\n return false;\n }\n\n // Check date of birth\n var dob;\n if (value.length === 18) {\n dob = value.substr(6, 8);\n } else /* length == 15 */ {\n dob = '19' + value.substr(6, 6);\n }\n var year = parseInt(dob.substr(0, 4), 10),\n month = parseInt(dob.substr(4, 2), 10),\n day = parseInt(dob.substr(6, 2), 10);\n if (!FormValidation.Helper.date(year, month, day)) {\n return false;\n }\n\n // Check checksum (18-digit system only)\n if (value.length === 18) {\n var sum = 0,\n weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n for (i = 0; i < 17; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = (12 - (sum % 11)) % 11;\n var checksum = (value.charAt(17).toUpperCase() !== 'X') ? parseInt(value.charAt(17), 10) : 10;\n return checksum === sum;\n }\n\n return true;\n },\n\n /**\n * Validate Czech national identification number (RC)\n *\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _cz: function(value) {\n if (!/^\\d{9,10}$/.test(value)) {\n return false;\n }\n var year = 1900 + parseInt(value.substr(0, 2), 10),\n month = parseInt(value.substr(2, 2), 10) % 50 % 20,\n day = parseInt(value.substr(4, 2), 10);\n if (value.length === 9) {\n if (year >= 1980) {\n year -= 100;\n }\n if (year > 1953) {\n return false;\n }\n } else if (year < 1954) {\n year += 100;\n }\n\n if (!FormValidation.Helper.date(year, month, day)) {\n return false;\n }\n\n // Check that the birth date is not in the future\n if (value.length === 10) {\n var check = parseInt(value.substr(0, 9), 10) % 11;\n if (year < 1985) {\n check = check % 10;\n }\n return (check + '' === value.substr(9, 1));\n }\n\n return true;\n },\n\n /**\n * Validate Danish Personal Identification number (CPR)\n *\n * @see https://en.wikipedia.org/wiki/Personal_identification_number_(Denmark)\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _dk: function(value) {\n if (!/^[0-9]{6}[-]{0,1}[0-9]{4}$/.test(value)) {\n return false;\n }\n value = value.replace(/-/g, '');\n var day = parseInt(value.substr(0, 2), 10),\n month = parseInt(value.substr(2, 2), 10),\n year = parseInt(value.substr(4, 2), 10);\n\n switch (true) {\n case ('5678'.indexOf(value.charAt(6)) !== -1 && year >= 58):\n year += 1800;\n break;\n case ('0123'.indexOf(value.charAt(6)) !== -1):\n case ('49'.indexOf(value.charAt(6)) !== -1 && year >= 37):\n year += 1900;\n break;\n default:\n year += 2000;\n break;\n }\n\n return FormValidation.Helper.date(year, month, day);\n },\n\n /**\n * Validate Estonian Personal Identification Code (isikukood)\n *\n * @see http://et.wikipedia.org/wiki/Isikukood\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _ee: function(value) {\n // Use the same format as Lithuanian Personal Code\n return this._lt(value);\n },\n\n /**\n * Validate Spanish personal identity code (DNI)\n * Support DNI (for Spanish citizens), NIE (for foreign people) and CIF (for legal entities)\n *\n * @see https://en.wikipedia.org/wiki/National_identification_number#Spain\n * @param {String} value The ID\n * @returns {Boolean|Object}\n */\n _es: function(value) {\n var isDNI = /^[0-9]{8}[-]{0,1}[A-HJ-NP-TV-Z]$/.test(value),\n isNIE = /^[XYZ][-]{0,1}[0-9]{7}[-]{0,1}[A-HJ-NP-TV-Z]$/.test(value),\n isCIF = /^[A-HNPQS][-]{0,1}[0-9]{7}[-]{0,1}[0-9A-J]$/.test(value);\n if (!isDNI && !isNIE && !isCIF) {\n return false;\n }\n\n value = value.replace(/-/g, '');\n var check, type, isValid = true;\n if (isDNI || isNIE) {\n type = 'DNI';\n var index = 'XYZ'.indexOf(value.charAt(0));\n if (index !== -1) {\n // It is NIE number\n value = index + value.substr(1) + '';\n type = 'NIE';\n }\n\n check = parseInt(value.substr(0, 8), 10);\n check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];\n return {\n valid: (check === value.substr(8, 1)),\n type: type\n };\n } else {\n check = value.substr(1, 7);\n type = 'CIF';\n var letter = value[0],\n control = value.substr(-1),\n sum = 0;\n\n // The digits in the even positions are added to the sum directly.\n // The ones in the odd positions are multiplied by 2 and then added to the sum.\n // If the result of multiplying by 2 is 10 or higher, add the two digits\n // together and add that to the sum instead\n for (var i = 0; i < check.length; i++) {\n if (i % 2 !== 0) {\n sum += parseInt(check[i], 10);\n } else {\n var tmp = '' + (parseInt(check[i], 10) * 2);\n sum += parseInt(tmp[0], 10);\n if (tmp.length === 2) {\n sum += parseInt(tmp[1], 10);\n }\n }\n }\n\n // The control digit is calculated from the last digit of the sum.\n // If that last digit is not 0, subtract it from 10\n var lastDigit = sum - (Math.floor(sum / 10) * 10);\n if (lastDigit !== 0) {\n lastDigit = 10 - lastDigit;\n }\n\n if ('KQS'.indexOf(letter) !== -1) {\n // If the CIF starts with a K, Q or S, the control digit must be a letter\n isValid = (control === 'JABCDEFGHI'[lastDigit]);\n } else if ('ABEH'.indexOf(letter) !== -1) {\n // If it starts with A, B, E or H, it has to be a number\n isValid = (control === ('' + lastDigit));\n } else {\n // In any other case, it doesn't matter\n isValid = (control === ('' + lastDigit) || control === 'JABCDEFGHI'[lastDigit]);\n }\n\n return {\n valid: isValid,\n type: type\n };\n }\n },\n\n /**\n * Validate Finnish Personal Identity Code (HETU)\n *\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _fi: function(value) {\n if (!/^[0-9]{6}[-+A][0-9]{3}[0-9ABCDEFHJKLMNPRSTUVWXY]$/.test(value)) {\n return false;\n }\n var day = parseInt(value.substr(0, 2), 10),\n month = parseInt(value.substr(2, 2), 10),\n year = parseInt(value.substr(4, 2), 10),\n centuries = {\n '+': 1800,\n '-': 1900,\n 'A': 2000\n };\n year = centuries[value.charAt(6)] + year;\n\n if (!FormValidation.Helper.date(year, month, day)) {\n return false;\n }\n\n var individual = parseInt(value.substr(7, 3), 10);\n if (individual < 2) {\n return false;\n }\n var n = value.substr(0, 6) + value.substr(7, 3) + '';\n n = parseInt(n, 10);\n return '0123456789ABCDEFHJKLMNPRSTUVWXY'.charAt(n % 31) === value.charAt(10);\n },\n\n /**\n * Validate Croatian personal identification number (OIB)\n *\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _hr: function(value) {\n if (!/^[0-9]{11}$/.test(value)) {\n return false;\n }\n return FormValidation.Helper.mod11And10(value);\n },\n\n /**\n * Validate Irish Personal Public Service Number (PPS)\n *\n * @see https://en.wikipedia.org/wiki/Personal_Public_Service_Number\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _ie: function(value) {\n if (!/^\\d{7}[A-W][AHWTX]?$/.test(value)) {\n return false;\n }\n\n var getCheckDigit = function(value) {\n while (value.length < 7) {\n value = '0' + value;\n }\n var alphabet = 'WABCDEFGHIJKLMNOPQRSTUV',\n sum = 0;\n for (var i = 0; i < 7; i++) {\n sum += parseInt(value.charAt(i), 10) * (8 - i);\n }\n sum += 9 * alphabet.indexOf(value.substr(7));\n return alphabet[sum % 23];\n };\n\n // 2013 format\n if (value.length === 9 && ('A' === value.charAt(8) || 'H' === value.charAt(8))) {\n return value.charAt(7) === getCheckDigit(value.substr(0, 7) + value.substr(8) + '');\n }\n // The old format\n else {\n return value.charAt(7) === getCheckDigit(value.substr(0, 7));\n }\n },\n\n /**\n * Validate Iceland national identification number (Kennitala)\n *\n * @see http://en.wikipedia.org/wiki/Kennitala\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _is: function(value) {\n if (!/^[0-9]{6}[-]{0,1}[0-9]{4}$/.test(value)) {\n return false;\n }\n value = value.replace(/-/g, '');\n var day = parseInt(value.substr(0, 2), 10),\n month = parseInt(value.substr(2, 2), 10),\n year = parseInt(value.substr(4, 2), 10),\n century = parseInt(value.charAt(9), 10);\n\n year = (century === 9) ? (1900 + year) : ((20 + century) * 100 + year);\n if (!FormValidation.Helper.date(year, month, day, true)) {\n return false;\n }\n // Validate the check digit\n var sum = 0,\n weight = [3, 2, 7, 6, 5, 4, 3, 2];\n for (var i = 0; i < 8; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = 11 - sum % 11;\n return (sum + '' === value.charAt(8));\n },\n\n /**\n * Validate Lithuanian Personal Code (Asmens kodas)\n *\n * @see http://en.wikipedia.org/wiki/National_identification_number#Lithuania\n * @see http://www.adomas.org/midi2007/pcode.html\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _lt: function(value) {\n if (!/^[0-9]{11}$/.test(value)) {\n return false;\n }\n var gender = parseInt(value.charAt(0), 10),\n year = parseInt(value.substr(1, 2), 10),\n month = parseInt(value.substr(3, 2), 10),\n day = parseInt(value.substr(5, 2), 10),\n century = (gender % 2 === 0) ? (17 + gender / 2) : (17 + (gender + 1) / 2);\n year = century * 100 + year;\n if (!FormValidation.Helper.date(year, month, day, true)) {\n return false;\n }\n\n // Validate the check digit\n var sum = 0,\n weight = [1, 2, 3, 4, 5, 6, 7, 8, 9, 1];\n for (var i = 0; i < 10; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = sum % 11;\n if (sum !== 10) {\n return sum + '' === value.charAt(10);\n }\n\n // Re-calculate the check digit\n sum = 0;\n weight = [3, 4, 5, 6, 7, 8, 9, 1, 2, 3];\n for (i = 0; i < 10; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = sum % 11;\n if (sum === 10) {\n sum = 0;\n }\n return (sum + '' === value.charAt(10));\n },\n\n /**\n * Validate Latvian Personal Code (Personas kods)\n *\n * @see http://laacz.lv/2006/11/25/pk-parbaudes-algoritms/\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _lv: function(value) {\n if (!/^[0-9]{6}[-]{0,1}[0-9]{5}$/.test(value)) {\n return false;\n }\n value = value.replace(/\\D/g, '');\n // Check birth date\n var day = parseInt(value.substr(0, 2), 10),\n month = parseInt(value.substr(2, 2), 10),\n year = parseInt(value.substr(4, 2), 10);\n year = year + 1800 + parseInt(value.charAt(6), 10) * 100;\n\n if (!FormValidation.Helper.date(year, month, day, true)) {\n return false;\n }\n\n // Check personal code\n var sum = 0,\n weight = [10, 5, 8, 4, 2, 1, 6, 3, 7, 9];\n for (var i = 0; i < 10; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = (sum + 1) % 11 % 10;\n return (sum + '' === value.charAt(10));\n },\n\n /**\n * Validate Dutch national identification number (BSN)\n *\n * @see https://nl.wikipedia.org/wiki/Burgerservicenummer\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _nl: function(value) {\n if (value.length < 8) {\n return false;\n }\n\n if (value.length === 8) {\n value = '0' + value;\n }\n if (!/^[0-9]{4}[.]{0,1}[0-9]{2}[.]{0,1}[0-9]{3}$/.test(value)) {\n return false;\n }\n value = value.replace(/\\./g, '');\n if (parseInt(value, 10) === 0) {\n return false;\n }\n var sum = 0,\n length = value.length;\n for (var i = 0; i < length - 1; i++) {\n sum += (9 - i) * parseInt(value.charAt(i), 10);\n }\n sum = sum % 11;\n if (sum === 10) {\n sum = 0;\n }\n return (sum + '' === value.charAt(length - 1));\n },\n\n /**\n * Validate Poland citizen number (PESEL)\n *\n * @see http://en.wikipedia.org/wiki/National_identification_number#Poland\n * @see http://en.wikipedia.org/wiki/PESEL\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _pl: function(value) {\n if (!/^[0-9]{11}$/.test(value)) {\n return false;\n }\n\n var sum = 0,\n length = value.length,\n weight = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3, 7];\n\n for (var i = 0; i < length - 1; i++) {\n sum += weight[i] * parseInt(value.charAt(i), 10);\n }\n sum = sum % 10;\n if (sum === 0) {\n sum = 10;\n }\n sum = 10 - sum;\n\n return (sum + '' === value.charAt(length - 1));\n },\n\n /**\n * Validate Romanian numerical personal code (CNP)\n *\n * @see http://en.wikipedia.org/wiki/National_identification_number#Romania\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _ro: function(value) {\n if (!/^[0-9]{13}$/.test(value)) {\n return false;\n }\n var gender = parseInt(value.charAt(0), 10);\n if (gender === 0 || gender === 7 || gender === 8) {\n return false;\n }\n\n // Determine the date of birth\n var year = parseInt(value.substr(1, 2), 10),\n month = parseInt(value.substr(3, 2), 10),\n day = parseInt(value.substr(5, 2), 10),\n // The year of date is determined base on the gender\n centuries = {\n '1': 1900, // Male born between 1900 and 1999\n '2': 1900, // Female born between 1900 and 1999\n '3': 1800, // Male born between 1800 and 1899\n '4': 1800, // Female born between 1800 and 1899\n '5': 2000, // Male born after 2000\n '6': 2000 // Female born after 2000\n };\n if (day > 31 && month > 12) {\n return false;\n }\n if (gender !== 9) {\n year = centuries[gender + ''] + year;\n if (!FormValidation.Helper.date(year, month, day)) {\n return false;\n }\n }\n\n // Validate the check digit\n var sum = 0,\n weight = [2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9],\n length = value.length;\n for (var i = 0; i < length - 1; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = sum % 11;\n if (sum === 10) {\n sum = 1;\n }\n return (sum + '' === value.charAt(length - 1));\n },\n\n /**\n * Validate Swedish personal identity number (personnummer)\n *\n * @see http://en.wikipedia.org/wiki/Personal_identity_number_(Sweden)\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _se: function(value) {\n if (!/^[0-9]{10}$/.test(value) && !/^[0-9]{6}[-|+][0-9]{4}$/.test(value)) {\n return false;\n }\n value = value.replace(/[^0-9]/g, '');\n\n var year = parseInt(value.substr(0, 2), 10) + 1900,\n month = parseInt(value.substr(2, 2), 10),\n day = parseInt(value.substr(4, 2), 10);\n if (!FormValidation.Helper.date(year, month, day)) {\n return false;\n }\n\n // Validate the last check digit\n return FormValidation.Helper.luhn(value);\n },\n\n /**\n * Validate Slovak national identifier number (RC)\n *\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _sk: function(value) {\n // Slovakia uses the same format as Czech Republic\n return this._cz(value);\n },\n\n /**\n * Validate San Marino citizen number\n *\n * @see http://en.wikipedia.org/wiki/National_identification_number#San_Marino\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _sm: function(value) {\n return /^\\d{5}$/.test(value);\n },\n\n /**\n * Validate Thailand citizen number\n *\n * @see http://en.wikipedia.org/wiki/National_identification_number#Thailand\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _th: function(value) {\n if (value.length !== 13) {\n return false;\n }\n\n var sum = 0;\n for (var i = 0; i < 12; i++) {\n sum += parseInt(value.charAt(i), 10) * (13 - i);\n }\n\n return (11 - sum % 11) % 10 === parseInt(value.charAt(12), 10);\n },\n\n /**\n * Validate South African ID\n *\n * @see http://en.wikipedia.org/wiki/National_identification_number#South_Africa\n * @param {String} value The ID\n * @returns {Boolean}\n */\n _za: function(value) {\n if (!/^[0-9]{10}[0|1][8|9][0-9]$/.test(value)) {\n return false;\n }\n var year = parseInt(value.substr(0, 2), 10),\n currentYear = new Date().getFullYear() % 100,\n month = parseInt(value.substr(2, 2), 10),\n day = parseInt(value.substr(4, 2), 10);\n year = (year >= currentYear) ? (year + 1900) : (year + 2000);\n\n if (!FormValidation.Helper.date(year, month, day)) {\n return false;\n }\n\n // Validate the last check digit\n return FormValidation.Helper.luhn(value);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n identical: {\n 'default': 'Please enter the same value'\n }\n }\n });\n\n FormValidation.Validator.identical = {\n html5Attributes: {\n message: 'message',\n field: 'field'\n },\n\n /**\n * Bind the validator on the live change of the field to compare with current one\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consists of the following key:\n * - field: The name of field that will be used to compare with current one\n */\n init: function(validator, $field, options, validatorName) {\n var compareWith = validator.getFieldElements(options.field);\n validator.onLiveChange(compareWith, 'live_' + validatorName, function() {\n var status = validator.getStatus($field, validatorName);\n if (status !== validator.STATUS_NOT_VALIDATED) {\n validator.revalidateField($field);\n }\n });\n },\n\n /**\n * Unbind the validator on the live change of the field to compare with current one\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consists of the following key:\n * - field: The name of field that will be used to compare with current one\n */\n destroy: function(validator, $field, options, validatorName) {\n var compareWith = validator.getFieldElements(options.field);\n validator.offLiveChange(compareWith, 'live_' + validatorName);\n },\n\n /**\n * Check if input value equals to value of particular one\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consists of the following key:\n * - field: The name of field that will be used to compare with current one\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName),\n compareWith = validator.getFieldElements(options.field);\n if (compareWith === null || compareWith.length === 0) {\n return true;\n }\n\n var compareValue = validator.getFieldValue(compareWith, validatorName);\n if (value === compareValue) {\n validator.updateStatus(compareWith, validator.STATUS_VALID, validatorName);\n return true;\n }\n\n return false;\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n imei: {\n 'default': 'Please enter a valid IMEI number'\n }\n }\n });\n\n FormValidation.Validator.imei = {\n /**\n * Validate IMEI (International Mobile Station Equipment Identity)\n *\n * @see http://en.wikipedia.org/wiki/International_Mobile_Station_Equipment_Identity\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n switch (true) {\n case /^\\d{15}$/.test(value):\n case /^\\d{2}-\\d{6}-\\d{6}-\\d{1}$/.test(value):\n case /^\\d{2}\\s\\d{6}\\s\\d{6}\\s\\d{1}$/.test(value):\n value = value.replace(/[^0-9]/g, '');\n return FormValidation.Helper.luhn(value);\n\n case /^\\d{14}$/.test(value):\n case /^\\d{16}$/.test(value):\n case /^\\d{2}-\\d{6}-\\d{6}(|-\\d{2})$/.test(value):\n case /^\\d{2}\\s\\d{6}\\s\\d{6}(|\\s\\d{2})$/.test(value):\n return true;\n\n default:\n return false;\n }\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n imo: {\n 'default': 'Please enter a valid IMO number'\n }\n }\n });\n\n FormValidation.Validator.imo = {\n /**\n * Validate IMO (International Maritime Organization)\n *\n * @see http://en.wikipedia.org/wiki/IMO_Number\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n if (!/^IMO \\d{7}$/i.test(value)) {\n return false;\n }\n\n // Grab just the digits\n var sum = 0,\n digits = value.replace(/^.*(\\d{7})$/, '$1');\n for (var i = 6; i >= 1; i--) {\n sum += (digits.slice((6 - i), -i) * (i + 1));\n }\n\n return sum % 10 === parseInt(digits.charAt(6), 10);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n integer: {\n 'default': 'Please enter a valid number'\n }\n }\n });\n\n FormValidation.Validator.integer = {\n html5Attributes: {\n message: 'message',\n thousandsseparator: 'thousandsSeparator',\n decimalseparator: 'decimalSeparator'\n },\n\n enableByHtml5: function($field) {\n return ('number' === $field.attr('type')) && ($field.attr('step') === undefined || $field.attr('step') % 1 === 0);\n },\n\n /**\n * Return true if the input value is an integer\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following key:\n * - message: The invalid message\n * - thousandsSeparator: The thousands separator. It's empty by default\n * - decimalSeparator: The decimal separator. It's '.' by default\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n if (this.enableByHtml5($field) && $field.get(0).validity && $field.get(0).validity.badInput === true) {\n return false;\n }\n\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n var decimalSeparator = options.decimalSeparator || '.',\n thousandsSeparator = options.thousandsSeparator || '';\n decimalSeparator = (decimalSeparator === '.') ? '\\\\.' : decimalSeparator;\n thousandsSeparator = (thousandsSeparator === '.') ? '\\\\.' : thousandsSeparator;\n\n var testRegexp = new RegExp('^-?[0-9]{1,3}(' + thousandsSeparator + '[0-9]{3})*(' + decimalSeparator + '[0-9]+)?$'),\n thousandsReplacer = new RegExp(thousandsSeparator, 'g');\n\n if (!testRegexp.test(value)) {\n return false;\n }\n\n // Replace thousands separator with blank\n if (thousandsSeparator) {\n value = value.replace(thousandsReplacer, '');\n }\n // Replace decimal separator with a dot\n if (decimalSeparator) {\n value = value.replace(decimalSeparator, '.');\n }\n\n if (isNaN(value) || !isFinite(value)) {\n return false;\n }\n // TODO: Use Number.isInteger() if available\n value = parseFloat(value);\n return Math.floor(value) === value;\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n ip: {\n 'default': 'Please enter a valid IP address',\n ipv4: 'Please enter a valid IPv4 address',\n ipv6: 'Please enter a valid IPv6 address'\n }\n }\n });\n\n FormValidation.Validator.ip = {\n html5Attributes: {\n message: 'message',\n ipv4: 'ipv4',\n ipv6: 'ipv6'\n },\n\n /**\n * Return true if the input value is a IP address.\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - ipv4: Enable IPv4 validator, default to true\n * - ipv6: Enable IPv6 validator, default to true\n * - message: The invalid message\n * @returns {Boolean|Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n options = $.extend({}, { ipv4: true, ipv6: true }, options);\n\n var locale = validator.getLocale(),\n ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,\n ipv6Regex = /^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/,\n valid = false,\n message;\n\n switch (true) {\n case (options.ipv4 && !options.ipv6):\n valid = ipv4Regex.test(value);\n message = options.message || FormValidation.I18n[locale].ip.ipv4;\n break;\n\n case (!options.ipv4 && options.ipv6):\n valid = ipv6Regex.test(value);\n message = options.message || FormValidation.I18n[locale].ip.ipv6;\n break;\n\n case (options.ipv4 && options.ipv6):\n /* falls through */\n default:\n valid = ipv4Regex.test(value) || ipv6Regex.test(value);\n message = options.message || FormValidation.I18n[locale].ip['default'];\n break;\n }\n\n return {\n valid: valid,\n message: message\n };\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n isbn: {\n 'default': 'Please enter a valid ISBN number'\n }\n }\n });\n\n FormValidation.Validator.isbn = {\n /**\n * Return true if the input value is a valid ISBN 10 or ISBN 13 number\n *\n * @see http://en.wikipedia.org/wiki/International_Standard_Book_Number\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} [options] Can consist of the following keys:\n * - message: The invalid message\n * @returns {Boolean|Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n // http://en.wikipedia.org/wiki/International_Standard_Book_Number#Overview\n // Groups are separated by a hyphen or a space\n var type;\n switch (true) {\n case /^\\d{9}[\\dX]$/.test(value):\n case (value.length === 13 && /^(\\d+)-(\\d+)-(\\d+)-([\\dX])$/.test(value)):\n case (value.length === 13 && /^(\\d+)\\s(\\d+)\\s(\\d+)\\s([\\dX])$/.test(value)):\n type = 'ISBN10';\n break;\n case /^(978|979)\\d{9}[\\dX]$/.test(value):\n case (value.length === 17 && /^(978|979)-(\\d+)-(\\d+)-(\\d+)-([\\dX])$/.test(value)):\n case (value.length === 17 && /^(978|979)\\s(\\d+)\\s(\\d+)\\s(\\d+)\\s([\\dX])$/.test(value)):\n type = 'ISBN13';\n break;\n default:\n return false;\n }\n\n // Replace all special characters except digits and X\n value = value.replace(/[^0-9X]/gi, '');\n var chars = value.split(''),\n length = chars.length,\n sum = 0,\n i,\n checksum;\n\n switch (type) {\n case 'ISBN10':\n sum = 0;\n for (i = 0; i < length - 1; i++) {\n sum += parseInt(chars[i], 10) * (10 - i);\n }\n checksum = 11 - (sum % 11);\n if (checksum === 11) {\n checksum = 0;\n } else if (checksum === 10) {\n checksum = 'X';\n }\n return {\n type: type,\n valid: (checksum + '' === chars[length - 1])\n };\n\n case 'ISBN13':\n sum = 0;\n for (i = 0; i < length - 1; i++) {\n sum += ((i % 2 === 0) ? parseInt(chars[i], 10) : (parseInt(chars[i], 10) * 3));\n }\n checksum = 10 - (sum % 10);\n if (checksum === 10) {\n checksum = '0';\n }\n return {\n type: type,\n valid: (checksum + '' === chars[length - 1])\n };\n\n default:\n return false;\n }\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n isin: {\n 'default': 'Please enter a valid ISIN number'\n }\n }\n });\n\n FormValidation.Validator.isin = {\n // Available country codes\n // See http://isin.net/country-codes/\n COUNTRY_CODES: 'AF|AX|AL|DZ|AS|AD|AO|AI|AQ|AG|AR|AM|AW|AU|AT|AZ|BS|BH|BD|BB|BY|BE|BZ|BJ|BM|BT|BO|BQ|BA|BW|BV|BR|IO|BN|BG|BF|BI|KH|CM|CA|CV|KY|CF|TD|CL|CN|CX|CC|CO|KM|CG|CD|CK|CR|CI|HR|CU|CW|CY|CZ|DK|DJ|DM|DO|EC|EG|SV|GQ|ER|EE|ET|FK|FO|FJ|FI|FR|GF|PF|TF|GA|GM|GE|DE|GH|GI|GR|GL|GD|GP|GU|GT|GG|GN|GW|GY|HT|HM|VA|HN|HK|HU|IS|IN|ID|IR|IQ|IE|IM|IL|IT|JM|JP|JE|JO|KZ|KE|KI|KP|KR|KW|KG|LA|LV|LB|LS|LR|LY|LI|LT|LU|MO|MK|MG|MW|MY|MV|ML|MT|MH|MQ|MR|MU|YT|MX|FM|MD|MC|MN|ME|MS|MA|MZ|MM|NA|NR|NP|NL|NC|NZ|NI|NE|NG|NU|NF|MP|NO|OM|PK|PW|PS|PA|PG|PY|PE|PH|PN|PL|PT|PR|QA|RE|RO|RU|RW|BL|SH|KN|LC|MF|PM|VC|WS|SM|ST|SA|SN|RS|SC|SL|SG|SX|SK|SI|SB|SO|ZA|GS|SS|ES|LK|SD|SR|SJ|SZ|SE|CH|SY|TW|TJ|TZ|TH|TL|TG|TK|TO|TT|TN|TR|TM|TC|TV|UG|UA|AE|GB|US|UM|UY|UZ|VU|VE|VN|VG|VI|WF|EH|YE|ZM|ZW',\n\n /**\n * Validate an ISIN (International Securities Identification Number)\n *\n * @see http://en.wikipedia.org/wiki/International_Securities_Identifying_Number\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n value = value.toUpperCase();\n var regex = new RegExp('^(' + this.COUNTRY_CODES + ')[0-9A-Z]{10}$');\n if (!regex.test(value)) {\n return false;\n }\n\n var converted = '',\n length = value.length;\n // Convert letters to number\n for (var i = 0; i < length - 1; i++) {\n var c = value.charCodeAt(i);\n converted += ((c > 57) ? (c - 55).toString() : value.charAt(i));\n }\n\n var digits = '',\n n = converted.length,\n group = (n % 2 !== 0) ? 0 : 1;\n for (i = 0; i < n; i++) {\n digits += (parseInt(converted[i], 10) * ((i % 2) === group ? 2 : 1) + '');\n }\n\n var sum = 0;\n for (i = 0; i < digits.length; i++) {\n sum += parseInt(digits.charAt(i), 10);\n }\n sum = (10 - (sum % 10)) % 10;\n return sum + '' === value.charAt(length - 1);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n ismn: {\n 'default': 'Please enter a valid ISMN number'\n }\n }\n });\n\n FormValidation.Validator.ismn = {\n /**\n * Validate ISMN (International Standard Music Number)\n *\n * @see http://en.wikipedia.org/wiki/International_Standard_Music_Number\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * @returns {Boolean|Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n // Groups are separated by a hyphen or a space\n var type;\n switch (true) {\n case /^M\\d{9}$/.test(value):\n case /^M-\\d{4}-\\d{4}-\\d{1}$/.test(value):\n case /^M\\s\\d{4}\\s\\d{4}\\s\\d{1}$/.test(value):\n type = 'ISMN10';\n break;\n case /^9790\\d{9}$/.test(value):\n case /^979-0-\\d{4}-\\d{4}-\\d{1}$/.test(value):\n case /^979\\s0\\s\\d{4}\\s\\d{4}\\s\\d{1}$/.test(value):\n type = 'ISMN13';\n break;\n default:\n return false;\n }\n\n if ('ISMN10' === type) {\n value = '9790' + value.substr(1);\n }\n\n // Replace all special characters except digits\n value = value.replace(/[^0-9]/gi, '');\n var length = value.length,\n sum = 0,\n weight = [1, 3];\n for (var i = 0; i < length - 1; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i % 2];\n }\n sum = 10 - sum % 10;\n return {\n type: type,\n valid: (sum + '' === value.charAt(length - 1))\n };\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n issn: {\n 'default': 'Please enter a valid ISSN number'\n }\n }\n });\n\n FormValidation.Validator.issn = {\n /**\n * Validate ISSN (International Standard Serial Number)\n *\n * @see http://en.wikipedia.org/wiki/International_Standard_Serial_Number\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n // Groups are separated by a hyphen or a space\n if (!/^\\d{4}\\-\\d{3}[\\dX]$/.test(value)) {\n return false;\n }\n\n // Replace all special characters except digits and X\n value = value.replace(/[^0-9X]/gi, '');\n var chars = value.split(''),\n length = chars.length,\n sum = 0;\n\n if (chars[7] === 'X') {\n chars[7] = 10;\n }\n for (var i = 0; i < length; i++) {\n sum += parseInt(chars[i], 10) * (8 - i);\n }\n return (sum % 11 === 0);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n lessThan: {\n 'default': 'Please enter a value less than or equal to %s',\n notInclusive: 'Please enter a value less than %s'\n }\n }\n });\n\n FormValidation.Validator.lessThan = {\n html5Attributes: {\n message: 'message',\n value: 'value',\n inclusive: 'inclusive'\n },\n\n enableByHtml5: function($field) {\n var type = $field.attr('type'),\n max = $field.attr('max');\n if (max && type !== 'date') {\n return {\n value: max\n };\n }\n\n return false;\n },\n\n /**\n * Return true if the input value is less than or equal to given number\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - value: The number used to compare to. It can be\n * - A number\n * - Name of field which its value defines the number\n * - Name of callback function that returns the number\n * - A callback function that returns the number\n *\n * - inclusive [optional]: Can be true or false. Default is true\n * - message: The invalid message\n * @returns {Boolean|Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n\t\t\tvalue = this._format(value);\n\n var locale = validator.getLocale(),\n compareTo = $.isNumeric(options.value) ? options.value : validator.getDynamicOption($field, options.value),\n compareToValue = this._format(compareTo);\n\n return (options.inclusive === true || options.inclusive === undefined)\n ? {\n valid: $.isNumeric(value) && parseFloat(value) <= compareToValue,\n message: FormValidation.Helper.format(options.message || FormValidation.I18n[locale].lessThan['default'], compareTo)\n }\n : {\n valid: $.isNumeric(value) && parseFloat(value) < compareToValue,\n message: FormValidation.Helper.format(options.message || FormValidation.I18n[locale].lessThan.notInclusive, compareTo)\n };\n },\n\n _format: function(value) {\n return (value + '').replace(',', '.');\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n mac: {\n 'default': 'Please enter a valid MAC address'\n }\n }\n });\n\n FormValidation.Validator.mac = {\n /**\n * Return true if the input value is a MAC address.\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n return /^([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$/.test(value);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n meid: {\n 'default': 'Please enter a valid MEID number'\n }\n }\n });\n\n FormValidation.Validator.meid = {\n /**\n * Validate MEID (Mobile Equipment Identifier)\n *\n * @see http://en.wikipedia.org/wiki/Mobile_equipment_identifier\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n switch (true) {\n // 14 digit hex representation (no check digit)\n case /^[0-9A-F]{15}$/i.test(value):\n // 14 digit hex representation + dashes or spaces (no check digit)\n case /^[0-9A-F]{2}[- ][0-9A-F]{6}[- ][0-9A-F]{6}[- ][0-9A-F]$/i.test(value):\n // 18 digit decimal representation (no check digit)\n case /^\\d{19}$/.test(value):\n // 18 digit decimal representation + dashes or spaces (no check digit)\n case /^\\d{5}[- ]\\d{5}[- ]\\d{4}[- ]\\d{4}[- ]\\d$/.test(value):\n // Grab the check digit\n var cd = value.charAt(value.length - 1);\n\n // Strip any non-hex chars\n value = value.replace(/[- ]/g, '');\n\n // If it's all digits, luhn base 10 is used\n if (value.match(/^\\d*$/i)) {\n return FormValidation.Helper.luhn(value);\n }\n\n // Strip the check digit\n value = value.slice(0, -1);\n\n // Get every other char, and double it\n var cdCalc = '';\n for (var i = 1; i <= 13; i += 2) {\n cdCalc += (parseInt(value.charAt(i), 16) * 2).toString(16);\n }\n\n // Get the sum of each char in the string\n var sum = 0;\n for (i = 0; i < cdCalc.length; i++) {\n sum += parseInt(cdCalc.charAt(i), 16);\n }\n\n // If the last digit of the calc is 0, the check digit is 0\n return (sum % 10 === 0)\n ? (cd === '0')\n // Subtract it from the next highest 10s number (64 goes to 70) and subtract the sum\n // Double it and turn it into a hex char\n : (cd === ((Math.floor((sum + 10) / 10) * 10 - sum) * 2).toString(16));\n\n // 14 digit hex representation (no check digit)\n case /^[0-9A-F]{14}$/i.test(value):\n // 14 digit hex representation + dashes or spaces (no check digit)\n case /^[0-9A-F]{2}[- ][0-9A-F]{6}[- ][0-9A-F]{6}$/i.test(value):\n // 18 digit decimal representation (no check digit)\n case /^\\d{18}$/.test(value):\n // 18 digit decimal representation + dashes or spaces (no check digit)\n case /^\\d{5}[- ]\\d{5}[- ]\\d{4}[- ]\\d{4}$/.test(value):\n return true;\n\n default:\n return false;\n }\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n notEmpty: {\n 'default': 'Please enter a value'\n }\n }\n });\n\n FormValidation.Validator.notEmpty = {\n enableByHtml5: function($field) {\n var required = $field.attr('required') + '';\n return ('required' === required || 'true' === required);\n },\n\n /**\n * Check if input value is empty or not\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var type = $field.attr('type');\n if ('radio' === type || 'checkbox' === type) {\n var ns = validator.getNamespace();\n return validator\n .getFieldElements($field.attr('data-' + ns + '-field'))\n .filter(':checked')\n .length > 0;\n }\n\n if ('number' === type && $field.get(0).validity && $field.get(0).validity.badInput === true) {\n return true;\n }\n\n var value = validator.getFieldValue($field, validatorName);\n return $.trim(value) !== '';\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n numeric: {\n 'default': 'Please enter a valid float number'\n }\n }\n });\n\n FormValidation.Validator.numeric = {\n html5Attributes: {\n message: 'message',\n separator: 'separator', // deprecated\n thousandsseparator: 'thousandsSeparator',\n decimalseparator: 'decimalSeparator'\n },\n\n enableByHtml5: function($field) {\n return ('number' === $field.attr('type')) && ($field.attr('step') !== undefined) && ($field.attr('step') % 1 !== 0);\n },\n\n /**\n * Validate decimal number\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consist of key:\n * - message: The invalid message\n * - thousandsSeparator: The thousands separator. It's empty by default\n * - separator, decimalSeparator: The decimal separator. It's '.' by default\n * The separator option is deprecated and should be replaced with decimalSeparator\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n if (this.enableByHtml5($field) && $field.get(0).validity && $field.get(0).validity.badInput === true) {\n return false;\n }\n\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n var decimalSeparator = options.separator || options.decimalSeparator || '.',\n thousandsSeparator = options.thousandsSeparator || '';\n decimalSeparator = (decimalSeparator === '.') ? '\\\\.' : decimalSeparator;\n thousandsSeparator = (thousandsSeparator === '.') ? '\\\\.' : thousandsSeparator;\n\n var testRegexp = new RegExp('^-?[0-9]{1,3}(' + thousandsSeparator + '[0-9]{3})*(' + decimalSeparator + '[0-9]+)?$'),\n thousandsReplacer = new RegExp(thousandsSeparator, 'g');\n\n if (!testRegexp.test(value)) {\n return false;\n }\n\n // Replace thousands separator with blank\n if (thousandsSeparator) {\n value = value.replace(thousandsReplacer, '');\n }\n // Replace decimal separator with a dot\n if (decimalSeparator) {\n value = value.replace(decimalSeparator, '.');\n }\n\n return !isNaN(parseFloat(value)) && isFinite(value);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n phone: {\n 'default': 'Please enter a valid phone number',\n country: 'Please enter a valid phone number in %s',\n countries: {\n AE: 'United Arab Emirates',\n BG: 'Bulgaria',\n BR: 'Brazil',\n CN: 'China',\n CZ: 'Czech Republic',\n DE: 'Germany',\n DK: 'Denmark',\n ES: 'Spain',\n FR: 'France',\n GB: 'United Kingdom',\n IN: 'India',\n MA: 'Morocco',\n NL: 'Netherlands',\n PK: 'Pakistan',\n RO: 'Romania',\n RU: 'Russia',\n SK: 'Slovakia',\n TH: 'Thailand',\n US: 'USA',\n VE: 'Venezuela'\n }\n }\n }\n });\n\n FormValidation.Validator.phone = {\n html5Attributes: {\n message: 'message',\n country: 'country'\n },\n\n // The supported countries\n COUNTRY_CODES: ['AE', 'BG', 'BR', 'CN', 'CZ', 'DE', 'DK', 'ES', 'FR', 'GB', 'IN', 'MA', 'NL', 'PK', 'RO', 'RU', 'SK', 'TH', 'US', 'VE'],\n\n /**\n * Return true if the input value contains a valid phone number for the country\n * selected in the options\n *\n * @param {FormValidation.Base} validator Validate plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consist of key:\n * - message: The invalid message\n * - country: The ISO-3166 country code. It can be\n * - A country code\n * - Name of field which its value defines the country code\n * - Name of callback function that returns the country code\n * - A callback function that returns the country code\n *\n * @returns {Boolean|Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n var locale = validator.getLocale(),\n country = options.country;\n if (typeof country !== 'string' || $.inArray(country, this.COUNTRY_CODES) === -1) {\n // Try to determine the country\n country = validator.getDynamicOption($field, country);\n }\n\n if (!country || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {\n return true;\n }\n\n var isValid = true;\n switch (country.toUpperCase()) {\n case 'AE':\n // http://regexr.com/39tak\n value = $.trim(value);\n isValid = (/^(((\\+|00)?971[\\s\\.-]?(\\(0\\)[\\s\\.-]?)?|0)(\\(5(0|2|5|6)\\)|5(0|2|5|6)|2|3|4|6|7|9)|60)([\\s\\.-]?[0-9]){7}$/).test(value);\n break;\n\n case 'BG':\n // https://regex101.com/r/yE6vN4/1\n // See http://en.wikipedia.org/wiki/Telephone_numbers_in_Bulgaria\n value = value.replace(/\\+|\\s|-|\\/|\\(|\\)/gi,'');\n isValid = (/^(0|359|00)(((700|900)[0-9]{5}|((800)[0-9]{5}|(800)[0-9]{4}))|(87|88|89)([0-9]{7})|((2[0-9]{7})|(([3-9][0-9])(([0-9]{6})|([0-9]{5})))))$/).test(value);\n break;\n\n case 'BR':\n // http://regexr.com/399m1\n value = $.trim(value);\n isValid = (/^(([\\d]{4}[-.\\s]{1}[\\d]{2,3}[-.\\s]{1}[\\d]{2}[-.\\s]{1}[\\d]{2})|([\\d]{4}[-.\\s]{1}[\\d]{3}[-.\\s]{1}[\\d]{4})|((\\(?\\+?[0-9]{2}\\)?\\s?)?(\\(?\\d{2}\\)?\\s?)?\\d{4,5}[-.\\s]?\\d{4}))$/).test(value);\n break;\n\n case 'CN':\n // http://regexr.com/39dq4\n value = $.trim(value);\n isValid = (/^((00|\\+)?(86(?:-| )))?((\\d{11})|(\\d{3}[- ]{1}\\d{4}[- ]{1}\\d{4})|((\\d{2,4}[- ]){1}(\\d{7,8}|(\\d{3,4}[- ]{1}\\d{4}))([- ]{1}\\d{1,4})?))$/).test(value);\n break;\n\n case 'CZ':\n // http://regexr.com/39hhl\n isValid = /^(((00)([- ]?)|\\+)(420)([- ]?))?((\\d{3})([- ]?)){2}(\\d{3})$/.test(value);\n break;\n\n case 'DE':\n // http://regexr.com/39pkg\n value = $.trim(value);\n isValid = (/^(((((((00|\\+)49[ \\-/]?)|0)[1-9][0-9]{1,4})[ \\-/]?)|((((00|\\+)49\\()|\\(0)[1-9][0-9]{1,4}\\)[ \\-/]?))[0-9]{1,7}([ \\-/]?[0-9]{1,5})?)$/).test(value);\n break;\n\n case 'DK':\n // Mathing DK phone numbers with country code in 1 of 3 formats and an\n // 8 digit phone number not starting with a 0 or 1. Can have 1 space\n // between each character except inside the country code.\n // http://regex101.com/r/sS8fO4/1\n value = $.trim(value);\n isValid = (/^(\\+45|0045|\\(45\\))?\\s?[2-9](\\s?\\d){7}$/).test(value);\n break;\n\n case 'ES':\n // http://regex101.com/r/rB9mA9/1\n // Telephone numbers in Spain go like this:\n // 9: Landline phones and special prefixes.\n // 6, 7: Mobile phones.\n // 5: VoIP lines.\n // 8: Premium-rate services.\n // There are also special 5-digit and 3-digit numbers, but\n // maybe it would be overkill to include them all.\n value = $.trim(value);\n isValid = (/^(?:(?:(?:\\+|00)34\\D?))?(?:5|6|7|8|9)(?:\\d\\D?){8}$/).test(value);\n break;\n\n case 'FR':\n // http://regexr.com/39a2p\n value = $.trim(value);\n isValid = (/^(?:(?:(?:\\+|00)33[ ]?(?:\\(0\\)[ ]?)?)|0){1}[1-9]{1}([ .-]?)(?:\\d{2}\\1?){3}\\d{2}$/).test(value);\n break;\n\n \tcase 'GB':\n // http://aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers#Match_GB_telephone_number_in_any_format\n // http://regexr.com/38uhv\n value = $.trim(value);\n isValid = (/^\\(?(?:(?:0(?:0|11)\\)?[\\s-]?\\(?|\\+)44\\)?[\\s-]?\\(?(?:0\\)?[\\s-]?\\(?)?|0)(?:\\d{2}\\)?[\\s-]?\\d{4}[\\s-]?\\d{4}|\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{3,4}|\\d{4}\\)?[\\s-]?(?:\\d{5}|\\d{3}[\\s-]?\\d{3})|\\d{5}\\)?[\\s-]?\\d{4,5}|8(?:00[\\s-]?11[\\s-]?11|45[\\s-]?46[\\s-]?4\\d))(?:(?:[\\s-]?(?:x|ext\\.?\\s?|\\#)\\d+)?)$/).test(value);\n break;\n\n case 'IN':\n // http://stackoverflow.com/questions/18351553/regular-expression-validation-for-indian-phone-number-and-mobile-number\n // http://regex101.com/r/qL6eZ5/1\n // May begin with +91. Supports mobile and land line numbers\n value = $.trim(value);\n isValid = (/((\\+?)((0[ -]+)*|(91 )*)(\\d{12}|\\d{10}))|\\d{5}([- ]*)\\d{6}/).test(value);\n break;\n\n case 'MA':\n // http://en.wikipedia.org/wiki/Telephone_numbers_in_Morocco\n // http://regexr.com/399n8\n value = $.trim(value);\n isValid = (/^(?:(?:(?:\\+|00)212[\\s]?(?:[\\s]?\\(0\\)[\\s]?)?)|0){1}(?:5[\\s.-]?[2-3]|6[\\s.-]?[13-9]){1}[0-9]{1}(?:[\\s.-]?\\d{2}){3}$/).test(value);\n break;\n\n case 'NL':\n // http://en.wikipedia.org/wiki/Telephone_numbers_in_the_Netherlands\n // http://regexr.com/3aevr\n value = $.trim(value);\n isValid = (/^((\\+|00(\\s|\\s?\\-\\s?)?)31(\\s|\\s?\\-\\s?)?(\\(0\\)[\\-\\s]?)?|0)[1-9]((\\s|\\s?\\-\\s?)?[0-9])((\\s|\\s?-\\s?)?[0-9])((\\s|\\s?-\\s?)?[0-9])\\s?[0-9]\\s?[0-9]\\s?[0-9]\\s?[0-9]\\s?[0-9]$/gm).test(value);\n break;\n\n case 'PK':\n // http://regex101.com/r/yH8aV9/2\n value = $.trim(value);\n isValid = (/^0?3[0-9]{2}[0-9]{7}$/).test(value);\n break;\n\n case 'RO':\n // All mobile network and land line\n // http://regexr.com/39fv1\n isValid = (/^(\\+4|)?(07[0-8]{1}[0-9]{1}|02[0-9]{2}|03[0-9]{2}){1}?(\\s|\\.|\\-)?([0-9]{3}(\\s|\\.|\\-|)){2}$/g).test(value);\n break;\n\n case 'RU':\n // http://regex101.com/r/gW7yT5/5\n isValid = (/^((8|\\+7|007)[\\-\\.\\/ ]?)?([\\(\\/\\.]?\\d{3}[\\)\\/\\.]?[\\-\\.\\/ ]?)?[\\d\\-\\.\\/ ]{7,10}$/g).test(value);\n break;\n\n case 'SK':\n // http://regexr.com/3a95f\n isValid = /^(((00)([- ]?)|\\+)(421)([- ]?))?((\\d{3})([- ]?)){2}(\\d{3})$/.test(value);\n break;\n\n case 'TH':\n // http://regex101.com/r/vM5mZ4/2\n isValid = (/^0\\(?([6|8-9]{2})*-([0-9]{3})*-([0-9]{4})$/).test(value);\n break;\n\n case 'VE':\n // http://regex101.com/r/eM2yY0/6\n value = $.trim(value);\n isValid = (/^0(?:2(?:12|4[0-9]|5[1-9]|6[0-9]|7[0-8]|8[1-35-8]|9[1-5]|3[45789])|4(?:1[246]|2[46]))\\d{7}$/).test(value);\n break;\n\n case 'US':\n /* falls through */\n default:\n // Make sure US phone numbers have 10 digits\n // May start with 1, +1, or 1-; should discard\n // Area code may be delimited with (), & sections may be delimited with . or -\n // http://regexr.com/38mqi\n isValid = (/^(?:(1\\-?)|(\\+1 ?))?\\(?(\\d{3})[\\)\\-\\.]?(\\d{3})[\\-\\.]?(\\d{4})$/).test(value);\n break;\n }\n\n return {\n valid: isValid,\n message: FormValidation.Helper.format(options.message || FormValidation.I18n[locale].phone.country, FormValidation.I18n[locale].phone.countries[country])\n };\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n promise: {\n 'default': 'Please enter a valid value'\n }\n }\n });\n\n FormValidation.Validator.promise = {\n html5Attributes: {\n message: 'message',\n promise: 'promise'\n },\n\n /**\n * Return result from a jQuery's Deferred object\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - promise: The method that passes parameters:\n * promise: function(fieldValue, validator, $field) {\n * // fieldValue is the value of field\n * // validator is instance of FormValidation.Base\n * // $field is the field element\n *\n * var dfd = new $.Deferred();\n *\n * // Do something ...\n *\n * // Resolve when particular task is done\n * dfd.resolve({\n * valid: true or false, // Required\n * message: 'Other message', // Optional\n * key: value // You can attach more data to reuse later\n * });\n *\n * // You can reject if there's error\n * dfd.reject({\n * message: 'Other message', // Optional\n * key: value // You can attach more data to reuse later\n * });\n *\n * return dfd.promise();\n * }\n * - message: The invalid message\n * @returns {Deferred}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName),\n dfd = new $.Deferred(),\n promise = FormValidation.Helper.call(options.promise, [value, validator, $field]);\n\n promise\n .done(function(result) {\n dfd.resolve($field, validatorName, result);\n })\n .fail(function(result) {\n result = result || {};\n result.valid = false;\n dfd.resolve($field, validatorName, result);\n });\n\n return dfd;\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n regexp: {\n 'default': 'Please enter a value matching the pattern'\n }\n }\n });\n\n FormValidation.Validator.regexp = {\n html5Attributes: {\n message: 'message',\n regexp: 'regexp'\n },\n\n enableByHtml5: function($field) {\n var pattern = $field.attr('pattern');\n if (pattern) {\n return {\n regexp: pattern\n };\n }\n\n return false;\n },\n\n /**\n * Check if the element value matches given regular expression\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consists of the following key:\n * - regexp: The regular expression you need to check\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n var regexp = ('string' === typeof options.regexp) ? new RegExp(options.regexp) : options.regexp;\n return regexp.test(value);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n remote: {\n 'default': 'Please enter a valid value'\n }\n }\n });\n\n FormValidation.Validator.remote = {\n html5Attributes: {\n crossdomain: 'crossDomain',\n data: 'data',\n datatype: 'dataType',\n delay: 'delay',\n message: 'message',\n name: 'name',\n type: 'type',\n url: 'url',\n validkey: 'validKey'\n },\n\n /**\n * Destroy the timer when destroying the FormValidation (using validator.destroy() method)\n */\n destroy: function(validator, $field, options, validatorName) {\n var ns = validator.getNamespace(),\n timer = $field.data(ns + '.' + validatorName + '.timer');\n if (timer) {\n clearTimeout(timer);\n $field.removeData(ns + '.' + validatorName + '.timer');\n }\n },\n\n /**\n * Request a remote server to check the input value\n *\n * @param {FormValidation.Base} validator Plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - crossDomain {Boolean} [optional]\n * - data {Object|Function} [optional]: By default, it will take the value\n * {\n * : \n * }\n * - dataType {String} [optional]: The type of data which is returned by remote server.\n * It can be json (default), text, script\n * - delay {Number} [optional]\n * - headers {String[]} [optional]: Additional headers\n * - message {String} [optional]: The invalid message\n * - name {String} [optional]: Override the field name for the request.\n * - type {String} [optional] Can be GET or POST (default)\n * - url {String|Function}\n * - validKey {String} [optional]: The valid key. It's \"valid\" by default\n * This is useful when connecting to external remote server or APIs provided by 3rd parties\n * @returns {Deferred}\n */\n validate: function(validator, $field, options, validatorName) {\n var ns = validator.getNamespace(),\n value = validator.getFieldValue($field, validatorName),\n dfd = new $.Deferred();\n if (value === '') {\n dfd.resolve($field, validatorName, { valid: true });\n return dfd;\n }\n var name = $field.attr('data-' + ns + '-field'),\n data = options.data || {},\n url = options.url,\n validKey = options.validKey || 'valid';\n\n // Support dynamic data\n if ('function' === typeof data) {\n data = data.call(this, validator, $field, value);\n }\n\n // Parse string data from HTML5 attribute\n if ('string' === typeof data) {\n data = JSON.parse(data);\n }\n\n // Support dynamic url\n if ('function' === typeof url) {\n url = url.call(this, validator, $field, value);\n }\n\n data[options.name || name] = value;\n\n var ajaxOptions = {\n data: data,\n dataType: options.dataType || 'json',\n headers: options.headers || {},\n type: options.type || 'GET',\n url: url\n };\n if (options.crossDomain !== null) {\n ajaxOptions.crossDomain = (options.crossDomain === true || options.crossDomain === 'true');\n }\n\n function runCallback() {\n var xhr = $.ajax(ajaxOptions);\n\n xhr\n .success(function(response) {\n response.valid = (response[validKey] === true || response[validKey] === 'true')\n ? true\n : (response[validKey] === false || response[validKey] === 'false' ? false : null);\n dfd.resolve($field, validatorName, response);\n })\n .error(function(response) {\n dfd.resolve($field, validatorName, {\n valid: false\n });\n });\n\n dfd.fail(function() {\n xhr.abort();\n });\n\n return dfd;\n }\n\n if (options.delay) {\n // Since the form might have multiple fields with the same name\n // I have to attach the timer to the field element\n if ($field.data(ns + '.' + validatorName + '.timer')) {\n clearTimeout($field.data(ns + '.' + validatorName + '.timer'));\n }\n\n $field.data(ns + '.' + validatorName + '.timer', setTimeout(runCallback, options.delay));\n return dfd;\n } else {\n return runCallback();\n }\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n rtn: {\n 'default': 'Please enter a valid RTN number'\n }\n }\n });\n\n FormValidation.Validator.rtn = {\n /**\n * Validate a RTN (Routing transit number)\n *\n * @see http://en.wikipedia.org/wiki/Routing_transit_number\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n if (!/^\\d{9}$/.test(value)) {\n return false;\n }\n\n var sum = 0;\n for (var i = 0; i < value.length; i += 3) {\n sum += parseInt(value.charAt(i), 10) * 3\n + parseInt(value.charAt(i + 1), 10) * 7\n + parseInt(value.charAt(i + 2), 10);\n }\n return (sum !== 0 && sum % 10 === 0);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n sedol: {\n 'default': 'Please enter a valid SEDOL number'\n }\n }\n });\n\n FormValidation.Validator.sedol = {\n /**\n * Validate a SEDOL (Stock Exchange Daily Official List)\n *\n * @see http://en.wikipedia.org/wiki/SEDOL\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n value = value.toUpperCase();\n if (!/^[0-9A-Z]{7}$/.test(value)) {\n return false;\n }\n\n var sum = 0,\n weight = [1, 3, 1, 7, 3, 9, 1],\n length = value.length;\n for (var i = 0; i < length - 1; i++) {\n\t sum += weight[i] * parseInt(value.charAt(i), 36);\n\t }\n\t sum = (10 - sum % 10) % 10;\n return sum + '' === value.charAt(length - 1);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n\t\t'en_US': {\n\t\t\tsiren: {\n\t\t\t\t'default': 'Please enter a valid SIREN number'\n\t\t\t}\n\t\t}\n });\n\n\tFormValidation.Validator.siren = {\n\t\t/**\n\t\t * Check if a string is a siren number\n\t\t *\n\t\t * @param {FormValidation.Base} validator The validator plugin instance\n\t\t * @param {jQuery} $field Field element\n\t\t * @param {Object} options Consist of key:\n * - message: The invalid message\n\t\t * @returns {Boolean}\n\t\t */\n\t\tvalidate: function(validator, $field, options, validatorName) {\n\t\t\tvar value = validator.getFieldValue($field, validatorName);\n\t\t\tif (value === '') {\n\t\t\t\treturn true;\n\t\t\t}\n\n if (!/^\\d{9}$/.test(value)) {\n return false;\n }\n return FormValidation.Helper.luhn(value);\n\t\t}\n\t};\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n\t\t'en_US': {\n\t\t\tsiret: {\n\t\t\t\t'default': 'Please enter a valid SIRET number'\n\t\t\t}\n\t\t}\n });\n\n\tFormValidation.Validator.siret = {\n /**\n * Check if a string is a siret number\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consist of key:\n * - message: The invalid message\n * @returns {Boolean}\n */\n\t\tvalidate: function(validator, $field, options, validatorName) {\n\t\t\tvar value = validator.getFieldValue($field, validatorName);\n\t\t\tif (value === '') {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tvar sum = 0,\n length = value.length,\n tmp;\n\t\t\tfor (var i = 0; i < length; i++) {\n tmp = parseInt(value.charAt(i), 10);\n\t\t\t\tif ((i % 2) === 0) {\n\t\t\t\t\ttmp = tmp * 2;\n\t\t\t\t\tif (tmp > 9) {\n\t\t\t\t\t\ttmp -= 9;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsum += tmp;\n\t\t\t}\n\t\t\treturn (sum % 10 === 0);\n\t\t}\n\t};\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n step: {\n 'default': 'Please enter a valid step of %s'\n }\n }\n });\n\n FormValidation.Validator.step = {\n html5Attributes: {\n message: 'message',\n base: 'baseValue',\n step: 'step'\n },\n\n /**\n * Return true if the input value is valid step one\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Can consist of the following keys:\n * - baseValue: The base value\n * - step: The step\n * - message: The invalid message\n * @returns {Boolean|Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n options = $.extend({}, { baseValue: 0, step: 1 }, options);\n value = parseFloat(value);\n if (!$.isNumeric(value)) {\n return false;\n }\n\n var round = function(x, precision) {\n var m = Math.pow(10, precision);\n x = x * m;\n var sign = (x > 0) | -(x < 0),\n isHalf = (x % 1 === 0.5 * sign);\n if (isHalf) {\n return (Math.floor(x) + (sign > 0)) / m;\n } else {\n return Math.round(x) / m;\n }\n },\n floatMod = function(x, y) {\n if (y === 0.0) {\n return 1.0;\n }\n var dotX = (x + '').split('.'),\n dotY = (y + '').split('.'),\n precision = ((dotX.length === 1) ? 0 : dotX[1].length) + ((dotY.length === 1) ? 0 : dotY[1].length);\n return round(x - y * Math.floor(x / y), precision);\n };\n\n var locale = validator.getLocale(),\n mod = floatMod(value - options.baseValue, options.step);\n return {\n valid: mod === 0.0 || mod === options.step,\n message: FormValidation.Helper.format(options.message || FormValidation.I18n[locale].step['default'], [options.step])\n };\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n stringCase: {\n 'default': 'Please enter only lowercase characters',\n upper: 'Please enter only uppercase characters'\n }\n }\n });\n\n FormValidation.Validator.stringCase = {\n html5Attributes: {\n message: 'message',\n 'case': 'case'\n },\n\n /**\n * Check if a string is a lower or upper case one\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consist of key:\n * - message: The invalid message\n * - case: Can be 'lower' (default) or 'upper'\n * @returns {Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n var locale = validator.getLocale(),\n stringCase = (options['case'] || 'lower').toLowerCase();\n return {\n valid: ('upper' === stringCase) ? value === value.toUpperCase() : value === value.toLowerCase(),\n message: options.message || (('upper' === stringCase) ? FormValidation.I18n[locale].stringCase.upper : FormValidation.I18n[locale].stringCase['default'])\n };\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n stringLength: {\n 'default': 'Please enter a value with valid length',\n less: 'Please enter less than %s characters',\n more: 'Please enter more than %s characters',\n between: 'Please enter value between %s and %s characters long'\n }\n }\n });\n\n FormValidation.Validator.stringLength = {\n html5Attributes: {\n message: 'message',\n min: 'min',\n max: 'max',\n trim: 'trim',\n utf8bytes: 'utf8Bytes'\n },\n\n enableByHtml5: function($field) {\n var options = {},\n maxLength = $field.attr('maxlength'),\n minLength = $field.attr('minlength');\n if (maxLength) {\n options.max = parseInt(maxLength, 10);\n }\n if (minLength) {\n options.min = parseInt(minLength, 10);\n }\n\n return $.isEmptyObject(options) ? false : options;\n },\n\n /**\n * Check if the length of element value is less or more than given number\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consists of following keys:\n * - min\n * - max\n * At least one of two keys is required\n * The min, max keys define the number which the field value compares to. min, max can be\n * - A number\n * - Name of field which its value defines the number\n * - Name of callback function that returns the number\n * - A callback function that returns the number\n *\n * - message: The invalid message\n * - trim: Indicate the length will be calculated after trimming the value or not. It is false, by default\n * - utf8bytes: Evaluate string length in UTF-8 bytes, default to false\n * @returns {Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (options.trim === true || options.trim === 'true') {\n value = $.trim(value);\n }\n\n if (value === '') {\n return true;\n }\n\n var locale = validator.getLocale(),\n min = $.isNumeric(options.min) ? options.min : validator.getDynamicOption($field, options.min),\n max = $.isNumeric(options.max) ? options.max : validator.getDynamicOption($field, options.max),\n // Credit to http://stackoverflow.com/a/23329386 (@lovasoa) for UTF-8 byte length code\n utf8Length = function(str) {\n var s = str.length;\n for (var i = str.length - 1; i >= 0; i--) {\n var code = str.charCodeAt(i);\n if (code > 0x7f && code <= 0x7ff) {\n s++;\n } else if (code > 0x7ff && code <= 0xffff) {\n s += 2;\n }\n if (code >= 0xDC00 && code <= 0xDFFF) {\n i--;\n }\n }\n return s;\n },\n length = options.utf8Bytes ? utf8Length(value) : value.length,\n isValid = true,\n message = options.message || FormValidation.I18n[locale].stringLength['default'];\n\n if ((min && length < parseInt(min, 10)) || (max && length > parseInt(max, 10))) {\n isValid = false;\n }\n\n switch (true) {\n case (!!min && !!max):\n message = FormValidation.Helper.format(options.message || FormValidation.I18n[locale].stringLength.between, [parseInt(min, 10), parseInt(max, 10)]);\n break;\n\n case (!!min):\n message = FormValidation.Helper.format(options.message || FormValidation.I18n[locale].stringLength.more, parseInt(min, 10) - 1);\n break;\n\n case (!!max):\n message = FormValidation.Helper.format(options.message || FormValidation.I18n[locale].stringLength.less, parseInt(max, 10) + 1);\n break;\n\n default:\n break;\n }\n\n return {\n valid: isValid,\n message: message\n };\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n uri: {\n 'default': 'Please enter a valid URI'\n }\n }\n });\n\n FormValidation.Validator.uri = {\n html5Attributes: {\n message: 'message',\n allowlocal: 'allowLocal',\n allowemptyprotocol: 'allowEmptyProtocol',\n protocol: 'protocol'\n },\n\n enableByHtml5: function($field) {\n return ('url' === $field.attr('type'));\n },\n\n /**\n * Return true if the input value is a valid URL\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options\n * - message: The error message\n * - allowLocal: Allow the private and local network IP. Default to false\n * - allowEmptyProtocol: Allow the URI without protocol. Default to false\n * - protocol: The protocols, separated by a comma. Default to \"http, https, ftp\"\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n // Credit to https://gist.github.com/dperini/729294\n //\n // Regular Expression for URL validation\n //\n // Author: Diego Perini\n // Updated: 2010/12/05\n //\n // the regular expression composed & commented\n // could be easily tweaked for RFC compliance,\n // it was expressly modified to fit & satisfy\n // these test for an URL shortener:\n //\n // http://mathiasbynens.be/demo/url-regex\n //\n // Notes on possible differences from a standard/generic validation:\n //\n // - utf-8 char class take in consideration the full Unicode range\n // - TLDs are mandatory unless `allowLocal` is true\n // - protocols have been restricted to ftp, http and https only as requested\n //\n // Changes:\n //\n // - IP address dotted notation validation, range: 1.0.0.0 - 223.255.255.255\n // first and last IP address of each class is considered invalid\n // (since they are broadcast/network addresses)\n //\n // - Added exclusion of private, reserved and/or local networks ranges\n // unless `allowLocal` is true\n //\n // - Added possibility of choosing a custom protocol\n //\n // - Add option to validate without protocol\n //\n var allowLocal = options.allowLocal === true || options.allowLocal === 'true',\n allowEmptyProtocol = options.allowEmptyProtocol === true || options.allowEmptyProtocol === 'true',\n protocol = (options.protocol || 'http, https, ftp').split(',').join('|').replace(/\\s/g, ''),\n urlExp = new RegExp(\n \"^\" +\n // protocol identifier\n \"(?:(?:\" + protocol + \")://)\" +\n // allow empty protocol\n (allowEmptyProtocol ? '?' : '') +\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\" +\n // IP address exclusion\n // private & local networks\n (allowLocal\n ? ''\n : (\"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" +\n \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" +\n \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\")) +\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 & broadcast 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 // Allow intranet sites (no TLD) if `allowLocal` is true\n (allowLocal ? '?' : '') +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:/[^\\\\s]*)?\" +\n \"$\", \"i\"\n );\n\n return urlExp.test(value);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n uuid: {\n 'default': 'Please enter a valid UUID number',\n version: 'Please enter a valid UUID version %s number'\n }\n }\n });\n\n FormValidation.Validator.uuid = {\n html5Attributes: {\n message: 'message',\n version: 'version'\n },\n\n /**\n * Return true if and only if the input value is a valid UUID string\n *\n * @see http://en.wikipedia.org/wiki/Universally_unique_identifier\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consist of key:\n * - message: The invalid message\n * - version: Can be 3, 4, 5, null\n * @returns {Boolean|Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n // See the format at http://en.wikipedia.org/wiki/Universally_unique_identifier#Variants_and_versions\n var locale = validator.getLocale(),\n patterns = {\n '3': /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,\n '4': /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n '5': /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i\n },\n version = options.version ? (options.version + '') : 'all';\n return {\n valid: (null === patterns[version]) ? true : patterns[version].test(value),\n message: options.version\n ? FormValidation.Helper.format(options.message || FormValidation.I18n[locale].uuid.version, options.version)\n : (options.message || FormValidation.I18n[locale].uuid['default'])\n };\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n vat: {\n 'default': 'Please enter a valid VAT number',\n country: 'Please enter a valid VAT number in %s',\n countries: {\n AT: 'Austria',\n BE: 'Belgium',\n BG: 'Bulgaria',\n BR: 'Brazil',\n CH: 'Switzerland',\n CY: 'Cyprus',\n CZ: 'Czech Republic',\n DE: 'Germany',\n DK: 'Denmark',\n EE: 'Estonia',\n ES: 'Spain',\n FI: 'Finland',\n FR: 'France',\n GB: 'United Kingdom',\n GR: 'Greek',\n EL: 'Greek',\n HU: 'Hungary',\n HR: 'Croatia',\n IE: 'Ireland',\n IS: 'Iceland',\n IT: 'Italy',\n LT: 'Lithuania',\n LU: 'Luxembourg',\n LV: 'Latvia',\n MT: 'Malta',\n NL: 'Netherlands',\n NO: 'Norway',\n PL: 'Poland',\n PT: 'Portugal',\n RO: 'Romania',\n RU: 'Russia',\n RS: 'Serbia',\n SE: 'Sweden',\n SI: 'Slovenia',\n SK: 'Slovakia',\n VE: 'Venezuela',\n ZA: 'South Africa'\n }\n }\n }\n });\n\n FormValidation.Validator.vat = {\n html5Attributes: {\n message: 'message',\n country: 'country'\n },\n\n // Supported country codes\n COUNTRY_CODES: [\n 'AT', 'BE', 'BG', 'BR', 'CH', 'CY', 'CZ', 'DE', 'DK', 'EE', 'EL', 'ES', 'FI', 'FR', 'GB', 'GR', 'HR', 'HU',\n 'IE', 'IS', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'RS', 'SE', 'SK', 'SI', 'VE',\n 'ZA'\n ],\n\n /**\n * Validate an European VAT number\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consist of key:\n * - message: The invalid message\n * - country: The ISO 3166-1 country code. It can be\n * - One of country code defined in COUNTRY_CODES\n * - Name of field which its value defines the country code\n * - Name of callback function that returns the country code\n * - A callback function that returns the country code\n * @returns {Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n var locale = validator.getLocale(),\n country = options.country;\n if (!country) {\n country = value.substr(0, 2);\n } else if (typeof country !== 'string' || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {\n // Determine the country code\n country = validator.getDynamicOption($field, country);\n }\n\n if ($.inArray(country, this.COUNTRY_CODES) === -1) {\n return true;\n }\n\n var method = ['_', country.toLowerCase()].join(''),\n result = this[method](value);\n result = (result === true || result === false) ? { valid: result } : result;\n result.message = FormValidation.Helper.format(options.message || FormValidation.I18n[locale].vat.country, FormValidation.I18n[locale].vat.countries[country.toUpperCase()]);\n\n return result;\n },\n\n // VAT validators\n\n /**\n * Validate Austrian VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _at: function(value) {\n if (/^ATU[0-9]{8}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^U[0-9]{8}$/.test(value)) {\n return false;\n }\n\n value = value.substr(1);\n var sum = 0,\n weight = [1, 2, 1, 2, 1, 2, 1],\n temp = 0;\n for (var i = 0; i < 7; i++) {\n temp = parseInt(value.charAt(i), 10) * weight[i];\n if (temp > 9) {\n temp = Math.floor(temp / 10) + temp % 10;\n }\n sum += temp;\n }\n\n sum = 10 - (sum + 4) % 10;\n if (sum === 10) {\n sum = 0;\n }\n\n return (sum + '' === value.substr(7, 1));\n },\n\n /**\n * Validate Belgian VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _be: function(value) {\n if (/^BE[0]{0,1}[0-9]{9}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0]{0,1}[0-9]{9}$/.test(value)) {\n return false;\n }\n\n if (value.length === 9) {\n value = '0' + value;\n }\n if (value.substr(1, 1) === '0') {\n return false;\n }\n\n var sum = parseInt(value.substr(0, 8), 10) + parseInt(value.substr(8, 2), 10);\n return (sum % 97 === 0);\n },\n\n /**\n * Validate Bulgarian VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _bg: function(value) {\n if (/^BG[0-9]{9,10}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{9,10}$/.test(value)) {\n return false;\n }\n\n var sum = 0, i = 0;\n\n // Legal entities\n if (value.length === 9) {\n for (i = 0; i < 8; i++) {\n sum += parseInt(value.charAt(i), 10) * (i + 1);\n }\n sum = sum % 11;\n if (sum === 10) {\n sum = 0;\n for (i = 0; i < 8; i++) {\n sum += parseInt(value.charAt(i), 10) * (i + 3);\n }\n }\n sum = sum % 10;\n return (sum + '' === value.substr(8));\n }\n // Physical persons, foreigners and others\n else if (value.length === 10) {\n // Validate Bulgarian national identification numbers\n var egn = function(value) {\n // Check the birth date\n var year = parseInt(value.substr(0, 2), 10) + 1900,\n month = parseInt(value.substr(2, 2), 10),\n day = parseInt(value.substr(4, 2), 10);\n if (month > 40) {\n year += 100;\n month -= 40;\n } else if (month > 20) {\n year -= 100;\n month -= 20;\n }\n\n if (!FormValidation.Helper.date(year, month, day)) {\n return false;\n }\n\n var sum = 0,\n weight = [2, 4, 8, 5, 10, 9, 7, 3, 6];\n for (var i = 0; i < 9; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = (sum % 11) % 10;\n return (sum + '' === value.substr(9, 1));\n },\n // Validate Bulgarian personal number of a foreigner\n pnf = function(value) {\n var sum = 0,\n weight = [21, 19, 17, 13, 11, 9, 7, 3, 1];\n for (var i = 0; i < 9; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = sum % 10;\n return (sum + '' === value.substr(9, 1));\n },\n // Finally, consider it as a VAT number\n vat = function(value) {\n var sum = 0,\n weight = [4, 3, 2, 7, 6, 5, 4, 3, 2];\n for (var i = 0; i < 9; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = 11 - sum % 11;\n if (sum === 10) {\n return false;\n }\n if (sum === 11) {\n sum = 0;\n }\n return (sum + '' === value.substr(9, 1));\n };\n return (egn(value) || pnf(value) || vat(value));\n }\n\n return false;\n },\n\n /**\n * Validate Brazilian VAT number (CNPJ)\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _br: function(value) {\n if (value === '') {\n return true;\n }\n var cnpj = value.replace(/[^\\d]+/g, '');\n if (cnpj === '' || cnpj.length !== 14) {\n return false;\n }\n\n // Remove invalids CNPJs\n if (cnpj === '00000000000000' || cnpj === '11111111111111' || cnpj === '22222222222222' ||\n cnpj === '33333333333333' || cnpj === '44444444444444' || cnpj === '55555555555555' ||\n cnpj === '66666666666666' || cnpj === '77777777777777' || cnpj === '88888888888888' ||\n cnpj === '99999999999999')\n {\n return false;\n }\n\n // Validate verification digits\n var length = cnpj.length - 2,\n numbers = cnpj.substring(0, length),\n digits = cnpj.substring(length),\n sum = 0,\n pos = length - 7;\n\n for (var i = length; i >= 1; i--) {\n sum += parseInt(numbers.charAt(length - i), 10) * pos--;\n if (pos < 2) {\n pos = 9;\n }\n }\n\n var result = sum % 11 < 2 ? 0 : 11 - sum % 11;\n if (result !== parseInt(digits.charAt(0), 10)) {\n return false;\n }\n\n length = length + 1;\n numbers = cnpj.substring(0, length);\n sum = 0;\n pos = length - 7;\n for (i = length; i >= 1; i--) {\n sum += parseInt(numbers.charAt(length - i), 10) * pos--;\n if (pos < 2) {\n pos = 9;\n }\n }\n\n result = sum % 11 < 2 ? 0 : 11 - sum % 11;\n return (result === parseInt(digits.charAt(1), 10));\n },\n\n /**\n * Validate Swiss VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _ch: function(value) {\n if (/^CHE[0-9]{9}(MWST)?$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^E[0-9]{9}(MWST)?$/.test(value)) {\n return false;\n }\n\n value = value.substr(1);\n var sum = 0,\n weight = [5, 4, 3, 2, 7, 6, 5, 4];\n for (var i = 0; i < 8; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n\n sum = 11 - sum % 11;\n if (sum === 10) {\n return false;\n }\n if (sum === 11) {\n sum = 0;\n }\n\n return (sum + '' === value.substr(8, 1));\n },\n\n /**\n * Validate Cypriot VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _cy: function(value) {\n if (/^CY[0-5|9]{1}[0-9]{7}[A-Z]{1}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-5|9]{1}[0-9]{7}[A-Z]{1}$/.test(value)) {\n return false;\n }\n\n // Do not allow to start with \"12\"\n if (value.substr(0, 2) === '12') {\n return false;\n }\n\n // Extract the next digit and multiply by the counter.\n var sum = 0,\n translation = {\n '0': 1, '1': 0, '2': 5, '3': 7, '4': 9,\n '5': 13, '6': 15, '7': 17, '8': 19, '9': 21\n };\n for (var i = 0; i < 8; i++) {\n var temp = parseInt(value.charAt(i), 10);\n if (i % 2 === 0) {\n temp = translation[temp + ''];\n }\n sum += temp;\n }\n\n sum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[sum % 26];\n return (sum + '' === value.substr(8, 1));\n },\n\n /**\n * Validate Czech Republic VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _cz: function(value) {\n if (/^CZ[0-9]{8,10}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{8,10}$/.test(value)) {\n return false;\n }\n\n var sum = 0,\n i = 0;\n if (value.length === 8) {\n // Do not allow to start with '9'\n if (value.charAt(0) + '' === '9') {\n return false;\n }\n\n sum = 0;\n for (i = 0; i < 7; i++) {\n sum += parseInt(value.charAt(i), 10) * (8 - i);\n }\n sum = 11 - sum % 11;\n if (sum === 10) {\n sum = 0;\n }\n if (sum === 11) {\n sum = 1;\n }\n\n return (sum + '' === value.substr(7, 1));\n } else if (value.length === 9 && (value.charAt(0) + '' === '6')) {\n sum = 0;\n // Skip the first (which is 6)\n for (i = 0; i < 7; i++) {\n sum += parseInt(value.charAt(i + 1), 10) * (8 - i);\n }\n sum = 11 - sum % 11;\n if (sum === 10) {\n sum = 0;\n }\n if (sum === 11) {\n sum = 1;\n }\n sum = [8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 10][sum - 1];\n return (sum + '' === value.substr(8, 1));\n } else if (value.length === 9 || value.length === 10) {\n // Validate Czech birth number (Rodné číslo), which is also national identifier\n var year = 1900 + parseInt(value.substr(0, 2), 10),\n month = parseInt(value.substr(2, 2), 10) % 50 % 20,\n day = parseInt(value.substr(4, 2), 10);\n if (value.length === 9) {\n if (year >= 1980) {\n year -= 100;\n }\n if (year > 1953) {\n return false;\n }\n } else if (year < 1954) {\n year += 100;\n }\n\n if (!FormValidation.Helper.date(year, month, day)) {\n return false;\n }\n\n // Check that the birth date is not in the future\n if (value.length === 10) {\n var check = parseInt(value.substr(0, 9), 10) % 11;\n if (year < 1985) {\n check = check % 10;\n }\n return (check + '' === value.substr(9, 1));\n }\n\n return true;\n }\n\n return false;\n },\n\n /**\n * Validate German VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _de: function(value) {\n if (/^DE[0-9]{9}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{9}$/.test(value)) {\n return false;\n }\n\n return FormValidation.Helper.mod11And10(value);\n },\n\n /**\n * Validate Danish VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _dk: function(value) {\n if (/^DK[0-9]{8}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{8}$/.test(value)) {\n return false;\n }\n\n var sum = 0,\n weight = [2, 7, 6, 5, 4, 3, 2, 1];\n for (var i = 0; i < 8; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n\n return (sum % 11 === 0);\n },\n\n /**\n * Validate Estonian VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _ee: function(value) {\n if (/^EE[0-9]{9}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{9}$/.test(value)) {\n return false;\n }\n\n var sum = 0,\n weight = [3, 7, 1, 3, 7, 1, 3, 7, 1];\n for (var i = 0; i < 9; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n\n return (sum % 10 === 0);\n },\n\n /**\n * Validate Spanish VAT number (NIF - Número de Identificación Fiscal)\n * Can be:\n * i) DNI (Documento nacional de identidad), for Spaniards\n * ii) NIE (Número de Identificación de Extranjeros), for foreigners\n * iii) CIF (Certificado de Identificación Fiscal), for legal entities and others\n *\n * @param {String} value VAT number\n * @returns {Boolean|Object}\n */\n _es: function(value) {\n if (/^ES[0-9A-Z][0-9]{7}[0-9A-Z]$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9A-Z][0-9]{7}[0-9A-Z]$/.test(value)) {\n return false;\n }\n\n var dni = function(value) {\n var check = parseInt(value.substr(0, 8), 10);\n check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];\n return (check + '' === value.substr(8, 1));\n },\n nie = function(value) {\n var check = ['XYZ'.indexOf(value.charAt(0)), value.substr(1)].join('');\n check = parseInt(check, 10);\n check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];\n return (check + '' === value.substr(8, 1));\n },\n cif = function(value) {\n var first = value.charAt(0), check;\n if ('KLM'.indexOf(first) !== -1) {\n // K: Spanish younger than 14 year old\n // L: Spanish living outside Spain without DNI\n // M: Granted the tax to foreigners who have no NIE\n check = parseInt(value.substr(1, 8), 10);\n check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];\n return (check + '' === value.substr(8, 1));\n } else if ('ABCDEFGHJNPQRSUVW'.indexOf(first) !== -1) {\n var sum = 0,\n weight = [2, 1, 2, 1, 2, 1, 2],\n temp = 0;\n\n for (var i = 0; i < 7; i++) {\n temp = parseInt(value.charAt(i + 1), 10) * weight[i];\n if (temp > 9) {\n temp = Math.floor(temp / 10) + temp % 10;\n }\n sum += temp;\n }\n sum = 10 - sum % 10;\n if (sum === 10) {\n sum = 0;\n }\n return (sum + '' === value.substr(8, 1) || 'JABCDEFGHI'[sum] === value.substr(8, 1));\n }\n\n return false;\n };\n\n var first = value.charAt(0);\n if (/^[0-9]$/.test(first)) {\n return {\n valid: dni(value),\n type: 'DNI'\n };\n } else if (/^[XYZ]$/.test(first)) {\n return {\n valid: nie(value),\n type: 'NIE'\n };\n } else {\n return {\n valid: cif(value),\n type: 'CIF'\n };\n }\n },\n\n /**\n * Validate Finnish VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _fi: function(value) {\n if (/^FI[0-9]{8}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{8}$/.test(value)) {\n return false;\n }\n\n var sum = 0,\n weight = [7, 9, 10, 5, 8, 4, 2, 1];\n for (var i = 0; i < 8; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n\n return (sum % 11 === 0);\n },\n\n /**\n * Validate French VAT number (TVA - taxe sur la valeur ajoutée)\n * It's constructed by a SIREN number, prefixed by two characters.\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _fr: function(value) {\n if (/^FR[0-9A-Z]{2}[0-9]{9}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9A-Z]{2}[0-9]{9}$/.test(value)) {\n return false;\n }\n\n if (!FormValidation.Helper.luhn(value.substr(2))) {\n return false;\n }\n\n if (/^[0-9]{2}$/.test(value.substr(0, 2))) {\n // First two characters are digits\n return value.substr(0, 2) === (parseInt(value.substr(2) + '12', 10) % 97 + '');\n } else {\n // The first characters cann't be O and I\n var alphabet = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ',\n check;\n // First one is digit\n if (/^[0-9]{1}$/.test(value.charAt(0))) {\n check = alphabet.indexOf(value.charAt(0)) * 24 + alphabet.indexOf(value.charAt(1)) - 10;\n } else {\n check = alphabet.indexOf(value.charAt(0)) * 34 + alphabet.indexOf(value.charAt(1)) - 100;\n }\n return ((parseInt(value.substr(2), 10) + 1 + Math.floor(check / 11)) % 11) === (check % 11);\n }\n },\n\n /**\n * Validate United Kingdom VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _gb: function(value) {\n if (/^GB[0-9]{9}$/.test(value) /* Standard */\n || /^GB[0-9]{12}$/.test(value) /* Branches */\n || /^GBGD[0-9]{3}$/.test(value) /* Government department */\n || /^GBHA[0-9]{3}$/.test(value) /* Health authority */\n || /^GB(GD|HA)8888[0-9]{5}$/.test(value))\n {\n value = value.substr(2);\n }\n if (!/^[0-9]{9}$/.test(value)\n && !/^[0-9]{12}$/.test(value)\n && !/^GD[0-9]{3}$/.test(value)\n && !/^HA[0-9]{3}$/.test(value)\n && !/^(GD|HA)8888[0-9]{5}$/.test(value))\n {\n return false;\n }\n\n var length = value.length;\n if (length === 5) {\n var firstTwo = value.substr(0, 2),\n lastThree = parseInt(value.substr(2), 10);\n return ('GD' === firstTwo && lastThree < 500) || ('HA' === firstTwo && lastThree >= 500);\n } else if (length === 11 && ('GD8888' === value.substr(0, 6) || 'HA8888' === value.substr(0, 6))) {\n if (('GD' === value.substr(0, 2) && parseInt(value.substr(6, 3), 10) >= 500)\n || ('HA' === value.substr(0, 2) && parseInt(value.substr(6, 3), 10) < 500))\n {\n return false;\n }\n return (parseInt(value.substr(6, 3), 10) % 97 === parseInt(value.substr(9, 2), 10));\n } else if (length === 9 || length === 12) {\n var sum = 0,\n weight = [8, 7, 6, 5, 4, 3, 2, 10, 1];\n for (var i = 0; i < 9; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = sum % 97;\n\n if (parseInt(value.substr(0, 3), 10) >= 100) {\n return (sum === 0 || sum === 42 || sum === 55);\n } else {\n return (sum === 0);\n }\n }\n\n return true;\n },\n\n /**\n * Validate Greek VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _gr: function(value) {\n if (/^(GR|EL)[0-9]{9}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{9}$/.test(value)) {\n return false;\n }\n\n if (value.length === 8) {\n value = '0' + value;\n }\n\n var sum = 0,\n weight = [256, 128, 64, 32, 16, 8, 4, 2];\n for (var i = 0; i < 8; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = (sum % 11) % 10;\n\n return (sum + '' === value.substr(8, 1));\n },\n\n // EL is traditionally prefix of Greek VAT numbers\n _el: function(value) {\n return this._gr(value);\n },\n\n /**\n * Validate Hungarian VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _hu: function(value) {\n if (/^HU[0-9]{8}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{8}$/.test(value)) {\n return false;\n }\n\n var sum = 0,\n weight = [9, 7, 3, 1, 9, 7, 3, 1];\n\n for (var i = 0; i < 8; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n\n return (sum % 10 === 0);\n },\n\n /**\n * Validate Croatian VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _hr: function(value) {\n if (/^HR[0-9]{11}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{11}$/.test(value)) {\n return false;\n }\n\n return FormValidation.Helper.mod11And10(value);\n },\n\n /**\n * Validate Irish VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _ie: function(value) {\n if (/^IE[0-9]{1}[0-9A-Z\\*\\+]{1}[0-9]{5}[A-Z]{1,2}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{1}[0-9A-Z\\*\\+]{1}[0-9]{5}[A-Z]{1,2}$/.test(value)) {\n return false;\n }\n\n var getCheckDigit = function(value) {\n while (value.length < 7) {\n value = '0' + value;\n }\n var alphabet = 'WABCDEFGHIJKLMNOPQRSTUV',\n sum = 0;\n for (var i = 0; i < 7; i++) {\n sum += parseInt(value.charAt(i), 10) * (8 - i);\n }\n sum += 9 * alphabet.indexOf(value.substr(7));\n return alphabet[sum % 23];\n };\n\n // The first 7 characters are digits\n if (/^[0-9]+$/.test(value.substr(0, 7))) {\n // New system\n return value.charAt(7) === getCheckDigit(value.substr(0, 7) + value.substr(8) + '');\n } else if ('ABCDEFGHIJKLMNOPQRSTUVWXYZ+*'.indexOf(value.charAt(1)) !== -1) {\n // Old system\n return value.charAt(7) === getCheckDigit(value.substr(2, 5) + value.substr(0, 1) + '');\n }\n\n return true;\n },\n\n /**\n * Validate Icelandic VAT (VSK) number\n *\n * @params {String} value VAT number\n * @returns {Boolean}\n */\n _is: function(value) {\n if (/^IS[0-9]{5,6}$/.test(value)) {\n value = value.substr(2);\n }\n return /^[0-9]{5,6}$/.test(value);\n },\n\n /**\n * Validate Italian VAT number, which consists of 11 digits.\n * - First 7 digits are a company identifier\n * - Next 3 are the province of residence\n * - The last one is a check digit\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _it: function(value) {\n if (/^IT[0-9]{11}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{11}$/.test(value)) {\n return false;\n }\n\n if (parseInt(value.substr(0, 7), 10) === 0) {\n return false;\n }\n\n var lastThree = parseInt(value.substr(7, 3), 10);\n if ((lastThree < 1) || (lastThree > 201) && lastThree !== 999 && lastThree !== 888) {\n return false;\n }\n\n return FormValidation.Helper.luhn(value);\n },\n\n /**\n * Validate Lithuanian VAT number\n * It can be:\n * - 9 digits, for legal entities\n * - 12 digits, for temporarily registered taxpayers\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _lt: function(value) {\n if (/^LT([0-9]{7}1[0-9]{1}|[0-9]{10}1[0-9]{1})$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^([0-9]{7}1[0-9]{1}|[0-9]{10}1[0-9]{1})$/.test(value)) {\n return false;\n }\n\n var length = value.length,\n sum = 0,\n i;\n for (i = 0; i < length - 1; i++) {\n sum += parseInt(value.charAt(i), 10) * (1 + i % 9);\n }\n var check = sum % 11;\n if (check === 10) {\n sum = 0;\n for (i = 0; i < length - 1; i++) {\n sum += parseInt(value.charAt(i), 10) * (1 + (i + 2) % 9);\n }\n }\n check = check % 11 % 10;\n return (check + '' === value.charAt(length - 1));\n },\n\n /**\n * Validate Luxembourg VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _lu: function(value) {\n if (/^LU[0-9]{8}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{8}$/.test(value)) {\n return false;\n }\n\n return ((parseInt(value.substr(0, 6), 10) % 89) + '' === value.substr(6, 2));\n },\n\n /**\n * Validate Latvian VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _lv: function(value) {\n if (/^LV[0-9]{11}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{11}$/.test(value)) {\n return false;\n }\n\n var first = parseInt(value.charAt(0), 10),\n sum = 0,\n weight = [],\n i,\n length = value.length;\n if (first > 3) {\n // Legal entity\n sum = 0;\n weight = [9, 1, 4, 8, 3, 10, 2, 5, 7, 6, 1];\n for (i = 0; i < length; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = sum % 11;\n return (sum === 3);\n } else {\n // Check birth date\n var day = parseInt(value.substr(0, 2), 10),\n month = parseInt(value.substr(2, 2), 10),\n year = parseInt(value.substr(4, 2), 10);\n year = year + 1800 + parseInt(value.charAt(6), 10) * 100;\n\n if (!FormValidation.Helper.date(year, month, day)) {\n return false;\n }\n\n // Check personal code\n sum = 0;\n weight = [10, 5, 8, 4, 2, 1, 6, 3, 7, 9];\n for (i = 0; i < length - 1; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = (sum + 1) % 11 % 10;\n return (sum + '' === value.charAt(length - 1));\n }\n },\n\n /**\n * Validate Maltese VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _mt: function(value) {\n if (/^MT[0-9]{8}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{8}$/.test(value)) {\n return false;\n }\n\n var sum = 0,\n weight = [3, 4, 6, 7, 8, 9, 10, 1];\n\n for (var i = 0; i < 8; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n\n return (sum % 37 === 0);\n },\n\n /**\n * Validate Dutch VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _nl: function(value) {\n if (/^NL[0-9]{9}B[0-9]{2}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{9}B[0-9]{2}$/.test(value)) {\n return false;\n }\n\n var sum = 0,\n weight = [9, 8, 7, 6, 5, 4, 3, 2];\n for (var i = 0; i < 8; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n\n sum = sum % 11;\n if (sum > 9) {\n sum = 0;\n }\n return (sum + '' === value.substr(8, 1));\n },\n\n /**\n * Validate Norwegian VAT number\n *\n * @see http://www.brreg.no/english/coordination/number.html\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _no: function(value) {\n if (/^NO[0-9]{9}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{9}$/.test(value)) {\n return false;\n }\n\n var sum = 0,\n weight = [3, 2, 7, 6, 5, 4, 3, 2];\n for (var i = 0; i < 8; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n\n sum = 11 - sum % 11;\n if (sum === 11) {\n sum = 0;\n }\n return (sum + '' === value.substr(8, 1));\n },\n\n /**\n * Validate Polish VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _pl: function(value) {\n if (/^PL[0-9]{10}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{10}$/.test(value)) {\n return false;\n }\n\n var sum = 0,\n weight = [6, 5, 7, 2, 3, 4, 5, 6, 7, -1];\n\n for (var i = 0; i < 10; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n\n return (sum % 11 === 0);\n },\n\n /**\n * Validate Portuguese VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _pt: function(value) {\n if (/^PT[0-9]{9}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{9}$/.test(value)) {\n return false;\n }\n\n var sum = 0,\n weight = [9, 8, 7, 6, 5, 4, 3, 2];\n\n for (var i = 0; i < 8; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = 11 - sum % 11;\n if (sum > 9) {\n sum = 0;\n }\n return (sum + '' === value.substr(8, 1));\n },\n\n /**\n * Validate Romanian VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _ro: function(value) {\n if (/^RO[1-9][0-9]{1,9}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[1-9][0-9]{1,9}$/.test(value)) {\n return false;\n }\n\n var length = value.length,\n weight = [7, 5, 3, 2, 1, 7, 5, 3, 2].slice(10 - length),\n sum = 0;\n for (var i = 0; i < length - 1; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n\n sum = (10 * sum) % 11 % 10;\n return (sum + '' === value.substr(length - 1, 1));\n },\n\n /**\n * Validate Russian VAT number (Taxpayer Identification Number - INN)\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _ru: function(value) {\n if (/^RU([0-9]{10}|[0-9]{12})$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^([0-9]{10}|[0-9]{12})$/.test(value)) {\n return false;\n }\n\n var i = 0;\n if (value.length === 10) {\n var sum = 0,\n weight = [2, 4, 10, 3, 5, 9, 4, 6, 8, 0];\n for (i = 0; i < 10; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = sum % 11;\n if (sum > 9) {\n sum = sum % 10;\n }\n\n return (sum + '' === value.substr(9, 1));\n } else if (value.length === 12) {\n var sum1 = 0,\n weight1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0],\n sum2 = 0,\n weight2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0];\n\n for (i = 0; i < 11; i++) {\n sum1 += parseInt(value.charAt(i), 10) * weight1[i];\n sum2 += parseInt(value.charAt(i), 10) * weight2[i];\n }\n sum1 = sum1 % 11;\n if (sum1 > 9) {\n sum1 = sum1 % 10;\n }\n sum2 = sum2 % 11;\n if (sum2 > 9) {\n sum2 = sum2 % 10;\n }\n\n return (sum1 + '' === value.substr(10, 1) && sum2 + '' === value.substr(11, 1));\n }\n\n return false;\n },\n\n /**\n * Validate Serbian VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _rs: function(value) {\n if (/^RS[0-9]{9}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{9}$/.test(value)) {\n return false;\n }\n\n var sum = 10,\n temp = 0;\n for (var i = 0; i < 8; i++) {\n temp = (parseInt(value.charAt(i), 10) + sum) % 10;\n if (temp === 0) {\n temp = 10;\n }\n sum = (2 * temp) % 11;\n }\n\n return ((sum + parseInt(value.substr(8, 1), 10)) % 10 === 1);\n },\n\n /**\n * Validate Swedish VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _se: function(value) {\n if (/^SE[0-9]{10}01$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[0-9]{10}01$/.test(value)) {\n return false;\n }\n\n value = value.substr(0, 10);\n return FormValidation.Helper.luhn(value);\n },\n\n /**\n * Validate Slovenian VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _si: function(value) {\n // The Slovenian VAT numbers don't start with zero\n var res = value.match(/^(SI)?([1-9][0-9]{7})$/);\n if (!res) {\n return false;\n }\n if (res[1]) {\n value = value.substr(2);\n }\n\n var sum = 0,\n weight = [8, 7, 6, 5, 4, 3, 2];\n\n for (var i = 0; i < 7; i++) {\n sum += parseInt(value.charAt(i), 10) * weight[i];\n }\n sum = 11 - sum % 11;\n if (sum === 10) {\n sum = 0;\n }\n return (sum + '' === value.substr(7, 1));\n },\n\n /**\n * Validate Slovak VAT number\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _sk: function(value) {\n if (/^SK[1-9][0-9][(2-4)|(6-9)][0-9]{7}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[1-9][0-9][(2-4)|(6-9)][0-9]{7}$/.test(value)) {\n return false;\n }\n\n return (parseInt(value, 10) % 11 === 0);\n },\n\n /**\n * Validate Venezuelan VAT number (RIF)\n *\n * @param {String} value VAT number\n * @returns {Boolean}\n */\n _ve: function(value) {\n if (/^VE[VEJPG][0-9]{9}$/.test(value)) {\n value = value.substr(2);\n }\n if (!/^[VEJPG][0-9]{9}$/.test(value)) {\n return false;\n }\n\n var types = {\n 'V': 4,\n 'E': 8,\n 'J': 12,\n 'P': 16,\n 'G': 20\n },\n sum = types[value.charAt(0)],\n weight = [3, 2, 7, 6, 5, 4, 3, 2];\n\n for (var i = 0; i < 8; i++) {\n sum += parseInt(value.charAt(i + 1), 10) * weight[i];\n }\n\n sum = 11 - sum % 11;\n if (sum === 11 || sum === 10) {\n sum = 0;\n }\n return (sum + '' === value.substr(9, 1));\n },\n\n /**\n * Validate South African VAT number\n *\n * @params {String} value VAT number\n * @returns {Boolean}\n */\n _za: function(value) {\n if (/^ZA4[0-9]{9}$/.test(value)) {\n value = value.substr(2);\n }\n\n return /^4[0-9]{9}$/.test(value);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n vin: {\n 'default': 'Please enter a valid VIN number'\n }\n }\n });\n\n FormValidation.Validator.vin = {\n /**\n * Validate an US VIN (Vehicle Identification Number)\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consist of key:\n * - message: The invalid message\n * @returns {Boolean}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '') {\n return true;\n }\n\n // Don't accept I, O, Q characters\n if (!/^[a-hj-npr-z0-9]{8}[0-9xX][a-hj-npr-z0-9]{8}$/i.test(value)) {\n return false;\n }\n\n value = value.toUpperCase();\n var chars = {\n A: 1, B: 2, C: 3, D: 4, E: 5, F: 6, G: 7, H: 8,\n J: 1, K: 2, L: 3, M: 4, N: 5, P: 7, R: 9,\n S: 2, T: 3, U: 4, V: 5, W: 6, X: 7, Y: 8, Z: 9,\n '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '0': 0\n },\n weights = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2],\n sum = 0,\n length = value.length;\n for (var i = 0; i < length; i++) {\n sum += chars[value.charAt(i) + ''] * weights[i];\n }\n\n var reminder = sum % 11;\n if (reminder === 10) {\n reminder = 'X';\n }\n\n return (reminder + '') === value.charAt(8);\n }\n };\n}(jQuery));\n;(function($) {\n FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {\n 'en_US': {\n zipCode: {\n 'default': 'Please enter a valid postal code',\n country: 'Please enter a valid postal code in %s',\n countries: {\n AT: 'Austria',\n BG: 'Bulgaria',\n BR: 'Brazil',\n CA: 'Canada',\n CH: 'Switzerland',\n CZ: 'Czech Republic',\n DE: 'Germany',\n DK: 'Denmark',\n ES: 'Spain',\n FR: 'France',\n GB: 'United Kingdom',\n IE: 'Ireland',\n IN: 'India',\n IT: 'Italy',\n MA: 'Morocco',\n NL: 'Netherlands',\n PL: 'Poland',\n PT: 'Portugal',\n RO: 'Romania',\n RU: 'Russia',\n SE: 'Sweden',\n SG: 'Singapore',\n SK: 'Slovakia',\n US: 'USA'\n }\n }\n }\n });\n\n FormValidation.Validator.zipCode = {\n html5Attributes: {\n message: 'message',\n country: 'country'\n },\n\n COUNTRY_CODES: ['AT', 'BG', 'BR', 'CA', 'CH', 'CZ', 'DE', 'DK', 'ES', 'FR', 'GB', 'IE', 'IN', 'IT', 'MA', 'NL', 'PL', 'PT', 'RO', 'RU', 'SE', 'SG', 'SK', 'US'],\n\n /**\n * Return true if and only if the input value is a valid country zip code\n *\n * @param {FormValidation.Base} validator The validator plugin instance\n * @param {jQuery} $field Field element\n * @param {Object} options Consist of key:\n * - message: The invalid message\n * - country: The country\n *\n * The country can be defined by:\n * - An ISO 3166 country code\n * - Name of field which its value defines the country code\n * - Name of callback function that returns the country code\n * - A callback function that returns the country code\n *\n * callback: function(value, validator, $field) {\n * // value is the value of field\n * // validator is the FormValidation.Base instance\n * // $field is jQuery element representing the field\n * }\n *\n * @returns {Boolean|Object}\n */\n validate: function(validator, $field, options, validatorName) {\n var value = validator.getFieldValue($field, validatorName);\n if (value === '' || !options.country) {\n return true;\n }\n\n var locale = validator.getLocale(),\n country = options.country;\n if (typeof country !== 'string' || $.inArray(country, this.COUNTRY_CODES) === -1) {\n // Try to determine the country\n country = validator.getDynamicOption($field, country);\n }\n\n if (!country || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {\n return true;\n }\n\n var isValid = false;\n country = country.toUpperCase();\n switch (country) {\n // http://en.wikipedia.org/wiki/List_of_postal_codes_in_Austria\n case 'AT':\n isValid = /^([1-9]{1})(\\d{3})$/.test(value);\n break;\n\n case 'BG':\n isValid = /^([1-9]{1}[0-9]{3})$/.test($.trim(value));\n break;\n\n case 'BR':\n isValid = /^(\\d{2})([\\.]?)(\\d{3})([\\-]?)(\\d{3})$/.test(value);\n break;\n\n case 'CA':\n isValid = /^(?:A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|X|Y){1}[0-9]{1}(?:A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|W|X|Y|Z){1}\\s?[0-9]{1}(?:A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|W|X|Y|Z){1}[0-9]{1}$/i.test(value);\n break;\n\n case 'CH':\n isValid = /^([1-9]{1})(\\d{3})$/.test(value);\n break;\n\n case 'CZ':\n // Test: http://regexr.com/39hhr\n isValid = /^(\\d{3})([ ]?)(\\d{2})$/.test(value);\n break;\n\n // http://stackoverflow.com/questions/7926687/regular-expression-german-zip-codes\n case 'DE':\n isValid = /^(?!01000|99999)(0[1-9]\\d{3}|[1-9]\\d{4})$/.test(value);\n break;\n\n case 'DK':\n isValid = /^(DK(-|\\s)?)?\\d{4}$/i.test(value);\n break;\n\n // Zip codes in Spain go from 01XXX to 52XXX.\n // Test: http://refiddle.com/1ufo\n case 'ES':\n isValid = /^(?:0[1-9]|[1-4][0-9]|5[0-2])\\d{3}$/.test(value);\n break;\n\n // http://en.wikipedia.org/wiki/Postal_codes_in_France\n case 'FR':\n isValid = /^[0-9]{5}$/i.test(value);\n break;\n\n case 'GB':\n isValid = this._gb(value);\n break;\n\n // Indian PIN (Postal Index Number) validation\n // http://en.wikipedia.org/wiki/Postal_Index_Number\n // Test: http://regex101.com/r/kV0vH3/1\n case 'IN':\n isValid = /^\\d{3}\\s?\\d{3}$/.test(value);\n break;\n\n // http://www.eircode.ie/docs/default-source/Common/prepare-your-business-for-eircode---published-v2.pdf?sfvrsn=2\n // Test: http://refiddle.com/1kpl\n case 'IE':\n isValid = /^(D6W|[ACDEFHKNPRTVWXY]\\d{2})\\s[0-9ACDEFHKNPRTVWXY]{4}$/.test(value);\n break;\n\n // http://en.wikipedia.org/wiki/List_of_postal_codes_in_Italy\n case 'IT':\n isValid = /^(I-|IT-)?\\d{5}$/i.test(value);\n break;\n\n // http://en.wikipedia.org/wiki/List_of_postal_codes_in_Morocco\n case 'MA':\n isValid = /^[1-9][0-9]{4}$/i.test(value);\n break;\n\n // http://en.wikipedia.org/wiki/Postal_codes_in_the_Netherlands\n case 'NL':\n isValid = /^[1-9][0-9]{3} ?(?!sa|sd|ss)[a-z]{2}$/i.test(value);\n break;\n\n // http://en.wikipedia.org/wiki/List_of_postal_codes_in_Poland\n case 'PL':\n isValid = /^[0-9]{2}\\-[0-9]{3}$/.test(value);\n break;\n\n // Test: http://refiddle.com/1l2t\n case 'PT':\n isValid = /^[1-9]\\d{3}-\\d{3}$/.test(value);\n break;\n\n case 'RO':\n isValid = /^(0[1-8]{1}|[1-9]{1}[0-5]{1})?[0-9]{4}$/i.test(value);\n break;\n\n case 'RU':\n isValid = /^[0-9]{6}$/i.test(value);\n break;\n\n case 'SE':\n isValid = /^(S-)?\\d{3}\\s?\\d{2}$/i.test(value);\n break;\n\n case 'SG':\n isValid = /^([0][1-9]|[1-6][0-9]|[7]([0-3]|[5-9])|[8][0-2])(\\d{4})$/i.test(value);\n break;\n\n case 'SK':\n // Test: http://regexr.com/39hhr\n isValid = /^(\\d{3})([ ]?)(\\d{2})$/.test(value);\n break;\n\n case 'US':\n /* falls through */\n default:\n isValid = /^\\d{4,5}([\\-]?\\d{4})?$/.test(value);\n break;\n }\n\n return {\n valid: isValid,\n message: FormValidation.Helper.format(options.message || FormValidation.I18n[locale].zipCode.country, FormValidation.I18n[locale].zipCode.countries[country])\n };\n },\n\n /**\n * Validate United Kingdom postcode\n *\n * @see http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom\n * @param {String} value The postcode\n * @returns {Boolean}\n */\n _gb: function(value) {\n var firstChar = '[ABCDEFGHIJKLMNOPRSTUWYZ]', // Does not accept QVX\n secondChar = '[ABCDEFGHKLMNOPQRSTUVWXY]', // Does not accept IJZ\n thirdChar = '[ABCDEFGHJKPMNRSTUVWXY]',\n fourthChar = '[ABEHMNPRVWXY]',\n fifthChar = '[ABDEFGHJLNPQRSTUWXYZ]',\n regexps = [\n // AN NAA, ANN NAA, AAN NAA, AANN NAA format\n new RegExp('^(' + firstChar + '{1}' + secondChar + '?[0-9]{1,2})(\\\\s*)([0-9]{1}' + fifthChar + '{2})$', 'i'),\n // ANA NAA\n new RegExp('^(' + firstChar + '{1}[0-9]{1}' + thirdChar + '{1})(\\\\s*)([0-9]{1}' + fifthChar + '{2})$', 'i'),\n // AANA NAA\n new RegExp('^(' + firstChar + '{1}' + secondChar + '{1}?[0-9]{1}' + fourthChar + '{1})(\\\\s*)([0-9]{1}' + fifthChar + '{2})$', 'i'),\n\n new RegExp('^(BF1)(\\\\s*)([0-6]{1}[ABDEFGHJLNPQRST]{1}[ABDEFGHJLNPQRSTUWZYZ]{1})$', 'i'), // BFPO postcodes\n /^(GIR)(\\s*)(0AA)$/i, // Special postcode GIR 0AA\n /^(BFPO)(\\s*)([0-9]{1,4})$/i, // Standard BFPO numbers\n /^(BFPO)(\\s*)(c\\/o\\s*[0-9]{1,3})$/i, // c/o BFPO numbers\n /^([A-Z]{4})(\\s*)(1ZZ)$/i, // Overseas Territories\n /^(AI-2640)$/i // Anguilla\n ];\n for (var i = 0; i < regexps.length; i++) {\n if (regexps[i].test(value)) {\n return true;\n }\n }\n\n return false;\n }\n };\n}(jQuery));\n"],"names":["window","FormValidation","AddOn","Framework","I18n","Validator","jQuery","Error","$","version","fn","jquery","split","Base","form","options","namespace","this","$form","extend","formValidation","DEFAULT_OPTIONS","_namespace","$invalidFields","$submitButton","$hiddenButton","STATUS_NOT_VALIDATED","STATUS_VALIDATING","STATUS_INVALID","STATUS_VALID","STATUS_IGNORED","DEFAULT_MESSAGE","_ieVersion","v","div","document","createElement","a","all","innerHTML","documentMode","el","_changeEvent","_submitIfValid","_cacheFields","_init","prototype","constructor","_exceedThreshold","$field","ns","field","attr","threshold","fields","inArray","val","length","that","addOns","autoFocus","button","selector","disabled","control","valid","invalid","err","clazz","container","parent","events","formInit","formPreValidate","formError","formSuccess","fieldAdded","fieldRemoved","fieldInit","fieldError","fieldSuccess","fieldStatus","localeChanged","validatorError","validatorSuccess","validatorIgnored","excluded","icon","validating","feedback","live","locale","message","onPreValidate","onError","onSuccess","row","trigger","verbose","addClass","elementClass","on","e","preventDefault","validate","declarative","find","each","opts","_parseOptions","RegExp","feedbackIcons","group","submitButtons","_parseAddOnOptions","prependTo","css","display","width","height","isDefaultPrevented","$target","target","$button","is","eq","off","submit","_initField","addOn","init","Event","bv","fv","Helper","call","getFieldElements","validators","validatorName","alias","enabled","total","type","updateAll","_getFieldTrigger","map","item","join","i","$parent","closest","$message","_getMessageContainer","remove","updateStatus","data","html","_getMessage","appendTo","$icon","insertAfter","removeClass","_showTooltip","_hideTooltip","_fixIcon","getOptions","onStatus","validator","onIgnored","onLiveChange","validateField","element","_isExcluded","excludedAttr","trim","name","event","get","tagName","cssClasses","test","attrMap","option","names","replace","html5Attributes","toLowerCase","attrName","optionName","optionAttrName","optionValue","html5AttrName","html5AttrMap","aliasAttr","validatorSet","attributes","attribute","value","enableByHtml5","onerror","onsuccess","transformer","emptyOptions","isEmptyObject","_submit","isValid","eventType","_onSuccess","_onError","f","isOptionEnabled","focus","_onFieldValidated","counter","numValidators","result","not","add","disableSubmitButtons","defaultSubmit","_createTooltip","_destroyTooltip","removeAttr","getFieldValue","getNamespace","getStatus","isValidField","isValidContainer","$container","push","$f","$errors","filter","status","offLiveChange","$fields","handler","apply","arguments","updateMessage","isValidating","isNotValidated","$allErrors","show","numIgnored","hide","validateResult","stop","reject","resolve","done","response","removeData","undefined","addField","destroy","end","enableFieldValidators","getDynamicOption","getForm","getInvalidFields","getLocale","getMessages","messages","concat","getSubmitButton","removeField","resetField","resetValue","prop","resetForm","revalidateField","setLocale","updateOption","validateContainer","params","$this","framework","substr","toUpperCase","Array","slice","Constructor","functionName","args","substring","func","pop","context","date","year","month","day","notInFuture","isNaN","parseInt","numDays","currentDate","Date","currentYear","getFullYear","currentMonth","getMonth","currentDay","getDate","format","parameters","isArray","luhn","mul","prodArr","sum","charAt","mod11And10","check","mod37And36","alphabet","modulus","Math","floor","indexOf","base64","between","notInclusive","min","max","inclusive","_format","isNumeric","minValue","maxValue","parseFloat","bic","blank","callback","dfd","Deferred","choice","less","more","numChoices","color","SUPPORTED_TYPES","KEYWORD_COLORS","types","method","_hex","_hsl","_hsla","_keyword","_rgb","_rgba","creditCard","cards","AMERICAN_EXPRESS","prefix","DINERS_CLUB","DINERS_CLUB_US","DISCOVER","JCB","LASER","MAESTRO","MASTERCARD","SOLO","UNIONPAY","VISA","cusip","converted","code","charCodeAt","num","cvv","ccfield","creditCardField","creditCardType","range","separator","formats","dateFormat","timeFormat","amOrPm","sections","time","minutes","hours","seconds","minOption","maxOption","parse","_parseDate","_formatDate","getTime","dateSection","timeSection","replacer","d","dd","m","mm","yy","yyyy","h","getHours","hh","H","HH","M","getMinutes","MM","s","getSeconds","ss","match","different","compareWith","compareValue","digits","ean","weight","ein","CAMPUS","ANDOVER","ATLANTA","AUSTIN","BROOKHAVEN","CINCINNATI","FRESNO","KANSAS_CITY","MEMPHIS","OGDEN","PHILADELPHIA","INTERNET","SMALL_BUSINESS_ADMINISTRATION","campus","key","emailAddress","multiple","emailRegExp","addresses","_splitEmailAddresses","emailAddresses","quotedFragments","quotedFragmentCount","emailAddressArray","nextEmailAddress","splitEmailAddressFragments","splitEmailAddressFragmentCount","j","file","extension","maxfiles","minfiles","maxsize","minsize","maxtotalsize","mintotalsize","ext","extensions","File","FileList","FileReader","files","totalSize","maxFiles","minFiles","size","lastIndexOf","minSize","maxSize","maxTotalSize","minTotalSize","greaterThan","compareTo","compareToValue","grid","hex","iban","country","countries","AD","AE","AL","AO","AT","AZ","BA","BE","BF","BG","BH","BI","BJ","BR","CH","CI","CM","CR","CV","CY","CZ","DE","DK","DO","DZ","EE","ES","FI","FO","FR","GB","GE","GI","GL","GR","GT","HR","HU","IE","IL","IR","IS","IT","JO","KW","KZ","LB","LI","LT","LU","LV","MC","MD","ME","MG","MK","ML","MR","MT","MU","MZ","NL","NO","PK","PL","PS","PT","QA","RO","RS","SA","SE","SI","SK","SM","SN","TL","TN","TR","VG","XK","sepa","REGEX","SEPA_COUNTRIES","isSepaCountry","n","temp","id","CL","CN","TH","ZA","COUNTRY_CODES","_validateJMBG","countryCode","rr","k","_ba","_mk","_me","_rs","_si","_bg","_br","d1","d2","_ch","_cl","_cn","adminDivisionCodes","provincial","prefectural","county","dob","inRange","rangeDef","_cz","_dk","_ee","_lt","_es","isDNI","isNIE","isCIF","index","letter","tmp","lastDigit","_fi","_hr","_ie","getCheckDigit","_is","century","gender","_lv","_nl","_pl","_ro","_se","_sk","_sm","_th","_za","identical","imei","imo","integer","thousandsseparator","decimalseparator","validity","badInput","decimalSeparator","thousandsSeparator","testRegexp","thousandsReplacer","isFinite","ip","ipv4","ipv6","ipv4Regex","ipv6Regex","isbn","checksum","chars","isin","c","toString","ismn","issn","lessThan","mac","meid","cd","cdCalc","notEmpty","required","numeric","phone","IN","MA","RU","US","VE","promise","fail","regexp","pattern","remote","crossdomain","datatype","delay","url","validkey","timer","clearTimeout","validKey","JSON","ajaxOptions","dataType","headers","runCallback","xhr","ajax","success","error","abort","crossDomain","setTimeout","rtn","sedol","siren","siret","step","base","baseValue","mod","x","y","dotX","dotY","precision","pow","sign","round","floatMod","stringCase","upper","stringLength","utf8bytes","maxLength","minLength","utf8Bytes","str","utf8Length","uri","allowlocal","allowemptyprotocol","protocol","allowLocal","allowEmptyProtocol","uuid","patterns","vat","EL","_at","_be","egn","pnf","cnpj","numbers","pos","_cy","translation","_de","first","dni","nie","cif","_fr","_gb","firstTwo","lastThree","_gr","_el","_hu","_it","_lu","_mt","_no","_pt","_ru","sum1","weight1","sum2","weight2","res","_ve","vin","A","B","C","D","E","F","G","J","K","L","N","P","R","S","T","U","V","W","X","Y","Z","weights","reminder","zipCode","CA","SG","firstChar","secondChar","fifthChar","regexps"],"sourceRoot":""}