{"version":3,"file":"kendo.validator.min.js","names":["factory","define","amd","$","undefined$1","kendo","window","Widget","ui","NS","INVALIDMSG","invalidMsgRegExp","RegExp","INVALIDINPUT","VALIDINPUT","VALIDATIONSUMMARY","INVALIDLABEL","MESSAGEBOX","ARIAINVALID","emailRegExp","urlRegExp","INPUTSELECTOR","CHECKBOXSELECTOR","NUMBERINPUTSELECTOR","BLUR","NAME","FORM","NOVALIDATE","VALIDATE","CHANGE","VALIDATE_INPUT","patternMatcher","value","pattern","test","matcher","input","selector","val","filter","length","hasAttribute","name","attributes","parseHtml","text","parseHTML","searchForMessageContainer","elements","fieldName","element","containers","idx","className","getAttribute","attr","add","isLabelFor","label","nodeName","validator","rules","messages","allowSubmit","noop","validateOnInit","SUMMARYTEMPLATE","ref","errors","result","i","Validator","extend","init","options","that","this","resolved","resolvers","ruleResolvers","resolve","resolveRules","validateAttributeSelector","fn","call","_errorTemplate","template","errorTemplate","_summaryTemplate","validationSummary","is","_inputSelector","_checkboxSelector","_errors","_attachEvents","_isValidated","_validateOnInit","validate","events","message","required","min","max","step","email","url","date","dateCompare","captcha","noNameCheckbox","quote","indexOf","namedCheckbox","find","checkbox","radio","parseFloat","raise","decimals","split","Math","pow","floor","parseDate","widgetInstance","isValidated","isValid","data","getCaptchaId","_validating","done","_checkElement","fail","error","console","warn","removeData","validateOnBlur","_allowSubmit","destroy","off","_submit","e","stopPropagation","stopImmediatePropagation","preventDefault","state","validateInput","trigger","on","bind","inputs","invalid","eq","showValidationSummary","valid","_checkValidity","lbl","_findMessageContainer","next","addClass","messageText","_extractMessage","key","messageLabel","replace","field","wasValid","isInputInner","inputWrapper","parent","removeAttr","hasClass","closest","lblId","_decorateMessageContainer","replaceWith","parentElement","get","nextElement","prevElement","prev","wrapper","insertAfter","removeClass","_inputWrapper","toggleClass","inputWrap","inputLabel","_inputLabel","errorId","_associateMessageContainer","hideMessages","_disassociateMessageContainers","reset","labels","hideValidationSummary","locators","messageLocators","getElementsByTagName","locate","container","decorate","ruleKey","nonDefaultMessage","customMessage","prototype","isFunction","format","rule","results","push","setOptions","deepExtend","_setEvents","_getInputNames","sorted","nextFocusable","getWidgetFocusableElement","toggleAttribute","addBack","_errorsByName","inputNames","_renderSummary","insertBefore","join","_summaryClick","link","target","errorsList","summary","html","plugin","jQuery"],"sources":["kendo.validator.js"],"mappings":"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","sourcesContent":["(function (factory) {\n    typeof define === 'function' && define.amd ? define(['kendo.core'], factory) :\n    factory();\n})((function () {\n    var __meta__ = {\n        id: \"validator\",\n        name: \"Validator\",\n        category: \"web\",\n        description: \"The Validator offers an easy way to do a client-side form validation.\",\n        depends: [ \"core\" ]\n    };\n\n\n    (function($, undefined$1) {\n        var kendo = window.kendo,\n            Widget = kendo.ui.Widget,\n            NS = \".kendoValidator\",\n            INVALIDMSG = \"k-invalid-msg\",\n            invalidMsgRegExp = new RegExp(INVALIDMSG,'i'),\n            INVALIDINPUT = \"k-invalid\",\n            VALIDINPUT = \"k-valid\",\n            VALIDATIONSUMMARY = \"k-validation-summary\",\n            INVALIDLABEL = \"k-text-error\",\n            MESSAGEBOX = \"k-messagebox k-messagebox-error\",\n            INPUTINNER = \".k-input-inner\",\n            INPUTWRAPPER = \".k-input\",\n            ARIAINVALID = \"aria-invalid\",\n            ARIADESCRIBEDBY = \"aria-describedby\",\n            emailRegExp = /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[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])?)*$/i,\n            urlRegExp = /^(https?|ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i,\n            INPUTSELECTOR = \":input:not(:button,[type=submit],[type=reset],[disabled],[readonly])\",\n            CHECKBOXSELECTOR = \":checkbox:not([disabled],[readonly])\",\n            NUMBERINPUTSELECTOR = \"[type=number],[type=range]\",\n            BLUR = \"blur\",\n            NAME = \"name\",\n            FORM = \"form\",\n            NOVALIDATE = \"novalidate\",\n            //events\n            VALIDATE = \"validate\",\n            CHANGE = \"change\",\n            VALIDATE_INPUT = \"validateInput\",\n\n            patternMatcher = function(value, pattern) {\n                if (typeof pattern === \"string\") {\n                    pattern = new RegExp('^(?:' + pattern + ')$');\n                }\n                return pattern.test(value);\n            },\n            matcher = function(input, selector, pattern) {\n                var value = input.val();\n\n                if (input.filter(selector).length && value !== \"\") {\n                    return patternMatcher(value, pattern);\n                }\n                return true;\n            },\n            hasAttribute = function(input, name) {\n                if (input.length) {\n                    return input[0].attributes[name] != null;\n                }\n                return false;\n            };\n\n        if (!kendo.ui.validator) {\n            kendo.ui.validator = { rules: {}, messages: {}, allowSubmit: $.noop, validateOnInit: $.noop };\n        }\n\n        function resolveRules(element) {\n            var resolvers = kendo.ui.validator.ruleResolvers || {},\n                rules = {},\n                name;\n\n            for (name in resolvers) {\n                $.extend(true, rules, resolvers[name].resolve(element));\n            }\n            return rules;\n        }\n\n        function decode(value) {\n            return value.replace(/&amp/g, '&amp;')\n                .replace(/&quot;/g, '\"')\n                .replace(/&#39;/g, \"'\")\n                .replace(/&lt;/g, '<')\n                .replace(/&gt;/g, '>');\n        }\n\n        function numberOfDecimalDigits(value) {\n            value = (value + \"\").split('.');\n            if (value.length > 1) {\n                return value[1].length;\n            }\n            return 0;\n        }\n\n        function parseHtml(text) {\n            if ($.parseHTML) {\n                return $($.parseHTML(text));\n            }\n            return $(text);\n        }\n\n        function searchForMessageContainer(elements, fieldName) {\n            var containers = $(),\n                element,\n                attr;\n\n            for (var idx = 0, length = elements.length; idx < length; idx++) {\n                element = elements[idx];\n                if (invalidMsgRegExp.test(element.className)) {\n                    attr = element.getAttribute(kendo.attr(\"for\"));\n                    if (attr === fieldName) {\n                        containers = containers.add(element);\n                    }\n                }\n            }\n            return containers;\n        }\n\n        function isLabelFor(label, element) {\n            if (!label) {\n                return false;\n            }\n            if (typeof label.nodeName !== 'string' || label.nodeName !== 'LABEL') {\n                return false;\n            }\n            if (typeof label.getAttribute('for') !== 'string' || typeof element.getAttribute('id') !== 'string') {\n                return false;\n            }\n            if (label.getAttribute('for') !== element.getAttribute('id')) {\n                return false;\n            }\n\n            return true;\n        }\n\n        var SUMMARYTEMPLATE = function (ref) {\n            var errors = ref.errors;\n\n            var result = '<ul>';\n            for (var i = 0; i < errors.length; i += 1) {\n                result += \"<li><a data-field=\\\"\" + (errors[i].field) + \"\\\" href=\\\"#\\\">\" + (errors[i].message) + \"</a></li>\";\n            }\n\n            result += '</ul>';\n            return result;\n        };\n\n        var Validator = Widget.extend({\n            init: function(element, options) {\n                var that = this,\n                    resolved = resolveRules(element),\n                    validateAttributeSelector = \"[\" + kendo.attr(\"validate\") + \"!=false]\";\n\n                options = options || {};\n\n                options.rules = $.extend({}, kendo.ui.validator.rules, resolved.rules, options.rules);\n                options.messages = $.extend({}, kendo.ui.validator.messages, resolved.messages, options.messages);\n\n                Widget.fn.init.call(that, element, options);\n\n                that._errorTemplate = kendo.template(that.options.errorTemplate);\n                that._summaryTemplate = kendo.template(that.options.validationSummary.template || SUMMARYTEMPLATE);\n\n                if (that.element.is(FORM)) {\n                    that.element.attr(NOVALIDATE, NOVALIDATE);\n                }\n\n                that._inputSelector = INPUTSELECTOR + validateAttributeSelector;\n                that._checkboxSelector = CHECKBOXSELECTOR + validateAttributeSelector;\n\n                that._errors = {};\n                that._attachEvents();\n                that._isValidated = false;\n\n                if (that._validateOnInit()) {\n                    that.validate();\n                }\n            },\n\n            events: [ VALIDATE, CHANGE, VALIDATE_INPUT ],\n\n            options: {\n                name: \"Validator\",\n                errorTemplate: function (ref) {\n                    var message = ref.message;\n\n                    return (\"<span class=\\\"k-form-error\\\">\" + message + \"</span>\");\n        },\n                messages: {\n                    required: \"{0} is required\",\n                    pattern: \"{0} is not valid\",\n                    min: \"{0} should be greater than or equal to {1}\",\n                    max: \"{0} should be smaller than or equal to {1}\",\n                    step: \"{0} is not valid\",\n                    email: \"{0} is not valid email\",\n                    url: \"{0} is not valid URL\",\n                    date: \"{0} is not valid date\",\n                    dateCompare: \"End date should be greater than or equal to the start date\",\n                    captcha: \"The text you entered doesn't match the image.\"\n                },\n                rules: {\n                    required: function(input) {\n                        var noNameCheckbox = !input.attr(\"name\") && !input.is(\":checked\"),\n                            name = input.attr(\"name\"),\n                            quote = !!name && name.indexOf(\"'\") > -1 ? '\\\"' : \"'\",\n                            namedCheckbox = input.attr(\"name\") && !this.element.find(\"input[name=\" + quote + input.attr(\"name\") + quote + \"]:checked\").length,\n                            checkbox = input.filter(\"[type=checkbox]\").length && (noNameCheckbox || namedCheckbox),\n                            radio = input.filter(\"[type=radio]\").length && !this.element.find(\"input[name=\" + quote + input.attr(\"name\") + quote + \"]:checked\").length,\n                            value = input.val();\n\n                        return !(hasAttribute(input, \"required\") && (!value || value === \"\" || value.length === 0 || checkbox || radio));\n                    },\n                    pattern: function(input) {\n                        if (input.filter(\"[type=text],[type=email],[type=url],[type=tel],[type=search],[type=password]\").filter(\"[pattern]\").length && input.val() !== \"\") {\n                            return patternMatcher(input.val(), input.attr(\"pattern\"));\n                        }\n                        return true;\n                    },\n                    min: function(input) {\n                        if (input.filter(NUMBERINPUTSELECTOR + \",[\" + kendo.attr(\"type\") + \"=number]\").filter(\"[min]\").length && input.val() !== \"\") {\n                            var min = parseFloat(input.attr(\"min\")) || 0,\n                                val = kendo.parseFloat(input.val());\n\n                            return min <= val;\n                        }\n                        return true;\n                    },\n                    max: function(input) {\n                        if (input.filter(NUMBERINPUTSELECTOR + \",[\" + kendo.attr(\"type\") + \"=number]\").filter(\"[max]\").length && input.val() !== \"\") {\n                            var max = parseFloat(input.attr(\"max\")) || 0,\n                                val = kendo.parseFloat(input.val());\n\n                            return max >= val;\n                        }\n                        return true;\n                    },\n                    step: function(input) {\n                        if (input.filter(NUMBERINPUTSELECTOR + \",[\" + kendo.attr(\"type\") + \"=number]\").filter(\"[step]\").length && input.val() !== \"\") {\n                            var min = parseFloat(input.attr(\"min\")) || 0,\n                                step = parseFloat(input.attr(\"step\")) || 1,\n                                val = parseFloat(input.val()),\n                                decimals = numberOfDecimalDigits(step),\n                                raise;\n\n                            if (decimals) {\n                                raise = Math.pow(10, decimals);\n                                return ((Math.floor((val - min) * raise)) % (step * raise)) / Math.pow(100, decimals) === 0;\n                            }\n                            return ((val - min) % step) === 0;\n                        }\n                        return true;\n                    },\n                    email: function(input) {\n                        return matcher(input, \"[type=email],[\" + kendo.attr(\"type\") + \"=email]\", emailRegExp);\n                    },\n                    url: function(input) {\n                        return matcher(input, \"[type=url],[\" + kendo.attr(\"type\") + \"=url]\", urlRegExp);\n                    },\n                    date: function(input) {\n                        if (input.filter(\"[type^=date],[\" + kendo.attr(\"type\") + \"=date]\").length && input.val() !== \"\") {\n                            return kendo.parseDate(input.val(), input.attr(kendo.attr(\"format\"))) !== null;\n                        }\n                        return true;\n                    },\n                    captcha: function(input) {\n                        if (input.filter(\"[\" + kendo.attr(\"role\") + \"=captcha]\").length) {\n                            var that = this,\n                                captcha = kendo.widgetInstance(input),\n                                isValidated = function(isValid) {\n                                    return typeof(isValid) !== 'undefined' && isValid !== null;\n                                };\n\n                            if (!input.data(\"captcha_validating\") && !isValidated(captcha.isValid()) && !!captcha.getCaptchaId()) {\n                                input.data(\"captcha_validating\", true);\n                                that._validating = true;\n                                captcha.validate().done(function() {\n                                    that._validating = false;\n                                    that._checkElement(input);\n                                }).fail(function(data) {\n                                    that._validating = false;\n                                    if (data.error && data.error === \"handler_not_defined\") {\n                                        window.console.warn(\"Captcha's validationHandler is not defined! You should either define a proper validation endpoint or declare a callback function to ensure the required behavior.\");\n                                    }\n                                });\n                            }\n\n                            if (isValidated(captcha.isValid())) {\n                                input.removeData(\"captcha_validating\");\n                                return captcha.isValid();\n                            }\n                        }\n                        return true;\n                    }\n                },\n                validateOnBlur: true,\n                validationSummary: false\n            },\n\n            _allowSubmit: function() {\n                return kendo.ui.validator.allowSubmit(this.element, this.errors());\n            },\n\n            _validateOnInit: function() {\n                return kendo.ui.validator.validateOnInit(this.element);\n            },\n\n            destroy: function() {\n                Widget.fn.destroy.call(this);\n\n                this.element.off(NS);\n\n                if (this.validationSummary) {\n                    this.validationSummary.off(NS);\n                    this.validationSummary = null;\n                }\n            },\n\n            value: function() {\n                if (!this._isValidated) {\n                    return false;\n                }\n\n                return this.errors().length === 0;\n            },\n\n            _submit: function(e) {\n                if ((!this.validate() && !this._allowSubmit()) || this._validating) {\n                    e.stopPropagation();\n                    e.stopImmediatePropagation();\n                    e.preventDefault();\n                    return false;\n                }\n                return true;\n            },\n\n            _checkElement: function(element) {\n                var state = this.value();\n\n                this.validateInput(element);\n\n                if (this.value() !== state) {\n                    this.trigger(CHANGE);\n                }\n            },\n\n            _attachEvents: function() {\n                var that = this;\n\n                if (that.element.is(FORM)) {\n                    that.element.on(\"submit\" + NS, that._submit.bind(that));\n                }\n\n                if (that.options.validateOnBlur) {\n                    if (!that.element.is(INPUTSELECTOR)) {\n                        that.element.on(BLUR + NS, that._inputSelector, function() {\n                            that._checkElement($(this));\n                        });\n\n                        that.element.on(\"click\" + NS, that._checkboxSelector, function() {\n                            that._checkElement($(this));\n                        });\n                    } else {\n                        that.element.on(BLUR + NS, function() {\n                            that._checkElement(that.element);\n                        });\n\n                        if (that.element.is(CHECKBOXSELECTOR)) {\n                            that.element.on(\"click\" + NS, function() {\n                                that._checkElement(that.element);\n                            });\n                        }\n                    }\n                }\n            },\n\n            validate: function() {\n                var inputs;\n                var idx;\n                var result = false;\n                var length;\n\n                var isValid = this.value();\n\n                this._errors = {};\n\n                if (!this.element.is(INPUTSELECTOR)) {\n                    var invalid = false;\n\n                    inputs = this.element.find(this._inputSelector);\n\n                    for (idx = 0, length = inputs.length; idx < length; idx++) {\n                        if (!this.validateInput(inputs.eq(idx))) {\n                            invalid = true;\n                        }\n                    }\n\n                    result = !invalid;\n                } else {\n                    result = this.validateInput(this.element);\n                }\n\n                if (this.options.validationSummary && !isValid) {\n                    this.showValidationSummary();\n                }\n\n                this.trigger(VALIDATE, { valid: result, errors: this.errors() });\n\n                if (isValid !== result) {\n                    this.trigger(CHANGE);\n                }\n\n                return result;\n            },\n\n            validateInput: function(input) {\n                input = $(input);\n\n\n                this._isValidated = true;\n\n                var that = this,\n                    template = that._errorTemplate,\n                    result = that._checkValidity(input),\n                    valid = result.valid,\n                    widgetInstance,\n                    className = \".\" + INVALIDMSG,\n                    fieldName = (input.attr(NAME) || \"\"),\n                    lbl = that._findMessageContainer(fieldName).add(input.next(className).filter(function() {\n                        var element = $(this);\n                        if (element.filter(\"[\" + kendo.attr(\"for\") + \"]\").length) {\n                            return element.attr(kendo.attr(\"for\")) === fieldName;\n                        }\n\n                        return true;\n\n                    })).addClass(\"k-hidden\"),\n                    messageText = !valid ? that._extractMessage(input, result.key) : \"\",\n                    messageLabel = !valid ? parseHtml(template({ message: decode(messageText), field: fieldName })) : \"\",\n                    wasValid = !input.attr(ARIAINVALID),\n                    isInputInner = input.is(INPUTINNER),\n                    inputWrapper = input.parent(INPUTWRAPPER);\n\n                input.removeAttr(ARIAINVALID);\n\n                if (input.hasClass(\"k-hidden\")) {\n                    widgetInstance = kendo.widgetInstance(input.closest(\".k-signature\"));\n                }\n\n                if (!valid && !input.data(\"captcha_validating\")) {\n                    that._errors[fieldName] = messageText;\n                    var lblId = lbl.attr('id');\n\n                    that._decorateMessageContainer(messageLabel, fieldName);\n\n\n                    if (lblId) {\n                        messageLabel.attr('id', lblId);\n                    }\n\n                    if (lbl.length !== 0) {\n                        lbl.replaceWith(messageLabel);\n                    } else {\n                        widgetInstance = widgetInstance || kendo.widgetInstance(input);\n                        var parentElement = input.parent().get(0);\n                        var nextElement = input.next().get(0);\n                        var prevElement = input.prev().get(0);\n\n                        // Get the instance of the RadioGroup which is not initialized on the input element\n                        if (!widgetInstance && input.is(\"[type=radio]\")) {\n                            widgetInstance = kendo.widgetInstance(input.closest(\".k-radio-list\"));\n                        }\n\n                        // Get the instance of the CheckBoxGroup which is not initialized on the input element\n                        if (!widgetInstance && input.is(\"[type=checkbox]\")) {\n                            widgetInstance = kendo.widgetInstance(input.closest(\".k-checkbox-list\"));\n                        }\n\n                        if (widgetInstance && widgetInstance.wrapper && (widgetInstance.element !== widgetInstance.wrapper || widgetInstance.options.name == \"Signature\")) {\n                            messageLabel.insertAfter(widgetInstance.wrapper);\n                        } else if (parentElement && parentElement.nodeName === \"LABEL\") {\n                            // Input inside label\n                            messageLabel.insertAfter(parentElement);\n                        } else if (nextElement && isLabelFor(nextElement, input[0])) {\n                            // Input before label\n                            messageLabel.insertAfter(nextElement);\n                        } else if (prevElement && isLabelFor(prevElement, input[0])) {\n                            // Input after label\n                            messageLabel.insertAfter(input);\n                        } else if (isInputInner && inputWrapper.length) {\n                            // Input after input wrapper\n                            messageLabel.insertAfter(inputWrapper);\n                        } else {\n                            messageLabel.insertAfter(input);\n                        }\n                    }\n\n                    messageLabel.removeClass(\"k-hidden\");\n\n                    input.attr(ARIAINVALID, true);\n                } else {\n                    delete that._errors[fieldName];\n                }\n\n                if (wasValid !== valid) {\n                    this.trigger(VALIDATE_INPUT, { valid: valid, input: input, error: messageText, field: fieldName });\n                }\n\n                widgetInstance = (widgetInstance && widgetInstance.options.name == \"Signature\") ? widgetInstance : kendo.widgetInstance(input);\n                if (!widgetInstance || !(widgetInstance._inputWrapper || widgetInstance.wrapper)) {\n                    input.toggleClass(INVALIDINPUT, !valid);\n                    input.toggleClass(VALIDINPUT, valid);\n                }\n\n                if (widgetInstance) {\n                    var inputWrap = widgetInstance._inputWrapper || widgetInstance.wrapper;\n                    var inputLabel = widgetInstance._inputLabel;\n\n                    if (inputWrap) {\n                        inputWrap.toggleClass(INVALIDINPUT, !valid);\n                        inputWrap.toggleClass(VALIDINPUT, valid);\n                    }\n                    if (inputLabel) {\n                        inputLabel.toggleClass(INVALIDLABEL, !valid);\n                    }\n                }\n\n                if (wasValid !== valid) {\n                    var errorId = messageLabel ? messageLabel.attr(\"id\") : lbl.attr(\"id\");\n\n                    that._associateMessageContainer(input, errorId);\n\n                    if (this.options.validationSummary && this.options.validateOnBlur) {\n                        this.showValidationSummary();\n                    }\n                }\n\n                return valid;\n            },\n\n            hideMessages: function() {\n                var that = this,\n                    className = \".\" + INVALIDMSG,\n                    element = that.element;\n\n                that._disassociateMessageContainers();\n\n                if (!element.is(INPUTSELECTOR)) {\n                    element.find(className).addClass(\"k-hidden\");\n                } else {\n                    element.next(className).addClass(\"k-hidden\");\n                }\n            },\n\n            reset: function() {\n                var that = this,\n                    inputs = that.element.find(\".\" + INVALIDINPUT),\n                    labels = that.element.find(\".\" + INVALIDLABEL);\n\n                that._errors = [];\n\n                that.hideMessages();\n\n                that.hideValidationSummary();\n\n                inputs.removeAttr(ARIAINVALID);\n                inputs.removeClass(INVALIDINPUT);\n                labels.removeClass(INVALIDLABEL);\n            },\n\n            _findMessageContainer: function(fieldName) {\n                var locators = kendo.ui.validator.messageLocators,\n                    name,\n                    containers = $();\n\n                for (var idx = 0, length = this.element.length; idx < length; idx++) {\n                    containers = containers.add(searchForMessageContainer(this.element[idx].getElementsByTagName(\"*\"), fieldName));\n                }\n\n                for (name in locators) {\n                    containers = containers.add(locators[name].locate(this.element, fieldName));\n                }\n\n                return containers;\n            },\n\n            _decorateMessageContainer: function(container, fieldName) {\n                var locators = kendo.ui.validator.messageLocators,\n                    name;\n\n                container.addClass(INVALIDMSG)\n                    .attr(kendo.attr(\"for\"), fieldName || \"\");\n\n                if (!container.attr(\"id\")) {\n                    container.attr(\"id\", fieldName + \"-error\");\n                }\n\n                for (name in locators) {\n                    locators[name].decorate(container, fieldName);\n                }\n            },\n\n            _extractMessage: function(input, ruleKey) {\n                var that = this,\n                    customMessage = that.options.messages[ruleKey],\n                    fieldName = input.attr(NAME),\n                    nonDefaultMessage;\n\n                if (!kendo.ui.Validator.prototype.options.messages[ruleKey]) {\n                     nonDefaultMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage;\n                }\n\n                customMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage;\n\n                return kendo.format(input.attr(kendo.attr(ruleKey + \"-msg\")) || input.attr(\"validationMessage\") || nonDefaultMessage || customMessage || input.attr(\"title\") || \"\",\n                    fieldName,\n                    input.attr(ruleKey) || input.attr(kendo.attr(ruleKey)));\n            },\n\n            _checkValidity: function(input) {\n                var rules = this.options.rules,\n                    rule;\n\n                for (rule in rules) {\n                    if (!rules[rule].call(this, input)) {\n                        return { valid: false, key: rule };\n                    }\n                }\n\n                return { valid: true };\n            },\n\n            errors: function() {\n                var results = [],\n                    errors = this._errors,\n                    error;\n\n                for (error in errors) {\n                    results.push(errors[error]);\n                }\n                return results;\n            },\n\n            setOptions: function(options) {\n                if (options.validationSummary) {\n                    this.hideValidationSummary();\n                }\n\n                kendo.deepExtend(this.options, options);\n\n                this.destroy();\n\n                this.init(this.element, this.options);\n\n                this._setEvents(this.options);\n            },\n\n            _getInputNames: function() {\n                var that = this,\n                    inputs = that.element.find(that._inputSelector),\n                    sorted = [];\n\n                for (var idx = 0, length = inputs.length; idx < length; idx++) {\n                    var input = $(inputs[idx]);\n\n                    if (hasAttribute(input, NAME)) {\n                        // Add current name if:\n                        // - not present so far;\n                        // - present but not part of CheckBoxGroup or RadioGroup.\n                        if (sorted.indexOf(input.attr(NAME)) === -1 ||\n                            (input.closest(\".k-checkbox-list\").length === 0 &&\n                            input.closest(\".k-radio-list\").length === 0)) {\n                                sorted.push(input.attr(NAME));\n                        }\n                    }\n                }\n\n                return sorted;\n            },\n\n            _associateMessageContainer: function(input, errorId) {\n                var nextFocusable = kendo.getWidgetFocusableElement(input);\n\n                if (!nextFocusable || !errorId) {\n                    return;\n                }\n\n                kendo.toggleAttribute(nextFocusable, ARIADESCRIBEDBY, errorId);\n            },\n\n            _disassociateMessageContainers: function() {\n                var that = this,\n                    inputs = that.element.find(\".\" + INVALIDINPUT).addBack(),\n                    input, errorId;\n\n                for (var i = 0; i < inputs.length; i += 1) {\n                    input = $(inputs[i]);\n\n                    if (input.is(\"input\")) {\n                        errorId = that._findMessageContainer(input.attr(NAME))\n                            .add(input.next(\".\" + INVALIDMSG))\n                            .attr(\"id\");\n\n                        that._associateMessageContainer(input, errorId);\n                    }\n                }\n            },\n\n            _errorsByName: function() {\n                var that = this,\n                    inputNames = that._getInputNames(),\n                    sorted = [];\n\n                for (var i = 0; i < inputNames.length; i += 1) {\n                    var name = inputNames[i];\n\n                    if (that._errors[name]) {\n                        sorted.push({\n                            field: name,\n                            message: that._errors[name]\n                        });\n                    }\n                }\n\n                return sorted;\n            },\n\n            _renderSummary: function() {\n                var that = this,\n                    options = this.options.validationSummary,\n                    element = this.element,\n                    prevElement = element.prev(),\n                    container;\n\n                if (options.container) {\n                    container = $(options.container);\n                } else if (prevElement && prevElement.hasClass(VALIDATIONSUMMARY)) {\n                    container = prevElement;\n                } else {\n                    container = $(\"<div />\").insertBefore(that.element);\n                }\n\n                container.addClass([VALIDATIONSUMMARY, MESSAGEBOX].join(\" \"));\n                container.attr(\"role\", \"alert\");\n\n                container.on(\"click\" + NS, that._summaryClick.bind(that));\n\n                return container;\n            },\n\n            _summaryClick: function(e) {\n                e.preventDefault();\n\n                var that = this,\n                    link = $(e.target),\n                    target = that.element.find(\"[name='\" + link.data(\"field\") + \"']\"),\n                    nextFocusable;\n\n                if (!target.length) {\n                    return;\n                }\n\n                nextFocusable = kendo.getWidgetFocusableElement(target);\n\n                if (nextFocusable) {\n                    nextFocusable.trigger(\"focus\");\n                }\n            },\n\n            showValidationSummary: function() {\n                var that = this,\n                    summary = that.validationSummary,\n                    errors = that._errorsByName(),\n                    errorsList;\n\n                if (!summary) {\n                    summary = that.validationSummary = that._renderSummary();\n                }\n\n                errorsList = parseHtml(that._summaryTemplate({\n                    errors: errors\n                }));\n\n                summary.html(errorsList);\n\n                summary.toggleClass(\"k-hidden\", !errors.length);\n            },\n\n            hideValidationSummary: function() {\n                var that = this,\n                    summary = that.validationSummary;\n\n                if (!summary) {\n                    return;\n                }\n\n                summary.addClass(\"k-hidden\");\n            }\n        });\n\n        kendo.ui.plugin(Validator);\n    })(window.kendo.jQuery);\n\n}));\n"]}