(function (e, t, n) { "function" == typeof define && define.amd ? define(["jquery"], e) : "object" == typeof exports ? module.exports = e(require("jquery")) : e(t || n) })(function (e) { var t = function (t, n, i) { var a = { invalid: [], getCaret: function () { try { var e, n = 0, i = t.get(0), r = document.selection, s = i.selectionStart; return r && -1 === navigator.appVersion.indexOf("MSIE 10") ? ((e = r.createRange()).moveStart("character", -a.val().length), n = e.text.length) : (s || "0" === s) && (n = s), n } catch (e) { } }, setCaret: function (e) { try { if (t.is(":focus")) { var n, i = t.get(0); i.setSelectionRange ? i.setSelectionRange(e, e) : ((n = i.createTextRange()).collapse(!0), n.moveEnd("character", e), n.moveStart("character", e), n.select()) } } catch (e) { } }, events: function () { t.on("keydown.mask", function (e) { t.data("mask-keycode", e.keyCode || e.which), t.data("mask-previus-value", t.val()), t.data("mask-previus-caret-pos", a.getCaret()), a.maskDigitPosMapOld = a.maskDigitPosMap }).on(e.jMaskGlobals.useInput ? "input.mask" : "keyup.mask", a.behaviour).on("paste.mask drop.mask", function () { setTimeout(function () { t.keydown().keyup() }, 100) }).on("change.mask", function () { t.data("changed", !0) }).on("blur.mask", function () { o === a.val() || t.data("changed") || t.trigger("change"), t.data("changed", !1) }).on("blur.mask", function () { o = a.val() }).on("focus.mask", function (t) { !0 === i.selectOnFocus && e(t.target).select() }).on("focusout.mask", function () { i.clearIfNotMatch && !r.test(a.val()) && a.val("") }) }, getRegexMask: function () { for (var e, t, i, a, r = [], o = 0; o < n.length; o++) (e = s.translation[n.charAt(o)]) ? (t = e.pattern.toString().replace(/.{1}$|^.{1}/g, ""), i = e.optional, (e = e.recursive) ? (r.push(n.charAt(o)), a = { digit: n.charAt(o), pattern: t }) : r.push(i || e ? t + "?" : t)) : r.push(n.charAt(o).replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&")); return r = r.join(""), a && (r = r.replace(new RegExp("(" + a.digit + "(.*" + a.digit + ")?)"), "($1)?").replace(new RegExp(a.digit, "g"), a.pattern)), new RegExp(r) }, destroyEvents: function () { t.off("input keydown keyup paste drop blur focusout ".split(" ").join(".mask ")) }, val: function (e) { var n = t.is("input") ? "val" : "text"; return 0 < arguments.length ? (t[n]() !== e && t[n](e), n = t) : n = t[n](), n }, calculateCaretPosition: function () { var e = t.data("mask-previus-value") || "", n = a.getMasked(), i = a.getCaret(); if (e !== n) { var r, s = t.data("mask-previus-caret-pos") || 0, o = (n = n.length, e.length), l = e = 0, c = 0, d = 0; for (r = i; r < n && a.maskDigitPosMap[r]; r++) l++; for (r = i - 1; 0 <= r && a.maskDigitPosMap[r]; r--) e++; for (r = i - 1; 0 <= r; r--) a.maskDigitPosMap[r] && c++; for (r = s - 1; 0 <= r; r--) a.maskDigitPosMapOld[r] && d++; i > o ? i = 10 * n : s >= i && s !== o ? a.maskDigitPosMapOld[i] || (s = i, i = i - (d - c) - e, a.maskDigitPosMap[i] && (i = s)) : i > s && (i = i + (c - d) + l) } return i }, behaviour: function (n) { n = n || window.event, a.invalid = []; var i = t.data("mask-keycode"); if (-1 === e.inArray(i, s.byPassKeys)) { i = a.getMasked(); var r = a.getCaret(); return setTimeout(function () { a.setCaret(a.calculateCaretPosition()) }, e.jMaskGlobals.keyStrokeCompensation), a.val(i), a.setCaret(r), a.callbacks(n) } }, getMasked: function (e, t) { var r, o, l, c = [], d = void 0 === t ? a.val() : t + "", u = 0, p = n.length, h = 0, f = d.length, m = 1, g = "push", v = -1, b = 0, y = []; for (i.reverse ? (g = "unshift", m = -1, r = 0, u = p - 1, h = f - 1, o = function () { return -1 < u && -1 < h }) : (r = p - 1, o = function () { return u < p && h < f }); o();) { var x = n.charAt(u), w = d.charAt(h), T = s.translation[x]; T ? (w.match(T.pattern) ? (c[g](w), T.recursive && (-1 === v ? v = u : u === r && u !== v && (u = v - m), r === v && (u -= m)), u += m) : w === l ? (b--, l = void 0) : T.optional ? (u += m, h -= m) : T.fallback ? (c[g](T.fallback), u += m, h -= m) : a.invalid.push({ p: h, v: w, e: T.pattern }), h += m) : (e || c[g](x), w === x ? (y.push(h), h += m) : (l = x, y.push(h + b), b++), u += m) } return d = n.charAt(r), p !== f + 1 || s.translation[d] || c.push(d), c = c.join(""), a.mapMaskdigitPositions(c, y, f), c }, mapMaskdigitPositions: function (e, t, n) { for (e = i.reverse ? e.length - n : 0, a.maskDigitPosMap = {}, n = 0; n < t.length; n++) a.maskDigitPosMap[t[n] + e] = 1 }, callbacks: function (e) { var r = a.val(), s = r !== o, l = [r, e, t, i], c = function (e, t, n) { "function" == typeof i[e] && t && i[e].apply(this, n) }; c("onChange", !0 === s, l), c("onKeyPress", !0 === s, l), c("onComplete", r.length === n.length, l), c("onInvalid", 0 < a.invalid.length, [r, e, t, a.invalid, i]) } }; t = e(t); var r, s = this, o = a.val(); n = "function" == typeof n ? n(a.val(), void 0, t, i) : n, s.mask = n, s.options = i, s.remove = function () { var e = a.getCaret(); return s.options.placeholder && t.removeAttr("placeholder"), t.data("mask-maxlength") && t.removeAttr("maxlength"), a.destroyEvents(), a.val(s.getCleanVal()), a.setCaret(e), t }, s.getCleanVal = function () { return a.getMasked(!0) }, s.getMaskedVal = function (e) { return a.getMasked(!1, e) }, s.init = function (o) { if (o = o || !1, i = i || {}, s.clearIfNotMatch = e.jMaskGlobals.clearIfNotMatch, s.byPassKeys = e.jMaskGlobals.byPassKeys, s.translation = e.extend({}, e.jMaskGlobals.translation, i.translation), s = e.extend(!0, {}, s, i), r = a.getRegexMask(), o) a.events(), a.val(a.getMasked()); else { i.placeholder && t.attr("placeholder", i.placeholder), t.data("mask") && t.attr("autocomplete", "off"), o = 0; for (var l = !0; o < n.length; o++) { var c = s.translation[n.charAt(o)]; if (c && c.recursive) { l = !1; break } } l && t.attr("maxlength", n.length).data("mask-maxlength", !0), a.destroyEvents(), a.events(), o = a.getCaret(), a.val(a.getMasked()), a.setCaret(o) } }, s.init(!t.is("input")) }; e.maskWatchers = {}; var n = function () { var n = e(this), a = {}, r = n.attr("data-mask"); if (n.attr("data-mask-reverse") && (a.reverse = !0), n.attr("data-mask-clearifnotmatch") && (a.clearIfNotMatch = !0), "true" === n.attr("data-mask-selectonfocus") && (a.selectOnFocus = !0), i(n, r, a)) return n.data("mask", new t(this, r, a)) }, i = function (t, n, i) { i = i || {}; var a = e(t).data("mask"), r = JSON.stringify; t = e(t).val() || e(t).text(); try { return "function" == typeof n && (n = n(t)), "object" != typeof a || r(a.options) !== r(i) || a.mask !== n } catch (e) { } }, a = function (e) { var t, n = document.createElement("div"); return (t = (e = "on" + e) in n) || (n.setAttribute(e, "return;"), t = "function" == typeof n[e]), t }; e.fn.mask = function (n, a) { a = a || {}; var r = this.selector, s = (o = e.jMaskGlobals).watchInterval, o = a.watchInputs || o.watchInputs, l = function () { if (i(this, n, a)) return e(this).data("mask", new t(this, n, a)) }; return e(this).each(l), r && "" !== r && o && (clearInterval(e.maskWatchers[r]), e.maskWatchers[r] = setInterval(function () { e(document).find(r).each(l) }, s)), this }, e.fn.masked = function (e) { return this.data("mask").getMaskedVal(e) }, e.fn.unmask = function () { return clearInterval(e.maskWatchers[this.selector]), delete e.maskWatchers[this.selector], this.each(function () { var t = e(this).data("mask"); t && t.remove().removeData("mask") }) }, e.fn.cleanVal = function () { return this.data("mask").getCleanVal() }, e.applyDataMask = function (t) { ((t = t || e.jMaskGlobals.maskElements) instanceof e ? t : e(t)).filter(e.jMaskGlobals.dataMaskAttr).each(n) }, a = { maskElements: "input,td,span,div", dataMaskAttr: "*[data-mask]", dataMask: !0, watchInterval: 300, watchInputs: !0, keyStrokeCompensation: 10, useInput: !/Chrome\/[2-4][0-9]|SamsungBrowser/.test(window.navigator.userAgent) && a("input"), watchDataMask: !1, byPassKeys: [9, 16, 17, 18, 36, 37, 38, 39, 40, 91], translation: { 0: {pattern: /\d/}, 9: {pattern: /\d/, optional: !0}, "#": {pattern: /\d/, recursive: !0}, A: {pattern: /[a-zA-Z0-9]/}, S: {pattern: /[a-zA-Z]/} } }, e.jMaskGlobals = e.jMaskGlobals || {}, (a = e.jMaskGlobals = e.extend(!0, {}, a, e.jMaskGlobals)).dataMask && e.applyDataMask(), setInterval(function () { e.jMaskGlobals.watchDataMask && e.applyDataMask() }, a.watchInterval) }, window.jQuery, window.Zepto);