|
@@ -3,11 +3,14 @@
|
|
|
* http://github.com/RobinHerbots/jquery.inputmask
|
|
* http://github.com/RobinHerbots/jquery.inputmask
|
|
|
* Copyright (c) 2010 - 2012 Robin Herbots
|
|
* Copyright (c) 2010 - 2012 Robin Herbots
|
|
|
* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
|
|
* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
|
|
|
-* Version: 1.0.19
|
|
|
|
|
|
|
+* Version: 1.0.21
|
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
(function ($) {
|
|
(function ($) {
|
|
|
- Array.prototype.indexOf = Array.prototype.indexOf || function (item, start) { for (var i = start || 0; i < this.length; i++) if (this[i] == item) return i; return -1; }
|
|
|
|
|
|
|
+ Array.prototype.indexOf = Array.prototype.indexOf || function (item, start) {
|
|
|
|
|
+ for (var i = start || 0; i < this.length; i++) if (this[i] == item) return i;
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
if ($.fn.inputmask == undefined) {
|
|
if ($.fn.inputmask == undefined) {
|
|
|
$.inputmask = {
|
|
$.inputmask = {
|
|
@@ -60,7 +63,6 @@
|
|
|
|
|
|
|
|
$.fn.inputmask = function (fn, options) {
|
|
$.fn.inputmask = function (fn, options) {
|
|
|
var opts = $.extend(true, {}, $.inputmask.defaults, options);
|
|
var opts = $.extend(true, {}, $.inputmask.defaults, options);
|
|
|
- var pasteEventName = $.browser.msie ? 'paste.inputmask' : 'input.inputmask';
|
|
|
|
|
|
|
|
|
|
var iphone = navigator.userAgent.match(/iphone/i) != null;
|
|
var iphone = navigator.userAgent.match(/iphone/i) != null;
|
|
|
var android = navigator.userAgent.match(/android.*mobile safari.*/i) != null;
|
|
var android = navigator.userAgent.match(/android.*mobile safari.*/i) != null;
|
|
@@ -109,8 +111,9 @@
|
|
|
$input.unbind(".inputmask");
|
|
$input.unbind(".inputmask");
|
|
|
$input.removeClass('focus.inputmask');
|
|
$input.removeClass('focus.inputmask');
|
|
|
//restore the value property
|
|
//restore the value property
|
|
|
|
|
+ var valueProperty;
|
|
|
if (Object.getOwnPropertyDescriptor)
|
|
if (Object.getOwnPropertyDescriptor)
|
|
|
- var valueProperty = Object.getOwnPropertyDescriptor(input, "value");
|
|
|
|
|
|
|
+ valueProperty = Object.getOwnPropertyDescriptor(input, "value");
|
|
|
if (valueProperty && valueProperty.get) {
|
|
if (valueProperty && valueProperty.get) {
|
|
|
if (input._valueGet) {
|
|
if (input._valueGet) {
|
|
|
Object.defineProperty(input, "value", {
|
|
Object.defineProperty(input, "value", {
|
|
@@ -136,7 +139,7 @@
|
|
|
else return "";
|
|
else return "";
|
|
|
default:
|
|
default:
|
|
|
//check if the fn is an alias
|
|
//check if the fn is an alias
|
|
|
- if (!ResolveAlias(fn)) {
|
|
|
|
|
|
|
+ if (!resolveAlias(fn)) {
|
|
|
//maybe fn is a mask so we try
|
|
//maybe fn is a mask so we try
|
|
|
//set mask
|
|
//set mask
|
|
|
opts.mask = fn;
|
|
opts.mask = fn;
|
|
@@ -153,7 +156,7 @@
|
|
|
}
|
|
}
|
|
|
} if (typeof fn == "object") {
|
|
} if (typeof fn == "object") {
|
|
|
opts = $.extend(true, {}, $.inputmask.defaults, fn);
|
|
opts = $.extend(true, {}, $.inputmask.defaults, fn);
|
|
|
- ResolveAlias(opts.alias); //resolve aliases
|
|
|
|
|
|
|
+ resolveAlias(opts.alias); //resolve aliases
|
|
|
//init buffer
|
|
//init buffer
|
|
|
var _buffer = getMaskTemplate();
|
|
var _buffer = getMaskTemplate();
|
|
|
var tests = getTestingChain();
|
|
var tests = getTestingChain();
|
|
@@ -164,10 +167,10 @@
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//helper functions
|
|
//helper functions
|
|
|
- function ResolveAlias(aliasStr) {
|
|
|
|
|
|
|
+ function resolveAlias(aliasStr) {
|
|
|
var aliasDefinition = opts.aliases[aliasStr];
|
|
var aliasDefinition = opts.aliases[aliasStr];
|
|
|
if (aliasDefinition) {
|
|
if (aliasDefinition) {
|
|
|
- if (aliasDefinition.alias) ResolveAlias(aliasDefinition.alias); //alias is another alias
|
|
|
|
|
|
|
+ if (aliasDefinition.alias) resolveAlias(aliasDefinition.alias); //alias is another alias
|
|
|
$.extend(true, opts, aliasDefinition); //merge alias definition in the options
|
|
$.extend(true, opts, aliasDefinition); //merge alias definition in the options
|
|
|
$.extend(true, opts, options); //reapply extra given options
|
|
$.extend(true, opts, options); //reapply extra given options
|
|
|
return true;
|
|
return true;
|
|
@@ -203,6 +206,7 @@
|
|
|
for (var i = 1; i < opts.repeat && opts.greedy; i++) {
|
|
for (var i = 1; i < opts.repeat && opts.greedy; i++) {
|
|
|
repeatedMask = repeatedMask.concat(singleMask.slice());
|
|
repeatedMask = repeatedMask.concat(singleMask.slice());
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
return repeatedMask;
|
|
return repeatedMask;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -276,7 +280,7 @@
|
|
|
function getMaskLength() {
|
|
function getMaskLength() {
|
|
|
var calculatedLength = _buffer.length;
|
|
var calculatedLength = _buffer.length;
|
|
|
if (!opts.greedy && opts.repeat > 1) {
|
|
if (!opts.greedy && opts.repeat > 1) {
|
|
|
- calculatedLength += (_buffer.length * (opts.repeat - 1))
|
|
|
|
|
|
|
+ calculatedLength += (_buffer.length * (opts.repeat - 1));
|
|
|
}
|
|
}
|
|
|
return calculatedLength;
|
|
return calculatedLength;
|
|
|
}
|
|
}
|
|
@@ -359,14 +363,14 @@
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- function SetReTargetPlaceHolder(buffer, pos) {
|
|
|
|
|
|
|
+ function setReTargetPlaceHolder(buffer, pos) {
|
|
|
var testPos = determineTestPosition(pos);
|
|
var testPos = determineTestPosition(pos);
|
|
|
setBufferElement(buffer, pos, getBufferElement(_buffer, testPos));
|
|
setBufferElement(buffer, pos, getBufferElement(_buffer, testPos));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function checkVal(input, buffer, clearInvalid, skipRadixHandling) {
|
|
function checkVal(input, buffer, clearInvalid, skipRadixHandling) {
|
|
|
var isRTL = $(input).data('inputmask')['isRTL'],
|
|
var isRTL = $(input).data('inputmask')['isRTL'],
|
|
|
- inputValue = TruncateInput(input._valueGet(), isRTL).split('');
|
|
|
|
|
|
|
+ inputValue = truncateInput(input._valueGet(), isRTL).split('');
|
|
|
|
|
|
|
|
if (isRTL) { //align inputValue for RTL/numeric input
|
|
if (isRTL) { //align inputValue for RTL/numeric input
|
|
|
var maskL = getMaskLength();
|
|
var maskL = getMaskLength();
|
|
@@ -398,7 +402,7 @@
|
|
|
setBufferElement(buffer, pos, c);
|
|
setBufferElement(buffer, pos, c);
|
|
|
lastMatch = checkPosition = pos;
|
|
lastMatch = checkPosition = pos;
|
|
|
} else {
|
|
} else {
|
|
|
- SetReTargetPlaceHolder(buffer, pos);
|
|
|
|
|
|
|
+ setReTargetPlaceHolder(buffer, pos);
|
|
|
if (c == getPlaceHolder(pos)) {
|
|
if (c == getPlaceHolder(pos)) {
|
|
|
checkPosition = pos;
|
|
checkPosition = pos;
|
|
|
rtlMatch = pos;
|
|
rtlMatch = pos;
|
|
@@ -406,7 +410,7 @@
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
} else { //nonmask
|
|
} else { //nonmask
|
|
|
- SetReTargetPlaceHolder(buffer, pos);
|
|
|
|
|
|
|
+ setReTargetPlaceHolder(buffer, pos);
|
|
|
if (lastMatch == checkPosition) //once outsync the nonmask cannot be the lastmatch
|
|
if (lastMatch == checkPosition) //once outsync the nonmask cannot be the lastmatch
|
|
|
lastMatch = pos;
|
|
lastMatch = pos;
|
|
|
checkPosition = pos;
|
|
checkPosition = pos;
|
|
@@ -417,7 +421,7 @@
|
|
|
}
|
|
}
|
|
|
//Truncate buffer when using non-greedy masks
|
|
//Truncate buffer when using non-greedy masks
|
|
|
if (opts.greedy == false) {
|
|
if (opts.greedy == false) {
|
|
|
- var newBuffer = TruncateInput(buffer.join(''), isRTL).split('');
|
|
|
|
|
|
|
+ var newBuffer = truncateInput(buffer.join(''), isRTL).split('');
|
|
|
while (buffer.length != newBuffer.length) { //map changes into the original buffer
|
|
while (buffer.length != newBuffer.length) { //map changes into the original buffer
|
|
|
isRTL ? buffer.shift() : buffer.pop();
|
|
isRTL ? buffer.shift() : buffer.pop();
|
|
|
}
|
|
}
|
|
@@ -429,12 +433,12 @@
|
|
|
return isRTL ? (opts.numericInput ? (buffer.indexOf(opts.radixPoint) != -1 && skipRadixHandling !== true ? buffer.indexOf(opts.radixPoint) : seekNext(buffer, maskL)) : seekNext(buffer, rtlMatch)) : seekNext(buffer, lastMatch);
|
|
return isRTL ? (opts.numericInput ? (buffer.indexOf(opts.radixPoint) != -1 && skipRadixHandling !== true ? buffer.indexOf(opts.radixPoint) : seekNext(buffer, maskL)) : seekNext(buffer, rtlMatch)) : seekNext(buffer, lastMatch);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- function EscapeRegex(str) {
|
|
|
|
|
|
|
+ function escapeRegex(str) {
|
|
|
var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'];
|
|
var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'];
|
|
|
return str.replace(new RegExp('(\\' + specials.join('|\\') + ')', 'gim'), '\\$1');
|
|
return str.replace(new RegExp('(\\' + specials.join('|\\') + ')', 'gim'), '\\$1');
|
|
|
}
|
|
}
|
|
|
- function TruncateInput(inputValue, rtl) {
|
|
|
|
|
- return rtl ? inputValue.replace(new RegExp("^(" + EscapeRegex(_buffer.join('')) + ")*"), "") : inputValue.replace(new RegExp("(" + EscapeRegex(_buffer.join('')) + ")*$"), "");
|
|
|
|
|
|
|
+ function truncateInput(inputValue, rtl) {
|
|
|
|
|
+ return rtl ? inputValue.replace(new RegExp("^(" + escapeRegex(_buffer.join('')) + ")*"), "") : inputValue.replace(new RegExp("(" + escapeRegex(_buffer.join('')) + ")*$"), "");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function clearOptionalTail(input, buffer) {
|
|
function clearOptionalTail(input, buffer) {
|
|
@@ -514,6 +518,16 @@
|
|
|
var $input = $(el);
|
|
var $input = $(el);
|
|
|
if (!$input.is(":input")) return;
|
|
if (!$input.is(":input")) return;
|
|
|
|
|
|
|
|
|
|
+ //handle maxlength attribute
|
|
|
|
|
+ var maxLength = $input.prop('maxLength');
|
|
|
|
|
+ if (getMaskLength() > maxLength && maxLength > -1) { //FF sets no defined max length to -1
|
|
|
|
|
+ if (maxLength < _buffer.length) _buffer.length = maxLength;
|
|
|
|
|
+ if (opts.greedy == false) {
|
|
|
|
|
+ opts.repeat = Math.round(maxLength / _buffer.length);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ $input.prop('maxLength', getMaskLength() * 2);
|
|
|
|
|
+
|
|
|
//store tests & original buffer in the input element - used to get the unmasked value
|
|
//store tests & original buffer in the input element - used to get the unmasked value
|
|
|
$input.data('inputmask', {
|
|
$input.data('inputmask', {
|
|
|
'tests': tests,
|
|
'tests': tests,
|
|
@@ -540,7 +554,7 @@
|
|
|
el.dir = "ltr"
|
|
el.dir = "ltr"
|
|
|
$input.css("text-align", "right");
|
|
$input.css("text-align", "right");
|
|
|
$input.removeAttr("dir");
|
|
$input.removeAttr("dir");
|
|
|
- inputData = $input.data('inputmask');
|
|
|
|
|
|
|
+ var inputData = $input.data('inputmask');
|
|
|
inputData['isRTL'] = true;
|
|
inputData['isRTL'] = true;
|
|
|
$input.data('inputmask', inputData);
|
|
$input.data('inputmask', inputData);
|
|
|
isRTL = true;
|
|
isRTL = true;
|
|
@@ -573,7 +587,7 @@
|
|
|
clearOptionalTail(input, buffer);
|
|
clearOptionalTail(input, buffer);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- if ((opts.clearIncomplete || opts.onincomplete) && !IsComplete(input)) {
|
|
|
|
|
|
|
+ if ((opts.clearIncomplete || opts.onincomplete) && !isComplete(input)) {
|
|
|
if (opts.onincomplete) {
|
|
if (opts.onincomplete) {
|
|
|
opts.onincomplete.call(input);
|
|
opts.onincomplete.call(input);
|
|
|
}
|
|
}
|
|
@@ -622,7 +636,7 @@
|
|
|
}).bind("keydown.inputmask", keydownEvent
|
|
}).bind("keydown.inputmask", keydownEvent
|
|
|
).bind("keypress.inputmask", keypressEvent
|
|
).bind("keypress.inputmask", keypressEvent
|
|
|
).bind("keyup.inputmask", keyupEvent
|
|
).bind("keyup.inputmask", keyupEvent
|
|
|
- ).bind(pasteEventName, function () {
|
|
|
|
|
|
|
+ ).bind("paste.inputmask", function () {
|
|
|
var input = this;
|
|
var input = this;
|
|
|
setTimeout(function () {
|
|
setTimeout(function () {
|
|
|
caret(input, checkVal(input, buffer, true));
|
|
caret(input, checkVal(input, buffer, true));
|
|
@@ -646,8 +660,8 @@
|
|
|
installEventRuler(el);
|
|
installEventRuler(el);
|
|
|
|
|
|
|
|
//private functions
|
|
//private functions
|
|
|
- function IsComplete(npt) {
|
|
|
|
|
- var complete = true, nptValue = npt._valueGet(), ml = getMaskLength();
|
|
|
|
|
|
|
+ function isComplete(npt) {
|
|
|
|
|
+ var complete = true, nptValue = npt._valueGet(), ml = nptValue.length;
|
|
|
for (var i = 0; i < ml; i++) {
|
|
for (var i = 0; i < ml; i++) {
|
|
|
if (isMask(i) && nptValue.charAt(i) == getPlaceHolder(i)) {
|
|
if (isMask(i) && nptValue.charAt(i) == getPlaceHolder(i)) {
|
|
|
complete = false;
|
|
complete = false;
|
|
@@ -683,7 +697,7 @@
|
|
|
function patchValueProperty(npt) {
|
|
function patchValueProperty(npt) {
|
|
|
var valueProperty;
|
|
var valueProperty;
|
|
|
if (Object.getOwnPropertyDescriptor)
|
|
if (Object.getOwnPropertyDescriptor)
|
|
|
- var valueProperty = Object.getOwnPropertyDescriptor(npt, "value");
|
|
|
|
|
|
|
+ valueProperty = Object.getOwnPropertyDescriptor(npt, "value");
|
|
|
if (valueProperty && valueProperty.get) {
|
|
if (valueProperty && valueProperty.get) {
|
|
|
if (!npt._valueGet) {
|
|
if (!npt._valueGet) {
|
|
|
|
|
|
|
@@ -751,26 +765,26 @@
|
|
|
while (!isMask(start) && start - 1 >= 0) start--;
|
|
while (!isMask(start) && start - 1 >= 0) start--;
|
|
|
for (var i = start; i < end && i < getMaskLength(); i++) {
|
|
for (var i = start; i < end && i < getMaskLength(); i++) {
|
|
|
if (isMask(i)) {
|
|
if (isMask(i)) {
|
|
|
- SetReTargetPlaceHolder(buffer, i);
|
|
|
|
|
|
|
+ setReTargetPlaceHolder(buffer, i);
|
|
|
var j = seekNext(buffer, i);
|
|
var j = seekNext(buffer, i);
|
|
|
var p = getBufferElement(buffer, j);
|
|
var p = getBufferElement(buffer, j);
|
|
|
if (p != getPlaceHolder(j)) {
|
|
if (p != getPlaceHolder(j)) {
|
|
|
if (j < getMaskLength() && isValid(i, p, buffer, true) !== false && tests[determineTestPosition(i)].def == tests[determineTestPosition(j)].def) {
|
|
if (j < getMaskLength() && isValid(i, p, buffer, true) !== false && tests[determineTestPosition(i)].def == tests[determineTestPosition(j)].def) {
|
|
|
setBufferElement(buffer, i, getBufferElement(buffer, j));
|
|
setBufferElement(buffer, i, getBufferElement(buffer, j));
|
|
|
- SetReTargetPlaceHolder(buffer, j); //cleanup next position
|
|
|
|
|
|
|
+ setReTargetPlaceHolder(buffer, j); //cleanup next position
|
|
|
} else {
|
|
} else {
|
|
|
if (isMask(i))
|
|
if (isMask(i))
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
} else if (c == undefined) break;
|
|
} else if (c == undefined) break;
|
|
|
} else {
|
|
} else {
|
|
|
- SetReTargetPlaceHolder(buffer, i);
|
|
|
|
|
|
|
+ setReTargetPlaceHolder(buffer, i);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
if (c != undefined)
|
|
if (c != undefined)
|
|
|
setBufferElement(buffer, isRTL ? end : seekPrevious(buffer, end), c);
|
|
setBufferElement(buffer, isRTL ? end : seekPrevious(buffer, end), c);
|
|
|
|
|
|
|
|
- buffer = TruncateInput(buffer.join(''), isRTL).split('');
|
|
|
|
|
|
|
+ buffer = truncateInput(buffer.join(''), isRTL).split('');
|
|
|
if (buffer.length == 0) buffer = _buffer.slice();
|
|
if (buffer.length == 0) buffer = _buffer.slice();
|
|
|
|
|
|
|
|
return start; //return the used start position
|
|
return start; //return the used start position
|
|
@@ -793,10 +807,10 @@
|
|
|
} else break;
|
|
} else break;
|
|
|
} else if (full !== true) break;
|
|
} else if (full !== true) break;
|
|
|
} else
|
|
} else
|
|
|
- SetReTargetPlaceHolder(buffer, i);
|
|
|
|
|
|
|
+ setReTargetPlaceHolder(buffer, i);
|
|
|
}
|
|
}
|
|
|
var lengthBefore = buffer.length;
|
|
var lengthBefore = buffer.length;
|
|
|
- buffer = TruncateInput(buffer.join(''), isRTL).split('');
|
|
|
|
|
|
|
+ buffer = truncateInput(buffer.join(''), isRTL).split('');
|
|
|
if (buffer.length == 0) buffer = _buffer.slice();
|
|
if (buffer.length == 0) buffer = _buffer.slice();
|
|
|
|
|
|
|
|
return end - (lengthBefore - buffer.length); //return new start position
|
|
return end - (lengthBefore - buffer.length); //return new start position
|
|
@@ -939,7 +953,7 @@
|
|
|
} else return false;
|
|
} else return false;
|
|
|
} else setBufferElement(buffer, opts.numericInput ? seekPrevious(buffer, p) : p, c);
|
|
} else setBufferElement(buffer, opts.numericInput ? seekPrevious(buffer, p) : p, c);
|
|
|
writeBuffer(input, buffer, opts.numericInput && p == 0 ? seekNext(buffer, p) : p);
|
|
writeBuffer(input, buffer, opts.numericInput && p == 0 ? seekNext(buffer, p) : p);
|
|
|
- if (opts.oncomplete && IsComplete(input))
|
|
|
|
|
|
|
+ if (opts.oncomplete && isComplete(input))
|
|
|
opts.oncomplete.call(input);
|
|
opts.oncomplete.call(input);
|
|
|
} else if (android) writeBuffer(input, buffer, pos.begin);
|
|
} else if (android) writeBuffer(input, buffer, pos.begin);
|
|
|
}
|
|
}
|
|
@@ -965,7 +979,7 @@
|
|
|
var next = seekNext(buffer, p);
|
|
var next = seekNext(buffer, p);
|
|
|
writeBuffer(input, buffer, next);
|
|
writeBuffer(input, buffer, next);
|
|
|
|
|
|
|
|
- if (opts.oncomplete && IsComplete(input))
|
|
|
|
|
|
|
+ if (opts.oncomplete && isComplete(input))
|
|
|
opts.oncomplete.call(input);
|
|
opts.oncomplete.call(input);
|
|
|
} else if (android) writeBuffer(input, buffer, pos.begin);
|
|
} else if (android) writeBuffer(input, buffer, pos.begin);
|
|
|
}
|
|
}
|