ソースを参照

start dynamic masks

Robin Herbots 12 年 前
コミット
e7e5b577ad

+ 2 - 2
build.properties

@@ -6,8 +6,8 @@ srcdir = js
 distdir = dist
 
 build.major = 2
-build.minor = 4
-build.revision = 6
+build.minor = 6
+build.revision = 0
 
 target = jquery.inputmask.bundle.js
 target.min = jquery.inputmask.bundle.min.js

+ 1 - 1
component.json

@@ -1,6 +1,6 @@
 {
     "name": "jquery.inputmask",
-    "version": "2.4.6",
+    "version": "2.6.0",
     "main": "./dist/jquery.inputmask.bundle.js",
     "dependencies": {
         "jquery": ">=1.7"

BIN
dist/jQuery.InputMask.2.4.6.nupkg


+ 73 - 69
dist/jquery.inputmask.bundle.js

@@ -3,7 +3,7 @@
 * http://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2013 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 2.4.6
+* Version: 2.6.0
 */
 
 (function ($) {
@@ -252,7 +252,7 @@
                         var maskdef = opts.definitions[element];
                         if (maskdef && !escaped) {
                             for (var i = 0; i < maskdef.cardinality; i++) {
-                                outElem.push(getPlaceHolder(outCount + i));
+                                outElem.push(ggetPlaceholder(outCount + i));
                             }
                         } else {
                             outElem.push(element);
@@ -435,6 +435,7 @@
                             maskTemplate = getMaskTemplate(newMask);
                             ms.push({
                                 "mask": newMask,
+                                "maskToken": analyseMask(newMask),
                                 "_buffer": maskTemplate["mask"],
                                 "buffer": maskTemplate["mask"].slice(),
                                 "tests": getTestingChain(newMask),
@@ -450,6 +451,7 @@
                             maskTemplate = getMaskTemplate(newMask);
                             ms.push({
                                 "mask": newMask,
+                                "maskToken": analyseMask(newMask),
                                 "_buffer": maskTemplate["mask"],
                                 "buffer": maskTemplate["mask"].slice(),
                                 "tests": getTestingChain(newMask),
@@ -474,6 +476,7 @@
                             maskTemplate = getMaskTemplate(newMask);
                             ms.push({
                                 "mask": newMask,
+                                "maskToken": analyseMask(newMask),
                                 "_buffer": maskTemplate["mask"],
                                 "buffer": maskTemplate["mask"].slice(),
                                 "tests": getTestingChain(newMask),
@@ -494,16 +497,17 @@
                     $.each(opts.mask, function (ndx, msk) {
                         if (msk["mask"] != undefined) {
                             generateMask("", msk["mask"].toString(), msk);
-                        } else
+                        } else {
                             generateMask("", msk.toString());
+                        }
                     });
-                } else generateMask("", opts.mask.toString());
-
-                analyseMask(opts.mask);
+                } else {
+                    generateMask("", opts.mask.toString());
+                }
 
                 return opts.greedy ? ms : ms.sort(function (a, b) { return a["mask"].length - b["mask"].length; });
             }
-            function getPlaceHolder(pos) {
+            function ggetPlaceholder(pos) { //need tobe removed
                 return opts.placeholder.charAt(pos % opts.placeholder.length);
             }
 
@@ -517,7 +521,11 @@
                     return masksets[activeMasksetIndex];
                 }
 
-                function getActiveTests() {
+                function getActiveTests(pos) {
+                    if (pos != undefined) {
+                        var testPos = pos % getActiveMaskSet()['tests'].length;
+                        return getActiveMaskSet()['tests'][testPos];
+                    }
                     return getActiveMaskSet()['tests'];
                 }
 
@@ -532,21 +540,18 @@
                 function isValid(pos, c, strict) { //strict true ~ no correction or autofill
                     strict = strict === true; //always set a value to strict to prevent possible strange behavior in the extensions 
 
-                    function _isValid(position, activeMaskset, c, strict) {
-                        var testPos = determineTestPosition(position), loopend = c ? 1 : 0, chrs = '', buffer = activeMaskset["buffer"];
-                        for (var i = activeMaskset['tests'][testPos].cardinality; i > loopend; i--) {
-                            chrs += getBufferElement(buffer, testPos - (i - 1));
-                        }
-
-                        if (c) {
-                            chrs += c;
+                    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; }
 
                         //return is false or a json object => { pos: ??, c: ??} or true
-                        return activeMaskset['tests'][testPos].fn != null ?
-                            activeMaskset['tests'][testPos].fn.test(chrs, buffer, position, strict, opts)
-                            : (c == getBufferElement(activeMaskset['_buffer'], position, true) || c == opts.skipOptionalPartCharacter) ?
-                                { "refresh": true, c: getBufferElement(activeMaskset['_buffer'], position, true), pos: position }
+                        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;
                     }
 
@@ -577,21 +582,22 @@
                                     if (rslt["result"]["pos"] == lowestPos) {
                                         return rslt;
                                     } else if (rslt["result"] !== false) {
+                                        activeMasksetIndex = rslt["activeMasksetIndex"];
                                         for (var i = pos; i < lowestPos; i++) {
-                                            rsltValid = _isValid(i, masksets[rslt["activeMasksetIndex"]], masksets[lowestIndex]["buffer"][i], true);
+                                            rsltValid = _isValid(i, masksets[lowestIndex]["buffer"][i], true);
                                             if (rsltValid === false) {
-                                                masksets[rslt["activeMasksetIndex"]]["lastValidPosition"] = lowestPos - 1;
+                                                getActiveMaskSet()["lastValidPosition"] = lowestPos - 1;
                                                 break;
                                             } else {
-                                                setBufferElement(masksets[rslt["activeMasksetIndex"]]["buffer"], i, masksets[lowestIndex]["buffer"][i], true);
-                                                masksets[rslt["activeMasksetIndex"]]["lastValidPosition"] = i;
+                                                setBufferElement(getActiveBuffer(), i, masksets[lowestIndex]["buffer"][i], true);
+                                                getActiveMaskSet()["lastValidPosition"] = i;
                                             }
                                         }
                                         //also check check for the lowestpos with the new input
-                                        rsltValid = _isValid(lowestPos, masksets[rslt["activeMasksetIndex"]], c, true);
+                                        rsltValid = _isValid(lowestPos, c, true);
                                         if (rsltValid !== false) {
-                                            setBufferElement(masksets[rslt["activeMasksetIndex"]]["buffer"], lowestPos, c, true);
-                                            masksets[rslt["activeMasksetIndex"]]["lastValidPosition"] = lowestPos;
+                                            setBufferElement(getActiveBuffer(), lowestPos, c, true);
+                                            getActiveMaskSet()["lastValidPosition"] = lowestPos;
                                         }
                                         //console.log("ndx " + rslt["activeMasksetIndex"] + " validate " + masksets[rslt["activeMasksetIndex"]]["buffer"].join('') + " lv " + masksets[rslt["activeMasksetIndex"]]['lastValidPosition']);
                                         return rslt;
@@ -603,7 +609,7 @@
                     }
 
                     if (strict) {
-                        var result = _isValid(pos, getActiveMaskSet(), c, strict); //only check validity in current mask when validating strict
+                        var result = _isValid(pos, c, strict); //only check validity in current mask when validating strict
                         if (result === true) {
                             result = { "pos": pos }; //always take a possible corrected maskposition into account
                         }
@@ -624,7 +630,7 @@
                             if (lvp == actualLVP) {
                                 if ((maskPos - actualLVP) > 1) {
                                     for (var i = lvp == -1 ? 0 : lvp; i < maskPos; i++) {
-                                        rsltValid = _isValid(i, getActiveMaskSet(), actualBuffer[i], true);
+                                        rsltValid = _isValid(i, actualBuffer[i], true);
                                         if (rsltValid === false) {
                                             break;
                                         } else {
@@ -639,10 +645,10 @@
                                     }
                                 }
                                 //does the input match on a further position?
-                                if (!isMask(maskPos) && !_isValid(maskPos, getActiveMaskSet(), c, strict)) {
+                                if (!isMask(maskPos) && !_isValid(maskPos, c, strict)) {
                                     var maxForward = seekNext(maskPos) - maskPos;
                                     for (var fw = 0; fw < maxForward; fw++) {
-                                        if (_isValid(++maskPos, getActiveMaskSet(), c, strict) !== false)
+                                        if (_isValid(++maskPos, c, strict) !== false)
                                             break;
                                     }
                                     maskForwards.push(activeMasksetIndex);
@@ -652,7 +658,7 @@
 
                             if (getActiveMaskSet()['lastValidPosition'] >= actualLVP || activeMasksetIndex == currentActiveMasksetIndex) {
                                 if (maskPos >= 0 && maskPos < getMaskLength()) {
-                                    result = _isValid(maskPos, getActiveMaskSet(), c, strict);
+                                    result = _isValid(maskPos, c, strict);
                                     if (result !== false) {
                                         if (result === true) {
                                             result = { "pos": maskPos }; //always take a possible corrected maskposition into account
@@ -667,9 +673,9 @@
                             }
                         }
                     });
+                    var postResults = PostProcessResults(maskForwards, results); //return results of the multiple mask validations
                     activeMasksetIndex = currentActiveMasksetIndex; //reset activeMasksetIndex
-
-                    return PostProcessResults(maskForwards, results); //return results of the multiple mask validations
+                    return postResults;
                 }
 
                 function determineActiveMasksetIndex() {
@@ -700,9 +706,7 @@
                 }
 
                 function isMask(pos) {
-                    var testPos = determineTestPosition(pos);
-                    var test = getActiveTests()[testPos];
-
+                    var test = getActiveTests(pos);
                     return test != undefined ? test.fn : false;
                 }
 
@@ -743,7 +747,7 @@
                 function setBufferElement(buffer, position, element, autoPrepare) {
                     if (autoPrepare) position = prepareBuffer(buffer, position);
 
-                    var test = getActiveTests()[determineTestPosition(position)];
+                    var test = getActiveTests(position);
                     var elem = element;
                     if (elem != undefined && test != undefined) {
                         switch (test.casing) {
@@ -793,15 +797,16 @@
                             if (!isMask(i))
                                 setBufferElement(buffer, i, "");
                         } else
-                            setBufferElement(buffer, i, getBufferElement(getActiveBufferTemplate().slice(), i, true));
+                            setBufferElement(buffer, i, getPlaceholder(i));
                     }
-                }
+                };
 
-                ;
+                function setPlaceholder(pos) {
+                    setBufferElement(getActiveBuffer(), pos, getPlaceholder(pos));
+                }
 
-                function setReTargetPlaceHolder(buffer, pos) {
-                    var testPos = determineTestPosition(pos);
-                    setBufferElement(buffer, pos, getBufferElement(getActiveBufferTemplate(), testPos));
+                function getPlaceholder(pos) {
+                    return isMask(pos) ? opts.placeholder.charAt(pos % opts.placeholder.length) : getBufferElement(getActiveBufferTemplate(), determineTestPosition(pos));
                 }
 
                 function checkVal(input, writeOut, strict, nptvl, intelliCheck) {
@@ -818,14 +823,14 @@
                     if (writeOut) input._valueSet(""); //initial clear
                     var ml = getMaskLength();
                     $.each(inputValue, function (ndx, charCode) {
-                        if(intelliCheck === true) { 
-                        	var p = getActiveMaskSet()["p"], lvp = p == -1 ? p : seekPrevious(p),
+                        if (intelliCheck === true) {
+                            var p = getActiveMaskSet()["p"], lvp = p == -1 ? p : seekPrevious(p),
                         	pos = lvp == -1 ? ndx : seekNext(lvp);
                             if ($.inArray(charCode, getActiveBufferTemplate().slice(lvp + 1, pos)) == -1) {
-                            	$(input).trigger("_keypress", [true, charCode.charCodeAt(0), writeOut, strict, ndx]);
-                        	}
+                                $(input).trigger("_keypress", [true, charCode.charCodeAt(0), writeOut, strict, ndx]);
+                            }
                         } else {
-                          	$(input).trigger("_keypress", [true, charCode.charCodeAt(0), writeOut, strict, ndx]);
+                            $(input).trigger("_keypress", [true, charCode.charCodeAt(0), writeOut, strict, ndx]);
                         }
                     });
 
@@ -845,8 +850,7 @@
                 function clearOptionalTail(input) {
                     var buffer = getActiveBuffer(), tmpBuffer = buffer.slice(), testPos, pos;
                     for (var pos = tmpBuffer.length - 1; pos >= 0; pos--) {
-                        var testPos = determineTestPosition(pos);
-                        if (getActiveTests()[testPos].optionality) {
+                        if (getActiveTests(pos).optionality) {
                             if (!isMask(pos) || !isValid(pos, buffer[pos], true))
                                 tmpBuffer.pop();
                             else break;
@@ -931,7 +935,7 @@
                                 var msComplete = true;
                                 for (var i = 0; i <= aml; i++) {
                                     var mask = isMask(i), testPos = determineTestPosition(i);
-                                    if ((mask && (buffer[i] == undefined || buffer[i] == getPlaceHolder(i))) || (!mask && buffer[i] != getActiveBufferTemplate()[testPos])) {
+                                    if ((mask && (buffer[i] == undefined || buffer[i] == getPlaceholder(i))) || (!mask && buffer[i] != getPlaceholder(i))) {
                                         msComplete = false;
                                         break;
                                     }
@@ -985,7 +989,7 @@
                                 }
                             });
                         }
-                        if (getMaskLength() > maxLength && maxLength > -1) { //FF sets no defined max length to -1 
+                        if (getMaskLength() >= maxLength && maxLength > -1) { //FF sets no defined max length to -1 
                             if (maxLength < getActiveBufferTemplate().length) getActiveBufferTemplate().length = maxLength;
                             if (getActiveMaskSet()['greedy'] == false) {
                                 getActiveMaskSet()['repeat'] = Math.round(maxLength / getActiveBufferTemplate().length);
@@ -1291,14 +1295,14 @@
                             while (!isMask(start) && start - 1 >= 0) start--;
                         for (var i = start; i < end && i < getMaskLength() ; i++) {
                             if (isMask(i)) {
-                                setReTargetPlaceHolder(buffer, i);
+                                setPlaceholder(i);
                                 var j = seekNext(i);
                                 var p = getBufferElement(buffer, j);
-                                if (p != getPlaceHolder(j)) {
-                                    if (j < getMaskLength() && isValid(i, p, true) !== false && getActiveTests()[determineTestPosition(i)].def == getActiveTests()[determineTestPosition(j)].def) {
+                                if (p != getPlaceholder(j)) {
+                                    if (j < getMaskLength() && isValid(i, p, true) !== false && getActiveTests(i).def == getActiveTests(j).def) {
                                         setBufferElement(buffer, i, getBufferElement(buffer, j), true);
                                         if (j < end) {
-                                            setReTargetPlaceHolder(buffer, j); //cleanup next position
+                                            setPlaceholder(j); //cleanup next position
                                         }
                                     } else {
                                         if (isMask(i))
@@ -1306,7 +1310,7 @@
                                     }
                                 } //else if (c == undefined) break;
                             } else {
-                                setReTargetPlaceHolder(buffer, i);
+                                setPlaceholder(i);
                             }
                         }
                         if (c != undefined)
@@ -1329,10 +1333,10 @@
                             if (isMask(i)) {
                                 var t = getBufferElement(buffer, i, true);
                                 setBufferElement(buffer, i, c, true);
-                                if (t != getPlaceHolder(i)) {
+                                if (t != getPlaceholder(i)) {
                                     var j = seekNext(i);
                                     if (j < getMaskLength()) {
-                                        if (isValid(j, t, true) !== false && getActiveTests()[determineTestPosition(i)].def == getActiveTests()[determineTestPosition(j)].def)
+                                        if (isValid(j, t, true) !== false && getActiveTests(i).def == getActiveTests(j).def)
                                             c = t;
                                         else {
                                             if (isMask(j))
@@ -1345,7 +1349,7 @@
                                     if (full !== true) break;
                                 }
                             } else
-                                setReTargetPlaceHolder(buffer, i);
+                                setPlaceholder(buffer, i);
                         }
                         var lengthBefore = buffer.length;
                         if (getActiveMaskSet()["greedy"] == false) {
@@ -1514,7 +1518,7 @@
                                         $.each(masksets, function (ndx, lmnt) {
                                             if (typeof (lmnt) == "object") {
                                                 activeMasksetIndex = ndx;
-                                                shiftR(pos.begin, getMaskLength(), getPlaceHolder(pos.begin), true);
+                                                shiftR(pos.begin, getMaskLength(), getPlaceholder(pos.begin), true);
                                                 getActiveMaskSet()["lastValidPosition"] = seekNext(getActiveMaskSet()["lastValidPosition"]);
                                             }
                                         });
@@ -1553,14 +1557,14 @@
                                             if (opts.insertMode == true) {
                                                 var lastUnmaskedPosition = getMaskLength();
                                                 var bfrClone = buffer.slice();
-                                                while (getBufferElement(bfrClone, lastUnmaskedPosition, true) != getPlaceHolder(lastUnmaskedPosition) && lastUnmaskedPosition >= p) {
+                                                while (getBufferElement(bfrClone, lastUnmaskedPosition, true) != getPlaceholder(lastUnmaskedPosition) && lastUnmaskedPosition >= p) {
                                                     lastUnmaskedPosition = lastUnmaskedPosition == 0 ? -1 : seekPrevious(lastUnmaskedPosition);
                                                 }
                                                 if (lastUnmaskedPosition >= p) {
                                                     shiftR(p, buffer.length, c);
                                                     //shift the lvp if needed
                                                     var lvp = getActiveMaskSet()["lastValidPosition"], nlvp = seekNext(lvp);
-                                                    if (nlvp != getMaskLength() && lvp >= p && (getBufferElement(getActiveBuffer(), nlvp, true) != getPlaceHolder(nlvp))) {
+                                                    if (nlvp != getMaskLength() && lvp >= p && (getBufferElement(getActiveBuffer(), nlvp, true) != getPlaceholder(nlvp))) {
                                                         getActiveMaskSet()["lastValidPosition"] = nlvp;
                                                     }
                                                 } else getActiveMaskSet()["writeOutBuffer"] = false;
@@ -1663,7 +1667,7 @@ Input Mask plugin extensions
 http://github.com/RobinHerbots/jquery.inputmask
 Copyright (c) 2010 - 2013 Robin Herbots
 Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-Version: 2.4.6
+Version: 2.6.0
 
 Optional extensions on the jquery.inputmask base
 */
@@ -1785,7 +1789,7 @@ Input Mask plugin extensions
 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.4.6
+Version: 2.6.0
 
 Optional extensions on the jquery.inputmask base
 */
@@ -2269,7 +2273,7 @@ Input Mask plugin extensions
 http://github.com/RobinHerbots/jquery.inputmask
 Copyright (c) 2010 - 2013 Robin Herbots
 Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-Version: 2.4.6
+Version: 2.6.0
 
 Optional extensions on the jquery.inputmask base
 */
@@ -2446,7 +2450,7 @@ Input Mask plugin extensions
 http://github.com/RobinHerbots/jquery.inputmask
 Copyright (c) 2010 - 2013 Robin Herbots
 Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-Version: 2.4.6
+Version: 2.6.0
 
 Regex extensions on the jquery.inputmask base
 Allows for using regular expressions as a mask
@@ -2616,7 +2620,7 @@ Input Mask plugin extensions
 http://github.com/RobinHerbots/jquery.inputmask
 Copyright (c) 2010 - 2013 Robin Herbots
 Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-Version: 2.4.6
+Version: 2.6.0
 
 Phone extension.
 When using this extension make sure you specify the correct url to get the masks

ファイルの差分が大きいため隠しています
+ 76 - 76
dist/jquery.inputmask.bundle.min.js


ファイルの差分が大きいため隠しています
+ 48 - 48
dist/min/jquery.inputmask.js


+ 1 - 1
jquery.inputmask.jquery.json

@@ -8,7 +8,7 @@
 		"inputmask",
 		"mask"
     ],
-    "version": "2.4.6",
+    "version": "2.6.0",
     "author": {
         "name": "Robin Herbots",
         "url": "http://github.com/RobinHerbots/jquery.inputmask"

+ 66 - 62
js/jquery.inputmask.js

@@ -252,7 +252,7 @@
                         var maskdef = opts.definitions[element];
                         if (maskdef && !escaped) {
                             for (var i = 0; i < maskdef.cardinality; i++) {
-                                outElem.push(getPlaceHolder(outCount + i));
+                                outElem.push(ggetPlaceholder(outCount + i));
                             }
                         } else {
                             outElem.push(element);
@@ -435,6 +435,7 @@
                             maskTemplate = getMaskTemplate(newMask);
                             ms.push({
                                 "mask": newMask,
+                                "maskToken": analyseMask(newMask),
                                 "_buffer": maskTemplate["mask"],
                                 "buffer": maskTemplate["mask"].slice(),
                                 "tests": getTestingChain(newMask),
@@ -450,6 +451,7 @@
                             maskTemplate = getMaskTemplate(newMask);
                             ms.push({
                                 "mask": newMask,
+                                "maskToken": analyseMask(newMask),
                                 "_buffer": maskTemplate["mask"],
                                 "buffer": maskTemplate["mask"].slice(),
                                 "tests": getTestingChain(newMask),
@@ -474,6 +476,7 @@
                             maskTemplate = getMaskTemplate(newMask);
                             ms.push({
                                 "mask": newMask,
+                                "maskToken": analyseMask(newMask),
                                 "_buffer": maskTemplate["mask"],
                                 "buffer": maskTemplate["mask"].slice(),
                                 "tests": getTestingChain(newMask),
@@ -494,16 +497,17 @@
                     $.each(opts.mask, function (ndx, msk) {
                         if (msk["mask"] != undefined) {
                             generateMask("", msk["mask"].toString(), msk);
-                        } else
+                        } else {
                             generateMask("", msk.toString());
+                        }
                     });
-                } else generateMask("", opts.mask.toString());
-
-                analyseMask(opts.mask);
+                } else {
+                    generateMask("", opts.mask.toString());
+                }
 
                 return opts.greedy ? ms : ms.sort(function (a, b) { return a["mask"].length - b["mask"].length; });
             }
-            function getPlaceHolder(pos) {
+            function ggetPlaceholder(pos) { //need tobe removed
                 return opts.placeholder.charAt(pos % opts.placeholder.length);
             }
 
@@ -517,7 +521,11 @@
                     return masksets[activeMasksetIndex];
                 }
 
-                function getActiveTests() {
+                function getActiveTests(pos) {
+                    if (pos != undefined) {
+                        var testPos = pos % getActiveMaskSet()['tests'].length;
+                        return getActiveMaskSet()['tests'][testPos];
+                    }
                     return getActiveMaskSet()['tests'];
                 }
 
@@ -532,21 +540,18 @@
                 function isValid(pos, c, strict) { //strict true ~ no correction or autofill
                     strict = strict === true; //always set a value to strict to prevent possible strange behavior in the extensions 
 
-                    function _isValid(position, activeMaskset, c, strict) {
-                        var testPos = determineTestPosition(position), loopend = c ? 1 : 0, chrs = '', buffer = activeMaskset["buffer"];
-                        for (var i = activeMaskset['tests'][testPos].cardinality; i > loopend; i--) {
-                            chrs += getBufferElement(buffer, testPos - (i - 1));
-                        }
-
-                        if (c) {
-                            chrs += c;
+                    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; }
 
                         //return is false or a json object => { pos: ??, c: ??} or true
-                        return activeMaskset['tests'][testPos].fn != null ?
-                            activeMaskset['tests'][testPos].fn.test(chrs, buffer, position, strict, opts)
-                            : (c == getBufferElement(activeMaskset['_buffer'], position, true) || c == opts.skipOptionalPartCharacter) ?
-                                { "refresh": true, c: getBufferElement(activeMaskset['_buffer'], position, true), pos: position }
+                        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;
                     }
 
@@ -577,21 +582,22 @@
                                     if (rslt["result"]["pos"] == lowestPos) {
                                         return rslt;
                                     } else if (rslt["result"] !== false) {
+                                        activeMasksetIndex = rslt["activeMasksetIndex"];
                                         for (var i = pos; i < lowestPos; i++) {
-                                            rsltValid = _isValid(i, masksets[rslt["activeMasksetIndex"]], masksets[lowestIndex]["buffer"][i], true);
+                                            rsltValid = _isValid(i, masksets[lowestIndex]["buffer"][i], true);
                                             if (rsltValid === false) {
-                                                masksets[rslt["activeMasksetIndex"]]["lastValidPosition"] = lowestPos - 1;
+                                                getActiveMaskSet()["lastValidPosition"] = lowestPos - 1;
                                                 break;
                                             } else {
-                                                setBufferElement(masksets[rslt["activeMasksetIndex"]]["buffer"], i, masksets[lowestIndex]["buffer"][i], true);
-                                                masksets[rslt["activeMasksetIndex"]]["lastValidPosition"] = i;
+                                                setBufferElement(getActiveBuffer(), i, masksets[lowestIndex]["buffer"][i], true);
+                                                getActiveMaskSet()["lastValidPosition"] = i;
                                             }
                                         }
                                         //also check check for the lowestpos with the new input
-                                        rsltValid = _isValid(lowestPos, masksets[rslt["activeMasksetIndex"]], c, true);
+                                        rsltValid = _isValid(lowestPos, c, true);
                                         if (rsltValid !== false) {
-                                            setBufferElement(masksets[rslt["activeMasksetIndex"]]["buffer"], lowestPos, c, true);
-                                            masksets[rslt["activeMasksetIndex"]]["lastValidPosition"] = lowestPos;
+                                            setBufferElement(getActiveBuffer(), lowestPos, c, true);
+                                            getActiveMaskSet()["lastValidPosition"] = lowestPos;
                                         }
                                         //console.log("ndx " + rslt["activeMasksetIndex"] + " validate " + masksets[rslt["activeMasksetIndex"]]["buffer"].join('') + " lv " + masksets[rslt["activeMasksetIndex"]]['lastValidPosition']);
                                         return rslt;
@@ -603,7 +609,7 @@
                     }
 
                     if (strict) {
-                        var result = _isValid(pos, getActiveMaskSet(), c, strict); //only check validity in current mask when validating strict
+                        var result = _isValid(pos, c, strict); //only check validity in current mask when validating strict
                         if (result === true) {
                             result = { "pos": pos }; //always take a possible corrected maskposition into account
                         }
@@ -624,7 +630,7 @@
                             if (lvp == actualLVP) {
                                 if ((maskPos - actualLVP) > 1) {
                                     for (var i = lvp == -1 ? 0 : lvp; i < maskPos; i++) {
-                                        rsltValid = _isValid(i, getActiveMaskSet(), actualBuffer[i], true);
+                                        rsltValid = _isValid(i, actualBuffer[i], true);
                                         if (rsltValid === false) {
                                             break;
                                         } else {
@@ -639,10 +645,10 @@
                                     }
                                 }
                                 //does the input match on a further position?
-                                if (!isMask(maskPos) && !_isValid(maskPos, getActiveMaskSet(), c, strict)) {
+                                if (!isMask(maskPos) && !_isValid(maskPos, c, strict)) {
                                     var maxForward = seekNext(maskPos) - maskPos;
                                     for (var fw = 0; fw < maxForward; fw++) {
-                                        if (_isValid(++maskPos, getActiveMaskSet(), c, strict) !== false)
+                                        if (_isValid(++maskPos, c, strict) !== false)
                                             break;
                                     }
                                     maskForwards.push(activeMasksetIndex);
@@ -652,7 +658,7 @@
 
                             if (getActiveMaskSet()['lastValidPosition'] >= actualLVP || activeMasksetIndex == currentActiveMasksetIndex) {
                                 if (maskPos >= 0 && maskPos < getMaskLength()) {
-                                    result = _isValid(maskPos, getActiveMaskSet(), c, strict);
+                                    result = _isValid(maskPos, c, strict);
                                     if (result !== false) {
                                         if (result === true) {
                                             result = { "pos": maskPos }; //always take a possible corrected maskposition into account
@@ -667,9 +673,9 @@
                             }
                         }
                     });
+                    var postResults = PostProcessResults(maskForwards, results); //return results of the multiple mask validations
                     activeMasksetIndex = currentActiveMasksetIndex; //reset activeMasksetIndex
-
-                    return PostProcessResults(maskForwards, results); //return results of the multiple mask validations
+                    return postResults;
                 }
 
                 function determineActiveMasksetIndex() {
@@ -700,9 +706,7 @@
                 }
 
                 function isMask(pos) {
-                    var testPos = determineTestPosition(pos);
-                    var test = getActiveTests()[testPos];
-
+                    var test = getActiveTests(pos);
                     return test != undefined ? test.fn : false;
                 }
 
@@ -743,7 +747,7 @@
                 function setBufferElement(buffer, position, element, autoPrepare) {
                     if (autoPrepare) position = prepareBuffer(buffer, position);
 
-                    var test = getActiveTests()[determineTestPosition(position)];
+                    var test = getActiveTests(position);
                     var elem = element;
                     if (elem != undefined && test != undefined) {
                         switch (test.casing) {
@@ -793,15 +797,16 @@
                             if (!isMask(i))
                                 setBufferElement(buffer, i, "");
                         } else
-                            setBufferElement(buffer, i, getBufferElement(getActiveBufferTemplate().slice(), i, true));
+                            setBufferElement(buffer, i, getPlaceholder(i));
                     }
-                }
+                };
 
-                ;
+                function setPlaceholder(pos) {
+                    setBufferElement(getActiveBuffer(), pos, getPlaceholder(pos));
+                }
 
-                function setReTargetPlaceHolder(buffer, pos) {
-                    var testPos = determineTestPosition(pos);
-                    setBufferElement(buffer, pos, getBufferElement(getActiveBufferTemplate(), testPos));
+                function getPlaceholder(pos) {
+                    return isMask(pos) ? opts.placeholder.charAt(pos % opts.placeholder.length) : getBufferElement(getActiveBufferTemplate(), determineTestPosition(pos));
                 }
 
                 function checkVal(input, writeOut, strict, nptvl, intelliCheck) {
@@ -818,14 +823,14 @@
                     if (writeOut) input._valueSet(""); //initial clear
                     var ml = getMaskLength();
                     $.each(inputValue, function (ndx, charCode) {
-                        if(intelliCheck === true) { 
-                        	var p = getActiveMaskSet()["p"], lvp = p == -1 ? p : seekPrevious(p),
+                        if (intelliCheck === true) {
+                            var p = getActiveMaskSet()["p"], lvp = p == -1 ? p : seekPrevious(p),
                         	pos = lvp == -1 ? ndx : seekNext(lvp);
                             if ($.inArray(charCode, getActiveBufferTemplate().slice(lvp + 1, pos)) == -1) {
-                            	$(input).trigger("_keypress", [true, charCode.charCodeAt(0), writeOut, strict, ndx]);
-                        	}
+                                $(input).trigger("_keypress", [true, charCode.charCodeAt(0), writeOut, strict, ndx]);
+                            }
                         } else {
-                          	$(input).trigger("_keypress", [true, charCode.charCodeAt(0), writeOut, strict, ndx]);
+                            $(input).trigger("_keypress", [true, charCode.charCodeAt(0), writeOut, strict, ndx]);
                         }
                     });
 
@@ -845,8 +850,7 @@
                 function clearOptionalTail(input) {
                     var buffer = getActiveBuffer(), tmpBuffer = buffer.slice(), testPos, pos;
                     for (var pos = tmpBuffer.length - 1; pos >= 0; pos--) {
-                        var testPos = determineTestPosition(pos);
-                        if (getActiveTests()[testPos].optionality) {
+                        if (getActiveTests(pos).optionality) {
                             if (!isMask(pos) || !isValid(pos, buffer[pos], true))
                                 tmpBuffer.pop();
                             else break;
@@ -931,7 +935,7 @@
                                 var msComplete = true;
                                 for (var i = 0; i <= aml; i++) {
                                     var mask = isMask(i), testPos = determineTestPosition(i);
-                                    if ((mask && (buffer[i] == undefined || buffer[i] == getPlaceHolder(i))) || (!mask && buffer[i] != getActiveBufferTemplate()[testPos])) {
+                                    if ((mask && (buffer[i] == undefined || buffer[i] == getPlaceholder(i))) || (!mask && buffer[i] != getPlaceholder(i))) {
                                         msComplete = false;
                                         break;
                                     }
@@ -1291,14 +1295,14 @@
                             while (!isMask(start) && start - 1 >= 0) start--;
                         for (var i = start; i < end && i < getMaskLength() ; i++) {
                             if (isMask(i)) {
-                                setReTargetPlaceHolder(buffer, i);
+                                setPlaceholder(i);
                                 var j = seekNext(i);
                                 var p = getBufferElement(buffer, j);
-                                if (p != getPlaceHolder(j)) {
-                                    if (j < getMaskLength() && isValid(i, p, true) !== false && getActiveTests()[determineTestPosition(i)].def == getActiveTests()[determineTestPosition(j)].def) {
+                                if (p != getPlaceholder(j)) {
+                                    if (j < getMaskLength() && isValid(i, p, true) !== false && getActiveTests(i).def == getActiveTests(j).def) {
                                         setBufferElement(buffer, i, getBufferElement(buffer, j), true);
                                         if (j < end) {
-                                            setReTargetPlaceHolder(buffer, j); //cleanup next position
+                                            setPlaceholder(j); //cleanup next position
                                         }
                                     } else {
                                         if (isMask(i))
@@ -1306,7 +1310,7 @@
                                     }
                                 } //else if (c == undefined) break;
                             } else {
-                                setReTargetPlaceHolder(buffer, i);
+                                setPlaceholder(i);
                             }
                         }
                         if (c != undefined)
@@ -1329,10 +1333,10 @@
                             if (isMask(i)) {
                                 var t = getBufferElement(buffer, i, true);
                                 setBufferElement(buffer, i, c, true);
-                                if (t != getPlaceHolder(i)) {
+                                if (t != getPlaceholder(i)) {
                                     var j = seekNext(i);
                                     if (j < getMaskLength()) {
-                                        if (isValid(j, t, true) !== false && getActiveTests()[determineTestPosition(i)].def == getActiveTests()[determineTestPosition(j)].def)
+                                        if (isValid(j, t, true) !== false && getActiveTests(i).def == getActiveTests(j).def)
                                             c = t;
                                         else {
                                             if (isMask(j))
@@ -1345,7 +1349,7 @@
                                     if (full !== true) break;
                                 }
                             } else
-                                setReTargetPlaceHolder(buffer, i);
+                                setPlaceholder(buffer, i);
                         }
                         var lengthBefore = buffer.length;
                         if (getActiveMaskSet()["greedy"] == false) {
@@ -1514,7 +1518,7 @@
                                         $.each(masksets, function (ndx, lmnt) {
                                             if (typeof (lmnt) == "object") {
                                                 activeMasksetIndex = ndx;
-                                                shiftR(pos.begin, getMaskLength(), getPlaceHolder(pos.begin), true);
+                                                shiftR(pos.begin, getMaskLength(), getPlaceholder(pos.begin), true);
                                                 getActiveMaskSet()["lastValidPosition"] = seekNext(getActiveMaskSet()["lastValidPosition"]);
                                             }
                                         });
@@ -1553,14 +1557,14 @@
                                             if (opts.insertMode == true) {
                                                 var lastUnmaskedPosition = getMaskLength();
                                                 var bfrClone = buffer.slice();
-                                                while (getBufferElement(bfrClone, lastUnmaskedPosition, true) != getPlaceHolder(lastUnmaskedPosition) && lastUnmaskedPosition >= p) {
+                                                while (getBufferElement(bfrClone, lastUnmaskedPosition, true) != getPlaceholder(lastUnmaskedPosition) && lastUnmaskedPosition >= p) {
                                                     lastUnmaskedPosition = lastUnmaskedPosition == 0 ? -1 : seekPrevious(lastUnmaskedPosition);
                                                 }
                                                 if (lastUnmaskedPosition >= p) {
                                                     shiftR(p, buffer.length, c);
                                                     //shift the lvp if needed
                                                     var lvp = getActiveMaskSet()["lastValidPosition"], nlvp = seekNext(lvp);
-                                                    if (nlvp != getMaskLength() && lvp >= p && (getBufferElement(getActiveBuffer(), nlvp, true) != getPlaceHolder(nlvp))) {
+                                                    if (nlvp != getMaskLength() && lvp >= p && (getBufferElement(getActiveBuffer(), nlvp, true) != getPlaceholder(nlvp))) {
                                                         getActiveMaskSet()["lastValidPosition"] = nlvp;
                                                     }
                                                 } else getActiveMaskSet()["writeOutBuffer"] = false;