Skip to content

Instantly share code, notes, and snippets.

@thomasphorton
Created October 30, 2013 15:09
Show Gist options
  • Save thomasphorton/7234251 to your computer and use it in GitHub Desktop.
Save thomasphorton/7234251 to your computer and use it in GitHub Desktop.
/* Masked Input plugin for jQuery Copyright (c) 2007-2011 Josh Bush (digitalbush.com) Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) Version: 1.3 */
(function (a) {
var b = (a.browser.msie ? "paste" : "input") + ".mask",
c = window.orientation != undefined;
a.mask = {
definitions: {
9: "[0-9]",
a: "[A-Za-z]",
"*": "[A-Za-z0-9]"
},
dataName: "rawMaskFn"
}, a.fn.extend({
caret: function (a, b) {
if (this.length != 0) {
if (typeof a == "number") {
b = typeof b == "number" ? b : a;
return this.each(function () {
if (this.setSelectionRange) this.setSelectionRange(a, b);
else if (this.createTextRange) {
var c = this.createTextRange();
c.collapse(!0), c.moveEnd("character", b), c.moveStart("character", a), c.select()
}
})
}
if (this[0].setSelectionRange) a = this[0].selectionStart, b = this[0].selectionEnd;
else if (document.selection && document.selection.createRange) {
var c = document.selection.createRange();
a = 0 - c.duplicate().moveStart("character", -1e5), b = a + c.text.length
}
return {
begin: a,
end: b
}
}
},
unmask: function () {
return this.trigger("unmask")
},
mask: function (d, e) {
if (!d && this.length > 0) {
var f = a(this[0]);
return f.data(a.mask.dataName)()
}
e = a.extend({
placeholder: "_",
completed: null
}, e);
var g = a.mask.definitions,
h = [],
i = d.length,
j = null,
k = d.length;
a.each(d.split(""), function (a, b) {
b == "?" ? (k--, i = a) : g[b] ? (h.push(new RegExp(g[b])), j == null && (j = h.length - 1)) : h.push(null)
});
return this.trigger("unmask").each(function () {
function v(a) {
var b = f.val(),
c = -1;
for (var d = 0, g = 0; d < k; d++)
if (h[d]) {
l[d] = e.placeholder;
while (g++ < b.length) {
var m = b.charAt(g - 1);
if (h[d].test(m)) {
l[d] = m, c = d;
break
}
}
if (g > b.length) break
} else l[d] == b.charAt(g) && d != i && (g++, c = d);
if (!a && c + 1 < i) f.val(""), t(0, k);
else if (a || c + 1 >= i) u(), a || f.val(f.val().substring(0, c + 1));
return i ? d : j
}
function u() {
return f.val(l.join("")).val()
}
function t(a, b) {
for (var c = a; c < b && c < k; c++) h[c] && (l[c] = e.placeholder)
}
function s(a) {
var b = a.which,
c = f.caret();
if (a.ctrlKey || a.altKey || a.metaKey || b < 32) return !0;
if (b) {
c.end - c.begin != 0 && (t(c.begin, c.end), p(c.begin, c.end - 1));
var d = n(c.begin - 1);
if (d < k) {
var g = String.fromCharCode(b);
if (h[d].test(g)) {
q(d), l[d] = g, u();
var i = n(d);
f.caret(i), e.completed && i >= k && e.completed.call(f)
}
}
return !1
}
}
function r(a) {
var b = a.which;
if (b == 8 || b == 46 || c && b == 127) {
var d = f.caret(),
e = d.begin,
g = d.end;
g - e == 0 && (e = b != 46 ? o(e) : g = n(e - 1), g = b == 46 ? n(g) : g), t(e, g), p(e, g - 1);
return !1
}
if (b == 27) {
f.val(m), f.caret(0, v());
return !1
}
}
function q(a) {
for (var b = a, c = e.placeholder; b < k; b++)
if (h[b]) {
var d = n(b),
f = l[b];
l[b] = c;
if (d < k && h[d].test(f)) c = f;
else break
}
}
function p(a, b) {
if (!(a < 0)) {
for (var c = a, d = n(b); c < k; c++)
if (h[c]) {
if (d < k && h[c].test(l[d])) l[c] = l[d], l[d] = e.placeholder;
else break;
d = n(d)
}
u(), f.caret(Math.max(j, a))
}
}
function o(a) {
while (--a >= 0 && !h[a]);
return a
}
function n(a) {
while (++a <= k && !h[a]);
return a
}
var f = a(this),
l = a.map(d.split(""), function (a, b) {
if (a != "?") return g[a] ? e.placeholder : a
}),
m = f.val();
f.data(a.mask.dataName, function () {
return a.map(l, function (a, b) {
return h[b] && a != e.placeholder ? a : null
}).join("")
}), f.attr("readonly") || f.one("unmask", function () {
f.unbind(".mask").removeData(a.mask.dataName)
}).bind("focus.mask", function () {
m = f.val();
var b = v();
u();
var c = function () {
b == d.length ? f.caret(0, b) : f.caret(b)
};
(a.browser.msie ? c : function () {
setTimeout(c, 0)
})()
}).bind("blur.mask", function () {
v(), f.val() != m && f.change()
}).bind("keydown.mask", r).bind("keypress.mask", s).bind(b, function () {
setTimeout(function () {
f.caret(v(!0))
}, 0)
}), v()
})
}
})
})(jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment