{"version":3,"file":"kendo.maskedtextbox.min.js","sources":["kendo.maskedtextbox.js"],"sourcesContent":["/*!\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n*/\n(function(f, define){\n define('kendo.maskedtextbox',[ \"./kendo.core\", \"./kendo.floatinglabel\" ], f);\n})(function(){\n\nvar __meta__ = { // jshint ignore:line\n id: \"maskedtextbox\",\n name: \"MaskedTextBox\",\n category: \"web\",\n description: \"The MaskedTextBox widget allows to specify a mask type on an input field.\",\n depends: [\"core\", \"floatinglabel\"]\n};\n\n(function($, undefined) {\n var global = window;\n var min = global.Math.min;\n var kendo = global.kendo;\n var caret = kendo.caret;\n var keys = kendo.keys;\n var ui = kendo.ui;\n var Widget = ui.Widget;\n var NS = \".kendoMaskedTextBox\";\n var isPlainObject = $.isPlainObject;\n var proxy = $.proxy;\n var setTimeout = window.setTimeout;\n\n var LABELCLASSES = \"k-label k-input-label\";\n var STATEDISABLED = \"k-disabled\";\n var STATEINVALID = \"k-invalid\";\n var FOCUSED = \"k-focus\";\n var DISABLED = \"disabled\";\n var READONLY = \"readonly\";\n var CHANGE = \"change\";\n var MOUSEUP = \"mouseup\";\n var DROP = \"drop\";\n var KEYDOWN = \"keydown\";\n var PASTE = \"paste\";\n var INPUT = \"input\";\n\n function ns(name) { return name + NS; }\n\n var INPUT_EVENT_NAME = ns(kendo.support.propertyChangeEvent ? \"propertychange\" : INPUT);\n\n function stringDiffStart(str1, str2) {\n var i = 0;\n while (i < str2.length) {\n if (str1[i] !== str2[i]) {\n break;\n }\n i++;\n }\n\n return i;\n }\n var MaskedTextBox = Widget.extend({\n init: function(element, options) {\n var that = this;\n var DOMElement;\n\n Widget.fn.init.call(that, element, options);\n\n that._rules = $.extend({}, that.rules, that.options.rules);\n\n element = that.element;\n DOMElement = element[0];\n\n that._wrapper();\n that._tokenize();\n that._form();\n\n that.element\n .addClass(\"k-input-inner\")\n .attr(\"autocomplete\", \"off\")\n .on(\"focus\" + NS, function() {\n var value = DOMElement.value;\n\n if (!value) {\n DOMElement.value = that._old = that._emptyMask;\n } else {\n that._togglePrompt(true);\n }\n\n that._oldValue = value;\n that.wrapper.addClass(FOCUSED);\n\n that._timeoutId = setTimeout(function() {\n caret(element, 0, value ? that._maskLength : 0);\n });\n })\n .on(\"focusout\" + NS, function() {\n var value = element.val();\n\n clearTimeout(that._timeoutId);\n DOMElement.value = that._old = \"\";\n\n if (value !== that._emptyMask) {\n DOMElement.value = that._old = value;\n }\n\n that.wrapper.removeClass(FOCUSED);\n that._change();\n that._togglePrompt();\n });\n\n var disabled = element.is(\"[disabled]\") || $(that.element).parents(\"fieldset\").is(':disabled');\n\n if (disabled) {\n that.enable(false);\n } else {\n that.readonly(element.is(\"[readonly]\"));\n }\n\n that.value(that.options.value || element.val());\n\n that._validationIcon = $(\"\").insertAfter(element);\n\n that._label();\n that._applyCssClasses();\n kendo.notify(that);\n },\n\n options: {\n name: \"MaskedTextBox\",\n clearPromptChar: false,\n unmaskOnPost: false,\n promptChar: \"_\",\n culture: \"\",\n rules: {},\n value: \"\",\n mask: \"\",\n label: null,\n size: \"medium\",\n fillMode: \"solid\",\n rounded: \"medium\"\n },\n\n events: [\n CHANGE\n ],\n\n rules: {\n \"0\": /\\d/,\n \"9\": /\\d|\\s/,\n \"#\": /\\d|\\s|\\+|\\-/,\n \"L\": /[a-zA-Z]/,\n \"?\": /[a-zA-Z]|\\s/,\n \"&\": /\\S/,\n \"C\": /./,\n \"A\": /[a-zA-Z0-9]/,\n \"a\": /[a-zA-Z0-9]|\\s/\n },\n\n setOptions: function(options) {\n var that = this;\n\n Widget.fn.setOptions.call(that, options);\n\n that._rules = $.extend({}, that.rules, that.options.rules);\n\n that._tokenize();\n\n this._unbindInput();\n this._bindInput();\n\n that.value(that.element.val());\n },\n\n destroy: function() {\n var that = this;\n\n if (that.floatingLabel) {\n that.floatingLabel.destroy();\n }\n\n that.element.off(NS);\n\n if (that._formElement) {\n that._formElement.off(\"reset\", that._resetHandler);\n that._formElement.off(\"submit\", that._submitHandler);\n }\n\n Widget.fn.destroy.call(that);\n },\n\n raw: function() {\n var unmasked = this._unmask(this.element.val(), 0);\n return unmasked.replace(new RegExp(escapeRegExp(this.options.promptChar), \"g\"), \"\");\n },\n\n value: function(value) {\n var element = this.element;\n var emptyMask = this._emptyMask;\n\n if (value === undefined) {\n return this.element.val();\n }\n\n if (value === null) {\n value = \"\";\n }\n\n if (!emptyMask) {\n this._oldValue = value;\n element.val(value);\n return;\n }\n\n value = this._unmask(value + \"\");\n\n element.val(value ? emptyMask : \"\");\n\n this._mask(0, this._maskLength, value);\n this._unmaskedValue = null;\n\n value = element.val();\n this._oldValue = value;\n\n if (kendo._activeElement() !== element) {\n if (value === emptyMask) {\n element.val(\"\");\n } else {\n this._togglePrompt();\n }\n }\n },\n\n _togglePrompt: function(show) {\n var DOMElement = this.element[0];\n var value = DOMElement.value;\n\n if (this.options.clearPromptChar) {\n if (!show) {\n value = value.replace(new RegExp(escapeRegExp(this.options.promptChar), \"g\"), \" \");\n } else {\n value = this._oldValue;\n }\n\n DOMElement.value = this._old = value;\n }\n },\n\n readonly: function(readonly) {\n var that = this;\n\n this._editable({\n readonly: readonly === undefined ? true : readonly,\n disable: false\n });\n\n if (that.floatingLabel) {\n that.floatingLabel.readonly(readonly === undefined ? true : readonly);\n }\n },\n\n enable: function(enable) {\n var that = this;\n\n this._editable({\n readonly: false,\n disable: !(enable = enable === undefined ? true : enable)\n });\n\n if (that.floatingLabel) {\n that.floatingLabel.enable(enable = enable === undefined ? true : enable);\n }\n },\n\n _bindInput: function() {\n var that = this;\n\n if (that._maskLength) {\n if(that.options.$angular) {//detach \"input\" event in angular scenario to keep the ng-model consistent and updated only when the change event of the textbox is raised.\n that.element.off(INPUT);\n }\n that.element\n .on(ns(KEYDOWN), proxy(that._keydown, that))\n .on(ns(DROP), proxy(that._drop, that))\n .on(ns(CHANGE), proxy(that._trackChange, that))\n .on(INPUT_EVENT_NAME, proxy(that._inputHandler, that));\n\n\n if (kendo.support.browser.msie) {\n var version = kendo.support.browser.version;\n if (version > 8 && version < 11) {\n var events = [ns(MOUSEUP), ns(DROP), ns(KEYDOWN), ns(PASTE)].join(\" \");\n that.element.on(events, proxy(that._legacyIEInputHandler, that));\n }\n }\n }\n },\n\n _unbindInput: function() {\n var events = [INPUT_EVENT_NAME, ns(KEYDOWN), ns(MOUSEUP), ns(DROP), ns(PASTE)].join(\" \");\n\n this.element.off(events);\n },\n\n _editable: function(options) {\n var that = this;\n var element = that.element;\n var wrapper = that.wrapper;\n var disable = options.disable;\n var readonly = options.readonly;\n\n that._unbindInput();\n\n if (!readonly && !disable) {\n element.prop(DISABLED, false)\n .prop(READONLY, false);\n\n wrapper.removeClass(STATEDISABLED);\n\n that._bindInput();\n } else {\n element.attr(DISABLED, disable)\n .attr(READONLY, readonly);\n\n wrapper.toggleClass(STATEDISABLED, disable);\n }\n },\n\n _change: function() {\n var that = this;\n var value = that.value();\n\n if (value !== that._oldValue) {\n that._oldValue = value;\n\n that.trigger(CHANGE);\n that.element.trigger(CHANGE);\n }\n else if (value === \"\" && that.__changing) {//ensure change is raised when empty value (mask is stripped from input content) for consistent ngjs model update\n that.element.trigger(CHANGE);\n }\n },\n\n inputChange: function(backward) {\n var that = this;\n var old = that._old;\n var element = that.element[0];\n var value = element.value;\n var selection = caret(element);\n var cursor = selection[1];\n var lengthDiff = value.length - old.length;\n var mobile = kendo.support.mobileOS;\n\n if (that.__dropping && lengthDiff < 0) {//dropping in same input on WebKit is raised once for the removal phase and once for the adding phase\n return;\n }\n\n if (lengthDiff === -1 && mobile.android && mobile.browser === \"chrome\") {\n backward = true;\n }\n\n var contentStart = min(cursor, stringDiffStart(value, old));\n var content = value.substring(contentStart, cursor);\n\n element.value = value.substring(0, contentStart) + that._emptyMask.substring(contentStart);\n\n var caretPos = that._mask(contentStart, cursor, content);\n var endContent = that._trimStartPromptChars(value.substring(cursor), min(lengthDiff, caretPos - contentStart));\n\n var unmasked = that._unmask(endContent, old.length - endContent.length);\n that._mask(caretPos, caretPos, unmasked);\n\n if (backward) {\n caretPos = that._findCaretPosBackwards(contentStart);\n }\n\n caret(element, caretPos);\n\n //clean-up flags\n that.__dropping = false;\n },\n\n _trimStartPromptChars: function(content, count) {\n var promptChar = this.options.promptChar;\n\n while (count-- > 0 && content.indexOf(promptChar) === 0) {\n content = content.substring(1);\n }\n\n return content;\n },\n\n _findCaretPosBackwards: function(pos) {\n var caretStart = this._find(pos, true);\n if (caretStart < pos) {\n caretStart += 1;\n }\n\n return caretStart;\n },\n\n _inputHandler: function() {\n if (kendo._activeElement() !== this.element[0]) {\n return;\n }\n\n this.inputChange(this.__backward);\n },\n\n _legacyIEInputHandler: function(e) {\n var that = this;\n var input = that.element[0];\n var value = input.value;\n var type = e.type;\n\n that.__pasting = (type === \"paste\");\n\n setTimeout(function() {\n if(type === \"mouseup\" && that.__pasting) {\n return;\n }\n if (input.value && input.value !== value) {\n that.inputChange(that.__backward);\n }\n });\n },\n\n _trackChange: function() {\n var that = this;\n\n that.__changing = true;\n setTimeout(function() { that.__changing = false; });\n },\n\n _form: function() {\n var that = this;\n var element = that.element;\n var formId = element.attr(\"form\");\n var form = formId ? $(\"#\" + formId) : element.closest(\"form\");\n\n if (form[0]) {\n that._resetHandler = function() {\n setTimeout(function() {\n that.value(element[0].value);\n });\n };\n\n that._submitHandler = function() {\n that.element[0].value = that._old = that.raw();\n };\n\n if (that.options.unmaskOnPost) {\n form.on(\"submit\", that._submitHandler);\n }\n\n that._formElement = form.on(\"reset\", that._resetHandler);\n }\n },\n\n _keydown: function(e) {\n var key = e.keyCode;\n\n this.__backward = key === keys.BACKSPACE;\n\n if (key === keys.ENTER) {\n this._change();\n }\n },\n\n _drop: function() {\n this.__dropping = true;\n },\n\n _find: function(idx, backward) {\n var value = this.element.val() || this._emptyMask;\n var step = 1;\n\n if (backward === true) {\n step = -1;\n }\n\n while (idx > -1 || idx <= this._maskLength) {\n if (value.charAt(idx) !== this.tokens[idx]) {\n return idx;\n }\n\n idx += step;\n }\n\n return -1;\n },\n\n _mask: function(start, end, value, backward) {\n var element = this.element[0];\n var current = element.value || this._emptyMask;\n var empty = this.options.promptChar;\n var valueLength;\n var chrIdx = 0;\n var unmasked;\n var chr;\n var idx;\n\n start = this._find(start, backward);\n\n if (start > end) {\n end = start;\n }\n\n unmasked = this._unmask(current.substring(end), end);\n value = this._unmask(value, start);\n valueLength = value.length;\n\n if (value) {\n unmasked = unmasked.replace(new RegExp(\"^_{0,\" + valueLength + \"}\"), \"\");\n }\n\n value += unmasked;\n current = current.split(\"\");\n chr = value.charAt(chrIdx);\n\n while (start < this._maskLength) {\n current[start] = chr || empty;\n chr = value.charAt(++chrIdx);\n\n if (idx === undefined && chrIdx > valueLength) {\n idx = start;\n }\n\n start = this._find(start + 1);\n }\n\n element.value = this._old = current.join(\"\");\n\n if (kendo._activeElement() === element) {\n if (idx === undefined) {\n idx = this._maskLength;\n }\n\n caret(element, idx);\n }\n\n return idx;\n },\n\n _unmask: function(value, idx) {\n if (!value) {\n return \"\";\n }\n\n if (this._unmaskedValue === value) {\n return this._unmaskedValue;\n }\n value = (value + \"\").split(\"\");\n\n var chr;\n var token;\n var chrIdx = 0;\n var tokenIdx = idx || 0;\n\n var empty = this.options.promptChar;\n\n var valueLength = value.length;\n var tokensLength = this.tokens.length;\n\n var result = \"\";\n\n while (tokenIdx < tokensLength) {\n chr = value[chrIdx];\n token = this.tokens[tokenIdx];\n\n if (chr === token || chr === empty) {\n result += chr === empty ? empty : \"\";\n\n chrIdx += 1;\n tokenIdx += 1;\n } else if (typeof token !== \"string\") {\n if ((token && token.test && token.test(chr)) || (kendo.isFunction(token) && token(chr))) {\n result += chr;\n tokenIdx += 1;\n } else {\n if (valueLength === 1) {\n this._blinkInvalidState();\n }\n }\n\n chrIdx += 1;\n } else {\n tokenIdx += 1;\n }\n\n if (chrIdx >= valueLength) {\n break;\n }\n }\n this._unmaskedValue = result;\n return result;\n },\n\n _label: function() {\n var that = this;\n var element = that.element;\n var options = that.options;\n var id = element.attr(\"id\");\n var floating;\n var labelText;\n\n if (options.label !== null) {\n floating = isPlainObject(options.label) ? options.label.floating : false;\n labelText = isPlainObject(options.label) ? options.label.content : options.label;\n\n if (floating) {\n that._floatingLabelContainer = that.wrapper.wrap(\"\").parent();\n that.floatingLabel = new kendo.ui.FloatingLabel(that._floatingLabelContainer, { widget: that });\n }\n\n if (kendo.isFunction(labelText)) {\n labelText = labelText.call(that);\n }\n\n if (!labelText) {\n labelText = \"\";\n }\n\n if (!id) {\n id = options.name + \"_\" + kendo.guid();\n element.attr(\"id\", id);\n }\n\n that._inputLabel = $(\"'\").insertBefore(that.wrapper);\n }\n },\n\n _wrapper: function () {\n var that = this;\n var element = that.element;\n var DOMElement = element[0];\n\n var wrapper = element.wrap(\"\").parent();\n wrapper[0].style.cssText = DOMElement.style.cssText;\n DOMElement.style.width = \"100%\";\n that.wrapper = wrapper.addClass(DOMElement.className).removeClass('input-validation-error');\n },\n\n _blinkInvalidState: function () {\n var that = this;\n\n that._addInvalidState();\n clearTimeout(that._invalidStateTimeout);\n that._invalidStateTimeout = setTimeout(proxy(that._removeInvalidState, that), 100);\n },\n\n _addInvalidState: function() {\n var that = this;\n\n that.wrapper.addClass(STATEINVALID);\n that._validationIcon.removeClass(\"k-hidden\");\n },\n\n _removeInvalidState: function () {\n var that = this;\n\n that.wrapper.removeClass(STATEINVALID);\n that._validationIcon.addClass(\"k-hidden\");\n that._invalidStateTimeout = null;\n },\n\n _tokenize: function() {\n var tokens = [];\n var tokenIdx = 0;\n\n var mask = this.options.mask || \"\";\n var maskChars = mask.split(\"\");\n var length = maskChars.length;\n var idx = 0;\n var chr;\n var rule;\n\n var emptyMask = \"\";\n var promptChar = this.options.promptChar;\n var numberFormat = kendo.getCulture(this.options.culture).numberFormat;\n var rules = this._rules;\n\n for (; idx < length; idx++) {\n chr = maskChars[idx];\n rule = rules[chr];\n\n if (rule) {\n tokens[tokenIdx] = rule;\n emptyMask += promptChar;\n tokenIdx += 1;\n } else {\n if (chr === \".\" || chr === \",\") {\n chr = numberFormat[chr];\n } else if (chr === \"$\") {\n chr = numberFormat.currency.symbol;\n } else if (chr === \"\\\\\") {\n idx += 1;\n chr = maskChars[idx];\n }\n\n chr = chr.split(\"\");\n\n for (var i = 0, l = chr.length; i < l; i++) {\n tokens[tokenIdx] = chr[i];\n emptyMask += chr[i];\n tokenIdx += 1;\n }\n }\n }\n\n this.tokens = tokens;\n\n this._emptyMask = emptyMask;\n this._maskLength = emptyMask.length;\n }\n });\n\n function escapeRegExp(text) {\n return text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n }\n\n kendo.cssProperties.registerPrefix(\"MaskedTextBox\", \"k-input-\");\n\n kendo.cssProperties.registerValues(\"MaskedTextBox\", [{\n prop: \"rounded\",\n values: kendo.cssProperties.roundedValues.concat([['full', 'full']])\n }]);\n\n ui.plugin(MaskedTextBox);\n\n})(window.kendo.jQuery);\n\nreturn window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3){ (a3 || a2)(); });\n\n"],"names":["define","__meta__","id","name","category","description","depends","$","window","kendo","jQuery","undefined","global","min","Math","caret","keys","ui","Widget","NS","isPlainObject","proxy","setTimeout","LABELCLASSES","STATEDISABLED","STATEINVALID","FOCUSED","DISABLED","READONLY","CHANGE","MOUSEUP","DROP","KEYDOWN","PASTE","INPUT","ns","INPUT_EVENT_NAME","support","propertyChangeEvent","stringDiffStart","str1","str2","i","length","MaskedTextBox","extend","init","element","options","that","this","DOMElement","fn","call","_rules","rules","_wrapper","_tokenize","_form","addClass","attr","on","value","_old","_emptyMask","_togglePrompt","_oldValue","wrapper","_timeoutId","_maskLength","val","clearTimeout","removeClass","_change","disabled","is","parents","enable","readonly","_validationIcon","insertAfter","_label","_applyCssClasses","notify","clearPromptChar","unmaskOnPost","promptChar","culture","mask","label","size","fillMode","rounded","events","0","9","#","L","?","&","C","A","a","setOptions","_unbindInput","_bindInput","destroy","floatingLabel","off","_formElement","_resetHandler","_submitHandler","raw","unmasked","_unmask","replace","RegExp","escapeRegExp","emptyMask","_mask","_unmaskedValue","_activeElement","show","_editable","disable","$angular","_keydown","_drop","_trackChange","_inputHandler","browser","msie","version","join","_legacyIEInputHandler","prop","toggleClass","trigger","__changing","inputChange","backward","old","selection","cursor","lengthDiff","mobile","mobileOS","__dropping","android","contentStart","content","substring","caretPos","endContent","_trimStartPromptChars","_findCaretPosBackwards","count","indexOf","pos","caretStart","_find","__backward","e","input","type","__pasting","formId","form","closest","key","keyCode","BACKSPACE","ENTER","idx","step","charAt","tokens","start","end","current","empty","valueLength","chrIdx","chr","split","token","tokenIdx","tokensLength","result","test","isFunction","_blinkInvalidState","floating","labelText","_floatingLabelContainer","wrap","parent","FloatingLabel","widget","guid","_inputLabel","insertBefore","style","cssText","width","className","_addInvalidState","_invalidStateTimeout","_removeInvalidState","maskChars","rule","numberFormat","getCulture","currency","symbol","l","text","cssProperties","registerPrefix","registerValues","values","roundedValues","concat","plugin","amd","a1","a2","a3"],"mappings":"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"}