Browse Source

fix for optional mask

Robin Herbots 15 years ago
parent
commit
b48ec8e022
1 changed files with 43 additions and 28 deletions
  1. 43 28
      jquery.inputmask.js

+ 43 - 28
jquery.inputmask.js

@@ -3,7 +3,7 @@ Input Mask plugin for jquery
 http://github.com/RobinHerbots/jquery.inputmask
 Copyright (c) 2010 Robin Herbots
 Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-Version: 0.2.4h
+Version: 0.2.5
    
 This plugin is based on the masked input plugin written by Josh Bush (digitalbush.com)
 */
@@ -206,14 +206,16 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
             //apply offset
             if (tests[testPos].optionality) {
                 firstMaskPosition = isFirstMaskOfBlock(testPos);
-                if (firstMaskPosition || tests[testPos].newBlockMarker) {
-                    clearOffsets(testPos - (firstMaskPosition ? firstMaskPosition : 0), testPos + tests[testPos].offset);
-                }
-                else {
-                    var newPos = pos + tests[testPos].offset;
-                    //                    while (newPos <= getMaskLength() && !isMask(newPos)) { newPos++; };
-                    testPos = determineTestPosition(newPos);
-                    firstMaskPosition = isFirstMaskOfBlock(testPos);
+                if (tests[testPos].offset > 0) {
+                    if (firstMaskPosition) {
+                        clearOffsets(firstMaskPosition, firstMaskPosition + tests[firstMaskPosition].offset, buffer);
+                    }
+                    else {
+                        var newPos = pos + tests[testPos].offset;
+                        //                    while (newPos <= getMaskLength() && !isMask(newPos)) { newPos++; };
+                        testPos = determineTestPosition(newPos);
+                        firstMaskPosition = isFirstMaskOfBlock(testPos);
+                    }
                 }
             }
 
@@ -229,8 +231,8 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
             var testResult = tests[testPos].regex != null ? tests[testPos].regex.test(chrs) : false;
 
             if (!testResult) {
-                if (tests[testPos].optionality && (firstMaskPosition || tests[testPos].newBlockMarker)) {
-                    return isValid(seekNext(buffer, pos - (testPos - (firstMaskPosition ? firstMaskPosition : 0)), true), c, buffer)
+                if (tests[testPos].optionality && firstMaskPosition) {
+                    return isValid(seekNext(buffer, pos - (testPos - firstMaskPosition), true), c, buffer)
                 }
             }
             return testResult;
@@ -248,7 +250,7 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
 
         function isFirstMaskOfBlock(testPosition) {
             if (!tests[testPosition].newBlockMarker)
-                while (testPosition > 0 && !tests[--testPosition].newBlockMarker && tests[testPosition].regex == null) { }; //search marker in nonmask items
+                while (testPosition > 0 && !tests[testPosition - 1].newBlockMarker && tests[testPosition - 1].regex == null) { testPosition--; }; //search marker in nonmask items
 
             return tests[testPosition].newBlockMarker ? testPosition : false;
         }
@@ -257,10 +259,12 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
             return pos % tests.length;
         }
 
-        function clearOffsets(start, end) {
+        function clearOffsets(start, end, buffer) {
             for (var i = start; i < end && i < getMaskLength(); i++) {
                 tests[determineTestPosition(i)].offset = 0;
             }
+            if (buffer)
+                SetReTargetPlaceHolder(buffer, start);
         }
 
         function getMaskLength() {
@@ -281,10 +285,11 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
                     for (var i = 0; i < offset; i++) {
                         tests[determineTestPosition(pos + i)].offset = offset;
                     }
+                    SetReTargetPlaceHolder(buffer, pos);
                 }
                 position--;
             }
-            while (++position <= getMaskLength() && !isMask(position)) { SetReTargetPlaceHolder(buffer, position); };
+            while (++position <= getMaskLength() && !isMask(position)) { };
             return position;
         }
         //these are needed to handle the non-greedy mask repetitions
@@ -313,20 +318,22 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
             var test = tests[testPos];
             if (test != undefined) {
                 if (test.optionality && test.offset > 0) {
-                    //fixme
                     var firstMaskPosition = isFirstMaskOfBlock(testPos);
                     if (firstMaskPosition && _numberOfRemovedElementsFromMask >= test.offset) {
-                        //                        buffer.splice(pos, 0, _buffer.slice(testPos, testPos + test.offset));
-                        //                        _numberOfRemovedElementsFromMask -= test.offset;
+                        setBufferElement(buffer, pos, getBufferElement(_buffer, testPos));
+                        $.each(_buffer.slice(testPos, testPos + test.offset), function() {
+                            buffer.splice(pos++, 0, this.toString());
+                        });
+                        _numberOfRemovedElementsFromMask -= test.offset;
                     }
                     else {
                         var testedPosition = pos + test.offset;
                         setBufferElement(buffer, pos, getBufferElement(_buffer, determineTestPosition(testedPosition)));
-                        //                        if (testedPosition < buffer.length) {
-                        //                            //remove RetargetPosition
-                        //                            buffer.splice(pos + test.offset, test.offset);
-                        //                            _numberOfRemovedElementsFromMask += test.offset;
-                        //                        }
+                        if (testedPosition < buffer.length) {
+                            //remove RetargetPosition
+                            buffer.splice(pos + test.offset, test.offset);
+                            _numberOfRemovedElementsFromMask += test.offset;
+                        }
                     }
                 } else setBufferElement(buffer, pos, getBufferElement(_buffer, testPos));
             }
@@ -458,10 +465,18 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
                     if (isMask(i)) {
                         SetReTargetPlaceHolder(buffer, i);
                         var j = seekNext(buffer, i);
-                        if (j < getMaskLength() && isValid(i, getBufferElement(buffer, j), buffer)) {
-                            setBufferElement(buffer, i, getBufferElement(buffer, j));
-                        } else
-                            break;
+                        var p = getBufferElement(buffer, j);
+                        if (p != opts.placeholder) {
+                            if (j < getMaskLength() && isValid(i, p, buffer)) {
+                                setBufferElement(buffer, i, getBufferElement(buffer, j));
+                            } else {
+                                if (tests[i] && tests[i].newBlockMarker) {
+                                    clearOffsets(i, i + tests[i].offset, buffer);
+                                }
+                                if (isMask(i))
+                                    break;
+                            }
+                        } else break;
                     } else
                         SetReTargetPlaceHolder(buffer, i);
                 }
@@ -478,12 +493,12 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
                         setBufferElement(buffer, i, c);
                         if (t != opts.placeholder) {
                             var j = seekNext(buffer, i);
-//                            if (!isMask(i + 1)) SetReTargetPlaceHolder(buffer, i + 1); //remark nonmask elements
+                            //                            if (!isMask(i + 1)) SetReTargetPlaceHolder(buffer, i + 1); //remark nonmask elements
                             if (j < getMaskLength() && isValid(j, t, buffer))
                                 c = t;
                             else {
                                 if (tests[j] && tests[j].newBlockMarker) {
-                                    clearOffsets(j, j + tests[j].offset);
+                                    clearOffsets(j, j + tests[j].offset, buffer);
                                 }
                                 if (isMask(j))
                                     break;