Browse Source

get basic maskstest from maskToken

Robin Herbots 12 years ago
parent
commit
9e75573cfd
1 changed files with 32 additions and 6 deletions
  1. 32 6
      js/jquery.inputmask.js

+ 32 - 6
js/jquery.inputmask.js

@@ -317,7 +317,7 @@
                 var ms = [];
                 var genmasks = []; //used to keep track of the masks that where processed, to avoid duplicates
                 var maskTokens = [];
-                function analyseMask(mask) { //just an idea - not in use for the moment
+                function analyseMask(mask) { //TODO HANDLE ESCAPES
                     var tokenizer = /(?:[?*+]|\{[0-9]+(?:,[0-9]*)?\})\??|[^.?*+^${[]()|\\]+|./g;
                     function maskToken() {
                         this.matches = [];
@@ -325,6 +325,19 @@
                         this.isOptional = false;
                         this.isQuantifier = false;
                     };
+                    function InsertTestDefinition(mtoken, element) {
+                        var maskdef = opts.definitions[element], escaped = false, isOptional = mtoken.isOptional;
+                        if (maskdef && !escaped) {
+                            var prevalidators = maskdef["prevalidator"], prevalidatorsL = prevalidators ? prevalidators.length : 0;
+                            for (var i = 1; i < maskdef.cardinality; i++) {
+                                var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator["validator"], cardinality = prevalidator["cardinality"];
+                                mtoken.matches.push({ fn: validator ? typeof validator == 'string' ? new RegExp(validator) : new function () { this.test = validator; } : new RegExp("."), cardinality: cardinality ? cardinality : 1, optionality: isOptional, casing: maskdef["casing"], def: maskdef["definitionSymbol"] || element });
+                            }
+                            mtoken.matches.push({ fn: maskdef.validator ? typeof maskdef.validator == 'string' ? new RegExp(maskdef.validator) : new function () { this.test = maskdef.validator; } : new RegExp("."), cardinality: maskdef.cardinality, optionality: isOptional, casing: maskdef["casing"], def: maskdef["definitionSymbol"] || element });
+                        } else {
+                            mtoken.matches.push({ fn: null, cardinality: 0, optionality: isOptional, casing: null, def: element });
+                        }
+                    }
                     var currentToken = new maskToken(),
                         match, m, openenings = [];
 
@@ -372,13 +385,16 @@
                                     currentToken.matches.push(quantifier);
                                 }
                                 break;
+                            case opts.escapeChar:
+                                alert("fixme");
+                                break;
                             default:
                                 if (openenings.length > 0) {
-                                    openenings[openenings.length - 1]["matches"].push(m);
+                                    InsertTestDefinition(openenings[openenings.length - 1], m);
                                 } else {
                                     if (currentToken.isGroup || currentToken.isOptional)
                                         currentToken = new maskToken();
-                                    currentToken.matches.push(m);
+                                    InsertTestDefinition(currentToken, m);
                                 }
                         }
                     }
@@ -522,8 +538,18 @@
                 }
 
                 function getActiveTests(pos) {
-                    if (pos != undefined) {
-                        var testPos = pos % getActiveMaskSet()['tests'].length;
+                    if (pos != undefined) { //enhance me for optionals and dynamic
+                        var maskTokens = getActiveMaskSet()["maskToken"], testPos = -1;
+                        for (var mtndx = 0; mtndx < maskTokens.length; mtndx++) {
+                            var mToken = maskTokens[mtndx];
+                            for (var tndx = 0; tndx < mToken.matches.length; tndx++) {
+                                testPos++;
+                                if (testPos == pos) {
+                                    return mToken.matches[tndx];
+                                }
+                            }
+                        }
+                        testPos = pos % getActiveMaskSet()['tests'].length;
                         return getActiveMaskSet()['tests'][testPos];
                     }
                     return getActiveMaskSet()['tests'];
@@ -934,7 +960,7 @@
                             if (ms["lastValidPosition"] >= highestValidPosition && ms["lastValidPosition"] == aml) {
                                 var msComplete = true;
                                 for (var i = 0; i <= aml; i++) {
-                                    var mask = isMask(i), testPos = determineTestPosition(i);
+                                    var mask = isMask(i);
                                     if ((mask && (buffer[i] == undefined || buffer[i] == getPlaceholder(i))) || (!mask && buffer[i] != getPlaceholder(i))) {
                                         msComplete = false;
                                         break;