Browse Source

Fix issue 150 - Using optional mask don't work (99) 9999[9]-9999

Robin Herbots 13 years ago
parent
commit
3de7671f17
1 changed files with 63 additions and 53 deletions
  1. 63 53
      js/jquery.inputmask.js

+ 63 - 53
js/jquery.inputmask.js

@@ -3,7 +3,7 @@
 * http://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2012 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 2.0.3
+* Version: 2.0.4
 */
 
 (function ($) {
@@ -56,7 +56,7 @@
                 ignorables: [8, 9, 13, 16, 17, 18, 20, 27, 33, 34, 35, 36, 37, 38, 39, 40, 46, 91, 93, 108]
             },
             val: $.fn.val, //store the original jquery val function
-            escapeRegex: function(str) {
+            escapeRegex: function (str) {
                 var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'];
                 return str.replace(new RegExp('(\\' + specials.join('|\\') + ')', 'gim'), '\\$1');
             }
@@ -322,8 +322,13 @@
                     activeMasksetIndex = index;
 
                     var maskPos = pos;
-                    if (currentActiveMasksetIndex != activeMasksetIndex && !isMask(pos)) {  
-                    	//TODO optimize when input is nomask but matches another mask - set active mask
+                    if (currentActiveMasksetIndex != activeMasksetIndex && !isMask(pos)) {
+                        if (c == activeMaskset['_buffer'][maskPos]) { //match non-mask item
+                            results[index] = { "refresh": true };  //new command hack only rewrite buffer
+                            activeMaskset['lastValidPosition'] = maskPos;
+                            return false;
+                        }
+
                         maskPos = isRTL ? seekPrevious(buffer, pos) : seekNext(buffer, pos);
                     }
 
@@ -348,7 +353,7 @@
                         }
                     }
                 });
-
+                activeMasksetIndex = currentActiveMasksetIndex; //reset activeMasksetIndex
                 determineActiveMasksetIndex(buffer, pos, currentActiveMasksetIndex, isRTL);
                 result = results[activeMasksetIndex] || result;
                 setTimeout(function () { opts.onKeyValidation.call(this, result, opts); }, 0); //extra stuff to execute on keydown
@@ -356,7 +361,6 @@
             }
 
             function determineActiveMasksetIndex(buffer, pos, currentActiveMasksetIndex, isRTL) {
-                activeMasksetIndex = currentActiveMasksetIndex; //reset activeMasksetIndex
                 $.each(masksets, function (index, value) {
                     var activeMaskset = this;
                     if (isRTL ? activeMaskset['lastValidPosition'] <= pos : activeMaskset['lastValidPosition'] >= pos) {
@@ -558,7 +562,7 @@
             function escapeRegex(str) {
                 return $.inputmask.escapeRegex.call(this, str);
             }
-            
+
             function truncateInput(inputValue, rtl) {
                 return rtl ? inputValue.replace(new RegExp("^(" + escapeRegex(getActiveBuffer().join('')) + ")*"), "") : inputValue.replace(new RegExp("(" + escapeRegex(getActiveBuffer().join('')) + ")*$"), "");
             }
@@ -774,7 +778,7 @@
                     setTimeout(function () {
                         caret(input, checkVal(input, buffer, true));
                         if (isComplete(input))
-                          $input.trigger("complete");
+                            $input.trigger("complete");
                     }, 0);
                 }).bind('setvalue.inputmask', function () {
                     var input = this;
@@ -810,23 +814,23 @@
                 //private functions
                 function isComplete(npt) {
                     var complete = false, nptValue = npt._valueGet(), ml = nptValue.length
-                    	currentActiveMasksetIndex = activeMasksetIndex, highestValidPosition = 0;
-                    $.each(masksets, function(ndx, ms) {
-                    	activeMasksetIndex = ndx;
-                    	var aml = getMaskLength();
-                     	if(ms["lastValidPosition"] >= highestValidPosition && ms["lastValidPosition"] == (aml - 1)) {
-                     	    var msComplete = true;
-                    		for (var i = 0; i < aml; i++) {
-                        		if (isMask(i) && nptValue.charAt(i) == getPlaceHolder(i)) {
-                            		msComplete = false;
-                            		break;
-                        		}
-                    		}
-                    		complete = complete || msComplete;
-                    		if(complete) //break loop
-                    		 	return false;                    	
-                    	}
-                    	highestValidPosition = ms["lastValidPosition"];
+                    currentActiveMasksetIndex = activeMasksetIndex, highestValidPosition = 0;
+                    $.each(masksets, function (ndx, ms) {
+                        activeMasksetIndex = ndx;
+                        var aml = getMaskLength();
+                        if (ms["lastValidPosition"] >= highestValidPosition && ms["lastValidPosition"] == (aml - 1)) {
+                            var msComplete = true;
+                            for (var i = 0; i < aml; i++) {
+                                if (isMask(i) && nptValue.charAt(i) == getPlaceHolder(i)) {
+                                    msComplete = false;
+                                    break;
+                                }
+                            }
+                            complete = complete || msComplete;
+                            if (complete) //break loop
+                                return false;
+                        }
+                        highestValidPosition = ms["lastValidPosition"];
                     });
                     activeMasksetIndex = currentActiveMasksetIndex; //reset activeMaskset
                     return complete;
@@ -1099,29 +1103,32 @@
                             if (isRTL) {
                                 var p = opts.numericInput ? pos.end : seekPrevious(buffer, pos.end), np;
                                 if ((np = isValid(p == maskL || getBufferElement(buffer, p) == opts.radixPoint ? seekPrevious(buffer, p) : p, c, buffer, false, isRTL)) !== false) {
+                                    var refresh = false;
                                     if (np !== true) {
-                                        p = np.pos || pos; //set new position from isValid
+                                        refresh = np["refresh"]; //only rewrite buffer from isValid
+                                        p = np.pos || p; //set new position from isValid
                                         c = np.c || c; //set new char from isValid
                                     }
-
-                                    var firstUnmaskedPosition = firstMaskPos;
-                                    if (opts.insertMode == true) {
-                                        if (opts.greedy == true) {
-                                            var bfrClone = buffer.slice();
-                                            while (getBufferElement(bfrClone, firstUnmaskedPosition, true) != getPlaceHolder(firstUnmaskedPosition) && firstUnmaskedPosition <= p) {
-                                                firstUnmaskedPosition = firstUnmaskedPosition == maskL ? (maskL + 1) : seekNext(buffer, firstUnmaskedPosition);
+                                    if (refresh !== true) {
+                                        var firstUnmaskedPosition = firstMaskPos;
+                                        if (opts.insertMode == true) {
+                                            if (opts.greedy == true) {
+                                                var bfrClone = buffer.slice();
+                                                while (getBufferElement(bfrClone, firstUnmaskedPosition, true) != getPlaceHolder(firstUnmaskedPosition) && firstUnmaskedPosition <= p) {
+                                                    firstUnmaskedPosition = firstUnmaskedPosition == maskL ? (maskL + 1) : seekNext(buffer, firstUnmaskedPosition);
+                                                }
                                             }
-                                        }
 
-                                        if (firstUnmaskedPosition <= p && (opts.greedy || buffer.length < maskL)) {
-                                            if (buffer[firstMaskPos] != getPlaceHolder(firstMaskPos) && buffer.length < maskL) {
-                                                var offset = prepareBuffer(buffer, -1, isRTL);
-                                                if (pos.end != 0) p = p + offset;
-                                                maskL = buffer.length;
-                                            }
-                                            shiftL(firstUnmaskedPosition, opts.numericInput ? seekPrevious(buffer, p) : p, c);
-                                        } else return false;
-                                    } else setBufferElement(buffer, opts.numericInput ? seekPrevious(buffer, p) : p, c);
+                                            if (firstUnmaskedPosition <= p && (opts.greedy || buffer.length < maskL)) {
+                                                if (buffer[firstMaskPos] != getPlaceHolder(firstMaskPos) && buffer.length < maskL) {
+                                                    var offset = prepareBuffer(buffer, -1, isRTL);
+                                                    if (pos.end != 0) p = p + offset;
+                                                    maskL = buffer.length;
+                                                }
+                                                shiftL(firstUnmaskedPosition, opts.numericInput ? seekPrevious(buffer, p) : p, c);
+                                            } else return false;
+                                        } else setBufferElement(buffer, opts.numericInput ? seekPrevious(buffer, p) : p, c);
+                                    }
                                     writeBuffer(input, buffer, opts.numericInput && p == 0 ? seekNext(buffer, p) : p);
                                     setTimeout(function () { //timeout needed for IE
                                         if (isComplete(input))
@@ -1133,21 +1140,24 @@
                                 var p = seekNext(buffer, pos.begin - 1), np;
                                 prepareBuffer(buffer, p, isRTL);
                                 if ((np = isValid(p, c, buffer, false, isRTL)) !== false) {
+                                    var refresh = false;
                                     if (np !== true) {
+                                        refresh = np["refresh"]; //only rewrite buffer from isValid
                                         p = np.pos || p; //set new position from isValid
                                         c = np.c || c; //set new char from isValid
                                     }
-                                    if (opts.insertMode == true) {
-                                        var lastUnmaskedPosition = getMaskLength();
-                                        var bfrClone = buffer.slice();
-                                        while (getBufferElement(bfrClone, lastUnmaskedPosition, true) != getPlaceHolder(lastUnmaskedPosition) && lastUnmaskedPosition >= p) {
-                                            lastUnmaskedPosition = lastUnmaskedPosition == 0 ? -1 : seekPrevious(buffer, lastUnmaskedPosition);
-                                        }
-                                        if (lastUnmaskedPosition >= p)
-                                            shiftR(p, buffer.length, c);
-                                        else return false;
+                                    if (refresh !== true) {
+                                        if (opts.insertMode == true) {
+                                            var lastUnmaskedPosition = getMaskLength();
+                                            var bfrClone = buffer.slice();
+                                            while (getBufferElement(bfrClone, lastUnmaskedPosition, true) != getPlaceHolder(lastUnmaskedPosition) && lastUnmaskedPosition >= p) {
+                                                lastUnmaskedPosition = lastUnmaskedPosition == 0 ? -1 : seekPrevious(buffer, lastUnmaskedPosition);
+                                            }
+                                            if (lastUnmaskedPosition >= p)
+                                                shiftR(p, buffer.length, c);
+                                            else return false;
+                                        } else setBufferElement(buffer, p, c);
                                     }
-                                    else setBufferElement(buffer, p, c);
                                     var next = seekNext(buffer, p);
                                     writeBuffer(input, buffer, next);