ソースを参照

keep validpositions + adjust tests accordingly

Robin Herbots 12 年 前
コミット
aa22692248
1 ファイル変更57 行追加27 行削除
  1. 57 27
      js/jquery.inputmask.js

+ 57 - 27
js/jquery.inputmask.js

@@ -214,6 +214,7 @@
                             "_buffer": undefined,
                             "_buffer": undefined,
                             "buffer": undefined,
                             "buffer": undefined,
                             "tests": {},
                             "tests": {},
+                            "validPositions": {},
                             "lastValidPosition": -1,
                             "lastValidPosition": -1,
                             "greedy": undefined,
                             "greedy": undefined,
                             "repeat": undefined,
                             "repeat": undefined,
@@ -229,6 +230,7 @@
                             "_buffer": undefined,
                             "_buffer": undefined,
                             "buffer": undefined,
                             "buffer": undefined,
                             "tests": {},
                             "tests": {},
+                            "validPositions": {},
                             "lastValidPosition": -1,
                             "lastValidPosition": -1,
                             "greedy": undefined,
                             "greedy": undefined,
                             "repeat": undefined,
                             "repeat": undefined,
@@ -252,7 +254,7 @@
                             //should contain for each validated position a ref to the masktoken in the form of indexes.  ex. 1,2,8 ~ maskTokens[1].matches[2].matches[8]
                             //should contain for each validated position a ref to the masktoken in the form of indexes.  ex. 1,2,8 ~ maskTokens[1].matches[2].matches[8]
                             //the buffer can be build upon these validPositions array
                             //the buffer can be build upon these validPositions array
                             //further validation start as from this index
                             //further validation start as from this index
-                            "validPositions": [],
+                            "validPositions": {},
                             "_buffer": undefined,
                             "_buffer": undefined,
                             "buffer": undefined,
                             "buffer": undefined,
                             "tests": {},
                             "tests": {},
@@ -312,8 +314,8 @@
 
 
                 var pos = 0, test;
                 var pos = 0, test;
                 do {
                 do {
-                    console.log("template " + pos);
-                    test = getActiveTests(pos);
+                    test = getActiveTest(pos);
+                    console.log("template " + pos + "  " + JSON.stringify(test));
                     maskTemplate.push(test["fn"] == null ? test["def"] : opts.placeholder.charAt(pos % opts.placeholder.length));
                     maskTemplate.push(test["fn"] == null ? test["def"] : opts.placeholder.charAt(pos % opts.placeholder.length));
                     pos++;
                     pos++;
                 } while (test["fn"] != null || (test["fn"] == null && test["def"] != "") && opts.repeat != "*"); //fixme
                 } while (test["fn"] != null || (test["fn"] == null && test["def"] != "") && opts.repeat != "*"); //fixme
@@ -324,6 +326,14 @@
                 return masksets[activeMasksetIndex];
                 return masksets[activeMasksetIndex];
             }
             }
 
 
+            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"];
+            }
+
             function getActiveTests(pos) {
             function getActiveTests(pos) {
                 var maskTokens = getActiveMaskSet()["maskToken"], testPos = 0, ndxInitializer = [0], matches = [];
                 var maskTokens = getActiveMaskSet()["maskToken"], testPos = 0, ndxInitializer = [0], matches = [];
 
 
@@ -375,16 +385,25 @@
                     }
                     }
                 }
                 }
 
 
-                if (getActiveMaskSet()['tests'][pos]) {
-                    return getActiveMaskSet()['tests'][pos][0]["match"]; //TODO FIXME
+                if (getActiveMaskSet()['tests'][pos] && !getActiveMaskSet()['validPositions'][pos]) {
+                    return getActiveMaskSet()['tests'][pos];
                 }
                 }
                 var previousPos = pos - 1, test;
                 var previousPos = pos - 1, test;
-                while ((test = getActiveMaskSet()['tests'][previousPos]) == undefined && previousPos > -1) {
+                while ((test = getActiveMaskSet()['validPositions'][previousPos]) == undefined && previousPos > -1) {
                     previousPos--;
                     previousPos--;
                 }
                 }
                 if (test != undefined) {
                 if (test != undefined) {
                     testPos = previousPos;
                     testPos = previousPos;
-                    ndxInitializer = test[0]["locator"].slice();
+                    ndxInitializer = test["locator"].slice();
+                } else {
+                    previousPos = pos - 1;
+                    while ((test = getActiveMaskSet()['tests'][previousPos]) == undefined && previousPos > -1) {
+                        previousPos--;
+                    }
+                    if (test != undefined) {
+                        testPos = previousPos;
+                        ndxInitializer = test[opts.greedy ? 0 : (test.length - 1)]["locator"].slice();
+                    }
                 }
                 }
                 for (var mtndx = ndxInitializer.shift() ; mtndx < maskTokens.length; mtndx++) {
                 for (var mtndx = ndxInitializer.shift() ; mtndx < maskTokens.length; mtndx++) {
                     var match = ResolveTestFromToken(maskTokens[mtndx], ndxInitializer, [mtndx]);
                     var match = ResolveTestFromToken(maskTokens[mtndx], ndxInitializer, [mtndx]);
@@ -398,7 +417,7 @@
                 console.log(pos + " - " + JSON.stringify(matches));
                 console.log(pos + " - " + JSON.stringify(matches));
                 getActiveMaskSet()['tests'][pos] = matches;
                 getActiveMaskSet()['tests'][pos] = matches;
 
 
-                return matches[0]["match"]; //TODO FIXME
+                return matches;
             }
             }
 
 
             function getActiveBufferTemplate() {
             function getActiveBufferTemplate() {
@@ -423,20 +442,31 @@
                 strict = strict === true; //always set a value to strict to prevent possible strange behavior in the extensions 
                 strict = strict === true; //always set a value to strict to prevent possible strange behavior in the extensions 
 
 
                 function _isValid(position, c, strict) {
                 function _isValid(position, c, strict) {
-                    var loopend = c ? 1 : 0, chrs = '', buffer = getActiveBuffer();
-                    for (var i = getActiveTests(position).cardinality; i > loopend; i--) {
-                        chrs += getBufferElement(buffer, position - (i - 1), true);
-                    }
-                    if (c) {
-                        chrs += c;
-                    }
+                    var rslt = false;
+                    $.each(getActiveTests(position), function (ndx, tst) {
+                        var test = tst["match"];
+                        var loopend = c ? 1 : 0, chrs = '', buffer = getActiveBuffer();
+                        for (var i = test.cardinality; i > loopend; i--) {
+                            chrs += getBufferElement(buffer, position - (i - 1), true);
+                        }
+                        if (c) {
+                            chrs += c;
+                        }
+
+                        //return is false or a json object => { pos: ??, c: ??} or true
+                        rslt = test.fn != null ?
+                            test.fn.test(chrs, buffer, position, strict, opts)
+                            : (c == getPlaceholder(position) || c == opts.skipOptionalPartCharacter) ?
+                                { "refresh": true, c: getPlaceholder(position), pos: position }
+                                : false;
+
+                        if (rslt !== false) {
+                            getActiveMaskSet()["validPositions"][position] = $.extend({}, tst, { "input": c });
+                            return false;
+                        }
+                    });
 
 
-                    //return is false or a json object => { pos: ??, c: ??} or true
-                    return getActiveTests(position).fn != null ?
-                        getActiveTests(position).fn.test(chrs, buffer, position, strict, opts)
-                        : (c == getPlaceholder(position) || c == opts.skipOptionalPartCharacter) ?
-                            { "refresh": true, c: getPlaceholder(position), pos: position }
-                            : false;
+                    return rslt;
                 }
                 }
 
 
                 function PostProcessResults(maskForwards, results) {
                 function PostProcessResults(maskForwards, results) {
@@ -591,7 +621,7 @@
             }
             }
 
 
             function isMask(pos) {
             function isMask(pos) {
-                var test = getActiveTests(pos);
+                var test = getActiveTest(pos);
                 return test != undefined ? test.fn : false;
                 return test != undefined ? test.fn : false;
             }
             }
 
 
@@ -625,7 +655,7 @@
             function setBufferElement(buffer, position, element, autoPrepare) {
             function setBufferElement(buffer, position, element, autoPrepare) {
                 if (autoPrepare) position = prepareBuffer(buffer, position);
                 if (autoPrepare) position = prepareBuffer(buffer, position);
 
 
-                var test = getActiveTests(position);
+                var test = getActiveTest(position);
                 var elem = element;
                 var elem = element;
                 if (elem != undefined && test != undefined) {
                 if (elem != undefined && test != undefined) {
                     switch (test.casing) {
                     switch (test.casing) {
@@ -682,7 +712,7 @@
             }
             }
 
 
             function getPlaceholder(pos) {
             function getPlaceholder(pos) {
-                var test = getActiveTests(pos);
+                var test = getActiveTest(pos);
                 return test["fn"] == null ? test["def"] : opts.placeholder.charAt(pos % opts.placeholder.length);
                 return test["fn"] == null ? test["def"] : opts.placeholder.charAt(pos % opts.placeholder.length);
             }
             }
 
 
@@ -727,7 +757,7 @@
             function clearOptionalTail(input) {
             function clearOptionalTail(input) {
                 var buffer = getActiveBuffer(), tmpBuffer = buffer.slice(), testPos, pos;
                 var buffer = getActiveBuffer(), tmpBuffer = buffer.slice(), testPos, pos;
                 for (var pos = tmpBuffer.length - 1; pos >= 0; pos--) {
                 for (var pos = tmpBuffer.length - 1; pos >= 0; pos--) {
-                    if (getActiveTests(pos).optionality) {
+                    if (getActiveTest(pos).optionality) {
                         if (!isMask(pos) || !isValid(pos, buffer[pos], true))
                         if (!isMask(pos) || !isValid(pos, buffer[pos], true))
                             tmpBuffer.pop();
                             tmpBuffer.pop();
                         else break;
                         else break;
@@ -947,7 +977,7 @@
                         var j = seekNext(i);
                         var j = seekNext(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, true) !== false && getActiveTests(i).def == getActiveTests(j).def) {
+                            if (j < getMaskLength() && isValid(i, p, true) !== false && getActiveTest(i).def == getActiveTest(j).def) {
                                 setBufferElement(buffer, i, p, true);
                                 setBufferElement(buffer, i, p, true);
                                 if (j < end) {
                                 if (j < end) {
                                     setPlaceholder(j); //cleanup next position
                                     setPlaceholder(j); //cleanup next position
@@ -982,7 +1012,7 @@
                             var j = seekPrevious(i);
                             var j = seekPrevious(i);
                             var t = getBufferElement(buffer, j);
                             var t = getBufferElement(buffer, j);
                             if (t != getPlaceholder(j)) {
                             if (t != getPlaceholder(j)) {
-                                if (isValid(j, t, true) !== false && getActiveTests(i).def == getActiveTests(j).def) {
+                                if (isValid(j, t, true) !== false && getActiveTest(i).def == getActiveTest(j).def) {
                                     setBufferElement(buffer, i, t, true);
                                     setBufferElement(buffer, i, t, true);
                                     setPlaceholder(j);
                                     setPlaceholder(j);
                                 } //else break;
                                 } //else break;