Browse Source

getMaskLength fix

Robin Herbots 11 years ago
parent
commit
7dce95d73c
1 changed files with 36 additions and 31 deletions
  1. 36 31
      js/jquery.inputmask.js

+ 36 - 31
js/jquery.inputmask.js

@@ -318,15 +318,15 @@
                 ignorable = false;
 
             //maskset helperfunctions
-            function getMaskTemplate(includeInput, minimalPos) {
+            function getMaskTemplate(baseOnInput, minimalPos) {
                 minimalPos = minimalPos || 0;
                 var maskTemplate = [], ndxIntlzr, pos = 0, test;
                 do {
-                    if (includeInput === true && getActiveMaskSet()['validPositions'][pos]) {
+                    if (baseOnInput === true && getActiveMaskSet()['validPositions'][pos]) {
                         var validPos = getActiveMaskSet()['validPositions'][pos];
                         test = validPos["match"];
                         ndxIntlzr = validPos["locator"].slice();
-                        maskTemplate.push(validPos["input"]);
+                        maskTemplate.push(test["fn"] == null ? test["def"] : opts.placeholder.charAt(pos % opts.placeholder.length));
                     } else {
                         var testPos = getActiveTests(pos, false, ndxIntlzr, pos - 1);
                         testPos = testPos[opts.greedy || minimalPos > pos ? 0 : (testPos.length - 1)];
@@ -362,7 +362,6 @@
 
             function getActiveTest(pos) {
                 if (getActiveMaskSet()['validPositions'][pos]) {
-                    console.log("get test from validpositions " + JSON.stringify(getActiveMaskSet()['validPositions'][pos]));
                     return getActiveMaskSet()['validPositions'][pos]["match"];
                 }
                 return getActiveTests(pos)[0]["match"];
@@ -422,15 +421,14 @@
                             var match = handleMatch(maskToken.matches[tndx], [tndx].concat(loopNdx), quantifierRecurse);
                             if (match && testPos == pos) {
                                 return match;
-                            } else if(testPos > pos) {
-                            	break;
+                            } else if (testPos > pos) {
+                                break;
                             }
                         }
                     }
                 }
 
                 if (disableCache !== true && getActiveMaskSet()['tests'][pos] && !getActiveMaskSet()['validPositions'][pos]) {
-                    console.log("hitting cache for " + pos + " - " + JSON.stringify(getActiveMaskSet()['tests'][pos]));
                     return getActiveMaskSet()['tests'][pos];
                 }
                 if (ndxIntlzr == undefined) {
@@ -461,7 +459,6 @@
                 if (matches.length == 0)
                     matches.push({ "match": { fn: null, cardinality: 0, optionality: true, casing: null, def: "" }, "locator": [] });
 
-                console.log(pos + " - " + JSON.stringify(matches));
                 getActiveMaskSet()['tests'][pos] = matches;
 
                 return matches;
@@ -560,14 +557,14 @@
                                             setLastValidPosition(lowestPos - 1);
                                             break;
                                         } else {
-                                            setBufferElement(getActiveBuffer(), i, masksets[lowestIndex]["buffer"][i], true);
+                                            setBufferElement(getActiveBuffer(), i, masksets[lowestIndex]["buffer"][i]);
                                             setLastValidPosition(i);
                                         }
                                     }
                                     //also check check for the lowestpos with the new input
                                     rsltValid = _isValid(lowestPos, c, true);
                                     if (rsltValid !== false) {
-                                        setBufferElement(getActiveBuffer(), lowestPos, c, true);
+                                        setBufferElement(getActiveBuffer(), lowestPos, c);
                                         setLastValidPosition(lowestPos);
                                     }
                                     return rslt;
@@ -604,10 +601,10 @@
                                     if (rsltValid === false) {
                                         break;
                                     } else {
-                                        setBufferElement(getActiveBuffer(), i, actualBuffer[i], true);
+                                        setBufferElement(getActiveBuffer(), i, actualBuffer[i]);
                                         if (rsltValid === true) {
                                             rsltValid = { "pos": i }; //always take a possible corrected maskposition into account
-                                        }          
+                                        }
                                     }
                                 }
                             }
@@ -670,13 +667,18 @@
 
             function isMask(pos) {
                 var test = getActiveTest(pos);
-                return test != undefined ? test.fn : false;
+                return test.fn != null ? test.fn : false;
             }
 
-            function getMaskLength() {	    	
-            	if (!getActiveMaskSet()['greedy']) {
-            		var lvp = getLastValidPosition() + 2;
-            		return getMaskTemplate(false, lvp)["mask"].length;
+            function getMaskLength() {
+                if (!getActiveMaskSet()['greedy']) {
+                    var lvp = getLastValidPosition() + 1,
+                        test = getActiveTest(lvp);
+                    while (test.fn != null && test.def != "") {
+                        var tests = getActiveTests(++lvp);
+                        test = tests[tests.length - 1];
+                    }
+                    return getMaskTemplate(false, lvp)["mask"].length;
                 }
                 return getActiveBuffer().length;
             }
@@ -704,8 +706,8 @@
                 return position;
             }
 
-            function setBufferElement(buffer, position, element, autoPrepare) {
-                if (autoPrepare) position = prepareBuffer(buffer, position);
+            function setBufferElement(buffer, position, element) {
+                position = prepareBuffer(buffer, position);
 
                 var test = getActiveTest(position);
                 var elem = element;
@@ -723,18 +725,19 @@
                 buffer[position] = elem;
             }
 
-            function getBufferElement(buffer, position, autoPrepare) {
-                if (autoPrepare) position = prepareBuffer(buffer, position);
+            function getBufferElement(buffer, position) {
+                position = prepareBuffer(buffer, position);
                 return buffer[position];
             }
 
             //needed to handle the non-greedy mask repetitions
-            function prepareBuffer(buffer, position) { //TODO DROP BUFFER PASSING
+            function prepareBuffer(buffer, position) { //TODO DROP BUFFER PASSING + optimize me
                 if (buffer.length <= position) {
                     trbuffer = getMaskTemplate(true, position).mask;
                     buffer.length = trbuffer.length;
                     for (var i = 0, bl = buffer.length; i < bl; i++) {
-                        buffer[i] = trbuffer[i];
+                        if (buffer[i] == undefined)
+                            buffer[i] = trbuffer[i];
                     }
                     buffer[position] = getPlaceholder(position);
                 }
@@ -876,7 +879,7 @@
                 }
             }
             function isComplete(buffer) { //return true / false / undefined (repeat *)
-		if($.isFunction(opts.isComplete)) return opts.isComplete.call($el, buffer, opts);
+                if ($.isFunction(opts.isComplete)) return opts.isComplete.call($el, buffer, opts);
                 if (opts.repeat == "*") return undefined;
                 var complete = false, highestValidPosition = 0, currentActiveMasksetIndex = activeMasksetIndex;
                 $.each(masksets, function (ndx, ms) {
@@ -946,8 +949,10 @@
                                     else {
                                         var result = valueGet(elem),
                                             inputData = $elem.data('_inputmask'), masksets = inputData['masksets'],
-                                            activeMasksetIndex = inputData['activeMasksetIndex'];
-                                        return result != masksets[activeMasksetIndex]['_buffer'].join('') ? result : '';
+                                            activeMasksetIndex = inputData['activeMasksetIndex'],
+                                            bufferTemplate = masksets[activeMasksetIndex]['_buffer'];
+                                        bufferTemplate = bufferTemplate ? bufferTemplate.join('') : '';
+                                        return result != bufferTemplate ? result : '';
                                     }
                                 } else return valueGet(elem);
                             },
@@ -1029,7 +1034,7 @@
                         var p = getBufferElement(buffer, j);
                         if (p != getPlaceholder(j)) {
                             if (j < getMaskLength() && isValid(i, p, true) !== false && getActiveTest(i).def == getActiveTest(j).def) {
-                                setBufferElement(buffer, i, p, true);
+                                setBufferElement(buffer, i, p);
                                 if (j < end) {
                                     setPlaceholder(j); //cleanup next position
                                 }
@@ -1057,14 +1062,14 @@
 
             function shiftR(start, end, c) {
                 var buffer = getActiveBuffer();
-                if (getBufferElement(buffer, start, true) != getPlaceholder(start)) {
+                if (getBufferElement(buffer, start) != getPlaceholder(start)) {
                     for (var i = seekPrevious(end) ; i > start && i >= 0; i--) {
                         if (isMask(i)) {
                             var j = seekPrevious(i);
                             var t = getBufferElement(buffer, j);
                             if (t != getPlaceholder(j)) {
                                 if (isValid(i, t, true) !== false && getActiveTest(i).def == getActiveTest(j).def) {
-                                    setBufferElement(buffer, i, t, true);
+                                    setBufferElement(buffer, i, t);
                                     setPlaceholder(j);
                                 } //else break;
                             }
@@ -1278,7 +1283,7 @@
                                         if (freePos < getMaskLength()) {
                                             shiftR(p, getMaskLength(), c);
                                         } else getActiveMaskSet()["writeOutBuffer"] = false;
-                                    } else setBufferElement(buffer, p, c, true);
+                                    } else setBufferElement(buffer, p, c);
                                     if (minimalForwardPosition == -1 || minimalForwardPosition > seekNext(p)) {
                                         minimalForwardPosition = seekNext(p);
                                     }
@@ -1743,7 +1748,7 @@
                 },
                 //specify keycodes which should not be considered in the keypress event, otherwise the preventDefault will stop their default behavior especially in FF
                 ignorables: [8, 9, 13, 19, 27, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 93, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123],
-				isComplete: undefined //override for isComplete - args => buffer, opts - return true || false
+                isComplete: undefined //override for isComplete - args => buffer, opts - return true || false
             },
             escapeRegex: function (str) {
                 var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'];