Browse Source

fixup gettest for quantifiers with jit

Robin Herbots 7 years ago
parent
commit
e805d81240
50 changed files with 490 additions and 503 deletions
  1. 1 0
      CHANGELOG.md
  2. 1 1
      bower.json
  3. 1 1
      component.json
  4. 1 1
      composer.json
  5. 1 1
      dist/inputmask/bindings/inputmask.binding.js
  6. 1 1
      dist/inputmask/dependencyLibs/inputmask.dependencyLib.jqlite.js
  7. 1 1
      dist/inputmask/dependencyLibs/inputmask.dependencyLib.jquery.js
  8. 1 1
      dist/inputmask/dependencyLibs/inputmask.dependencyLib.js
  9. 1 1
      dist/inputmask/global/document.js
  10. 1 1
      dist/inputmask/global/window.js
  11. 1 1
      dist/inputmask/inputmask.date.extensions.js
  12. 1 1
      dist/inputmask/inputmask.extensions.js
  13. 14 18
      dist/inputmask/inputmask.js
  14. 1 1
      dist/inputmask/inputmask.numeric.extensions.js
  15. 1 1
      dist/inputmask/inputmask.phone.extensions.js
  16. 1 1
      dist/inputmask/jquery.inputmask.js
  17. 1 1
      dist/inputmask/phone-codes/phone-be.js
  18. 1 1
      dist/inputmask/phone-codes/phone-ca.js
  19. 1 1
      dist/inputmask/phone-codes/phone-hu.js
  20. 1 1
      dist/inputmask/phone-codes/phone-it.js
  21. 1 1
      dist/inputmask/phone-codes/phone-mx.js
  22. 1 1
      dist/inputmask/phone-codes/phone-nl.js
  23. 1 1
      dist/inputmask/phone-codes/phone-ru.js
  24. 1 1
      dist/inputmask/phone-codes/phone.js
  25. 14 18
      dist/jquery.inputmask.bundle.js
  26. 1 1
      dist/min/inputmask/bindings/inputmask.binding.min.js
  27. 1 1
      dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.jqlite.min.js
  28. 1 1
      dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.jquery.min.js
  29. 1 1
      dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.min.js
  30. 1 1
      dist/min/inputmask/global/document.min.js
  31. 1 1
      dist/min/inputmask/global/window.min.js
  32. 1 1
      dist/min/inputmask/inputmask.date.extensions.min.js
  33. 1 1
      dist/min/inputmask/inputmask.extensions.min.js
  34. 2 2
      dist/min/inputmask/inputmask.min.js
  35. 1 1
      dist/min/inputmask/inputmask.numeric.extensions.min.js
  36. 1 1
      dist/min/inputmask/inputmask.phone.extensions.min.js
  37. 1 1
      dist/min/inputmask/jquery.inputmask.min.js
  38. 1 1
      dist/min/inputmask/phone-codes/phone-be.min.js
  39. 1 1
      dist/min/inputmask/phone-codes/phone-ca.min.js
  40. 1 1
      dist/min/inputmask/phone-codes/phone-hu.min.js
  41. 1 1
      dist/min/inputmask/phone-codes/phone-it.min.js
  42. 1 1
      dist/min/inputmask/phone-codes/phone-mx.min.js
  43. 1 1
      dist/min/inputmask/phone-codes/phone-nl.min.js
  44. 1 1
      dist/min/inputmask/phone-codes/phone-ru.min.js
  45. 1 1
      dist/min/inputmask/phone-codes/phone.min.js
  46. 2 2
      dist/min/jquery.inputmask.bundle.min.js
  47. 13 32
      js/inputmask.js
  48. 1 1
      package.json
  49. 1 1
      qunit/qunit.html
  50. 401 388
      qunit/tests_dynamic.js

+ 1 - 0
CHANGELOG.md

@@ -2,6 +2,7 @@
 
 ## [UNRELEASED]
 ### Updates
+- enhance gettests to
 - pass initial validation position to postvalidation, to allow prefills in the datetime alias
 - remove caret selection for insertMode => use inputmask.css for visualization
 - update nuget package

+ 1 - 1
bower.json

@@ -1,6 +1,6 @@
 {
   "name": "inputmask",
-  "version": "4.0.1-beta.25",
+  "version": "4.0.1-beta.29",
   "main": [
 	  "./index.js",
     "./css/inputmask.css"

+ 1 - 1
component.json

@@ -2,7 +2,7 @@
 	"name": "inputmask",
 	"repository": "robinherbots/Inputmask",
 	"description": "Inputmask is a javascript library which creates an input mask.  Inputmask can run against vanilla javascript, jQuery and jqlite.",
-	"version": "4.0.1-beta.25",
+	"version": "4.0.1-beta.29",
 	"keywords": [
 		"jquery",
 		"plugins",

+ 1 - 1
composer.json

@@ -1,7 +1,7 @@
 {
   "name": "robinherbots/inputmask",
   "description": "Inputmask is a javascript library which creates an input mask.  Inputmask can run against vanilla javascript, jQuery and jqlite.",
-  "version": "4.0.1-beta.25",
+  "version": "4.0.1-beta.29",
   "type": "library",
   "keywords": ["jquery", "plugins", "input", "form", "inputmask", "mask"],
   "homepage": "http://robinherbots.github.io/Inputmask",

+ 1 - 1
dist/inputmask/bindings/inputmask.binding.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 1 - 1
dist/inputmask/dependencyLibs/inputmask.dependencyLib.jqlite.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 1 - 1
dist/inputmask/dependencyLibs/inputmask.dependencyLib.jquery.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 1 - 1
dist/inputmask/dependencyLibs/inputmask.dependencyLib.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 1 - 1
dist/inputmask/global/document.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 "function" == typeof define && define.amd ? define(function() {

+ 1 - 1
dist/inputmask/global/window.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 "function" == typeof define && define.amd ? define(function() {

+ 1 - 1
dist/inputmask/inputmask.date.extensions.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 1 - 1
dist/inputmask/inputmask.extensions.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 14 - 18
dist/inputmask/inputmask.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {
@@ -73,20 +73,17 @@
     }
     function maskScope(actionObj, maskset, opts) {
         maskset = maskset || this.maskset, opts = opts || this.opts;
-        var undoValue, $el, maxLength, colorMask, jitPos, inputmask = this, el = this.el, isRTL = this.isRTL, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, mouseEnter = !1, jitOffset = 0, originalPlaceholder = "";
+        var undoValue, $el, maxLength, colorMask, inputmask = this, el = this.el, isRTL = this.isRTL, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, mouseEnter = !1, originalPlaceholder = "";
         function getMaskTemplate(baseOnInput, minimalPos, includeMode, noJit, clearOptionalTail) {
-            !0 !== noJit && (jitPos = undefined, jitOffset = 0);
             var greedy = opts.greedy;
             clearOptionalTail && (opts.greedy = !1), minimalPos = minimalPos || 0;
             var ndxIntlzr, test, testPos, maskTemplate = [], pos = 0, lvp = getLastValidPosition();
             do {
                 if (!0 === baseOnInput && getMaskSet().validPositions[pos]) test = (testPos = clearOptionalTail && !0 === getMaskSet().validPositions[pos].match.optionality && getMaskSet().validPositions[pos + 1] === undefined && (!0 === getMaskSet().validPositions[pos].generatedInput || getMaskSet().validPositions[pos].input == opts.skipOptionalPartCharacter && 0 < pos) ? determineTestTemplate(pos, getTests(pos, ndxIntlzr, pos - 1)) : getMaskSet().validPositions[pos]).match, 
-                ndxIntlzr = testPos.locator.slice(), maskTemplate.push(!0 === includeMode ? testPos.input : !1 === includeMode ? test.nativeDef : getPlaceholder(pos, test)), 
-                test.jit && test.optionalQuantifier !== undefined && (jitPos = pos, jitOffset = 0); else {
+                ndxIntlzr = testPos.locator.slice(), maskTemplate.push(!0 === includeMode ? testPos.input : !1 === includeMode ? test.nativeDef : getPlaceholder(pos, test)); else {
                     test = (testPos = getTestTemplate(pos, ndxIntlzr, pos - 1)).match, ndxIntlzr = testPos.locator.slice();
                     var jitMasking = !0 !== noJit && (!1 !== opts.jitMasking ? opts.jitMasking : test.jit);
-                    !1 === jitMasking || jitMasking === undefined || pos < lvp || "number" == typeof jitMasking && isFinite(jitMasking) && pos < jitMasking ? maskTemplate.push(!1 === includeMode ? test.nativeDef : getPlaceholder(pos, test)) : test.jit && test.optionalQuantifier !== undefined && (jitPos === undefined && (jitPos = pos), 
-                    jitOffset++);
+                    (!1 === jitMasking || jitMasking === undefined || pos < lvp || "number" == typeof jitMasking && isFinite(jitMasking) && pos < jitMasking) && maskTemplate.push(!1 === includeMode ? test.nativeDef : getPlaceholder(pos, test));
                 }
                 "auto" === opts.keepStatic && test.newBlockMarker && null !== test.fn && (opts.keepStatic = pos - 1), 
                 pos++;
@@ -144,7 +141,7 @@
             return valid;
         }
         function getTests(pos, ndxIntlzr, tstPs) {
-            var latestMatch, maskTokens = getMaskSet().maskToken, testPos = ndxIntlzr ? tstPs : 0, ndxInitializer = ndxIntlzr ? ndxIntlzr.slice() : [ 0 ], matches = [], insertStop = !1, cacheDependency = ndxIntlzr ? ndxIntlzr.join("") : "";
+            var latestMatch, maskTokens = getMaskSet().maskToken, testPos = ndxIntlzr ? tstPs : 0, ndxInitializer = ndxIntlzr ? ndxIntlzr.slice() : [ 0 ], matches = [], insertStop = !1, cacheDependency = ndxIntlzr ? ndxIntlzr.join("") : "", offset = 0;
             function resolveTestFromToken(maskToken, ndxInitializer, loopNdx, quantifierRecurse) {
                 function handleMatch(match, loopNdx, quantifierRecurse) {
                     function isFirstMatch(latestMatch, tokenGroup) {
@@ -260,13 +257,13 @@
                             var tokenGroup = maskToken.matches[$.inArray(qt, maskToken.matches) - 1];
                             if (match = handleMatch(tokenGroup, [ qndx ].concat(loopNdx), tokenGroup)) {
                                 if ((latestMatch = matches[matches.length - 1].match).optionalQuantifier = qndx > qt.quantifier.min - 1, 
-                                latestMatch.jit = qndx + tokenGroup.matches.indexOf(latestMatch) >= qt.quantifier.jit, 
-                                isFirstMatch(latestMatch, tokenGroup) && qndx > qt.quantifier.min - 1) {
+                                latestMatch.jit = (qndx || 1) * tokenGroup.matches.indexOf(latestMatch) >= qt.quantifier.jit, 
+                                isFirstMatch(latestMatch, tokenGroup) && latestMatch.optionalQuantifier) {
                                     insertStop = !0, testPos = pos;
                                     break;
                                 }
-                                if (qt.quantifier.jit !== undefined && isNaN(qt.quantifier.max) && latestMatch.optionalQuantifier && getMaskSet().validPositions[pos - 1] === undefined) {
-                                    matches.pop(), insertStop = !0, testPos = pos, cacheDependency = undefined;
+                                if (latestMatch.jit && !latestMatch.optionalQuantifier) {
+                                    offset = tokenGroup.matches.indexOf(latestMatch), testPos = pos, insertStop = !0;
                                     break;
                                 }
                                 return !0;
@@ -275,7 +272,7 @@
                     } else testPos++;
                     var source, target;
                 }
-                for (var tndx = 0 < ndxInitializer.length ? ndxInitializer.shift() : 0; tndx < maskToken.matches.length; tndx++) if (!0 !== maskToken.matches[tndx].isQuantifier) {
+                for (var tndx = 0 < ndxInitializer.length ? ndxInitializer.shift() : 0; tndx < maskToken.matches.length; tndx = tndx + 1 + offset) if (!(offset = 0) !== maskToken.matches[tndx].isQuantifier) {
                     var match = handleMatch(maskToken.matches[tndx], [ tndx ].concat(loopNdx), quantifierRecurse);
                     if (match && testPos === pos) return match;
                     if (pos < testPos) break;
@@ -308,7 +305,7 @@
                 mloc: {},
                 cd: cacheDependency
             }), ndxIntlzr !== undefined && getMaskSet().tests[pos] ? $.extend(!0, [], matches) : (getMaskSet().tests[pos] = $.extend(!0, [], matches), 
-            console.log(pos + " - " + JSON.stringify(matches)), getMaskSet().tests[pos]);
+            getMaskSet().tests[pos]);
         }
         function getBufferTemplate() {
             return getMaskSet()._buffer === undefined && (getMaskSet()._buffer = getMaskTemplate(!1, 1), 
@@ -382,9 +379,8 @@
             strict = !0 === strict;
             var maskPos = pos;
             function _isValid(position, c, strict) {
-                var rslt = !1, tstPos = position;
-                return jitPos !== undefined && jitPos <= tstPos && getMaskSet().validPositions[jitPos + jitOffset - 1] == undefined && (tstPos += jitOffset - 1), 
-                $.each(getTests(tstPos), function(ndx, tst) {
+                var rslt = !1;
+                return $.each(getTests(position), function(ndx, tst) {
                     var test = tst.match;
                     if (getBuffer(!0), !1 !== (rslt = null != test.fn ? test.fn.test(c, getMaskSet(), position, strict, opts, isSelection(pos)) : (c === test.def || c === opts.skipOptionalPartCharacter) && "" !== test.def && {
                         c: getPlaceholder(position, test, !0) || test.def,
@@ -442,7 +438,7 @@
                 (!strict || !0 === fromSetValid) && !1 === result && !0 !== validateOnly)) {
                     var currentPosValid = getMaskSet().validPositions[maskPos];
                     if (!currentPosValid || null !== currentPosValid.match.fn || currentPosValid.match.def !== c && c !== opts.skipOptionalPartCharacter) {
-                        if (opts.regex || (opts.insertMode || getMaskSet().validPositions[seekNext(maskPos)] === undefined) && !isMask(maskPos, !0)) for (var nPos = maskPos + 1, snPos = seekNext(maskPos); nPos <= snPos; nPos++) if (!1 !== (result = _isValid(nPos, c, strict))) {
+                        if ((opts.insertMode || getMaskSet().validPositions[seekNext(maskPos)] === undefined) && !isMask(maskPos, !0)) for (var nPos = maskPos + 1, snPos = seekNext(maskPos); nPos <= snPos; nPos++) if (!1 !== (result = _isValid(nPos, c, strict))) {
                             result = trackbackPositions(maskPos, result.pos !== undefined ? result.pos : nPos) || result, 
                             maskPos = nPos;
                             break;

+ 1 - 1
dist/inputmask/inputmask.numeric.extensions.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 1 - 1
dist/inputmask/inputmask.phone.extensions.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 1 - 1
dist/inputmask/jquery.inputmask.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 1 - 1
dist/inputmask/phone-codes/phone-be.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 1 - 1
dist/inputmask/phone-codes/phone-ca.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 1 - 1
dist/inputmask/phone-codes/phone-hu.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 1 - 1
dist/inputmask/phone-codes/phone-it.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 1 - 1
dist/inputmask/phone-codes/phone-mx.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 1 - 1
dist/inputmask/phone-codes/phone-nl.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 1 - 1
dist/inputmask/phone-codes/phone-ru.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 1 - 1
dist/inputmask/phone-codes/phone.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(factory) {

+ 14 - 18
dist/jquery.inputmask.bundle.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(modules) {
@@ -326,20 +326,17 @@
         }
         function maskScope(actionObj, maskset, opts) {
             maskset = maskset || this.maskset, opts = opts || this.opts;
-            var undoValue, $el, maxLength, colorMask, jitPos, inputmask = this, el = this.el, isRTL = this.isRTL, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, mouseEnter = !1, jitOffset = 0, originalPlaceholder = "";
+            var undoValue, $el, maxLength, colorMask, inputmask = this, el = this.el, isRTL = this.isRTL, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, mouseEnter = !1, originalPlaceholder = "";
             function getMaskTemplate(baseOnInput, minimalPos, includeMode, noJit, clearOptionalTail) {
-                !0 !== noJit && (jitPos = undefined, jitOffset = 0);
                 var greedy = opts.greedy;
                 clearOptionalTail && (opts.greedy = !1), minimalPos = minimalPos || 0;
                 var ndxIntlzr, test, testPos, maskTemplate = [], pos = 0, lvp = getLastValidPosition();
                 do {
                     if (!0 === baseOnInput && getMaskSet().validPositions[pos]) testPos = clearOptionalTail && !0 === getMaskSet().validPositions[pos].match.optionality && getMaskSet().validPositions[pos + 1] === undefined && (!0 === getMaskSet().validPositions[pos].generatedInput || getMaskSet().validPositions[pos].input == opts.skipOptionalPartCharacter && 0 < pos) ? determineTestTemplate(pos, getTests(pos, ndxIntlzr, pos - 1)) : getMaskSet().validPositions[pos], 
-                    test = testPos.match, ndxIntlzr = testPos.locator.slice(), maskTemplate.push(!0 === includeMode ? testPos.input : !1 === includeMode ? test.nativeDef : getPlaceholder(pos, test)), 
-                    test.jit && test.optionalQuantifier !== undefined && (jitPos = pos, jitOffset = 0); else {
+                    test = testPos.match, ndxIntlzr = testPos.locator.slice(), maskTemplate.push(!0 === includeMode ? testPos.input : !1 === includeMode ? test.nativeDef : getPlaceholder(pos, test)); else {
                         testPos = getTestTemplate(pos, ndxIntlzr, pos - 1), test = testPos.match, ndxIntlzr = testPos.locator.slice();
                         var jitMasking = !0 !== noJit && (!1 !== opts.jitMasking ? opts.jitMasking : test.jit);
-                        !1 === jitMasking || jitMasking === undefined || pos < lvp || "number" == typeof jitMasking && isFinite(jitMasking) && pos < jitMasking ? maskTemplate.push(!1 === includeMode ? test.nativeDef : getPlaceholder(pos, test)) : test.jit && test.optionalQuantifier !== undefined && (jitPos === undefined && (jitPos = pos), 
-                        jitOffset++);
+                        (!1 === jitMasking || jitMasking === undefined || pos < lvp || "number" == typeof jitMasking && isFinite(jitMasking) && pos < jitMasking) && maskTemplate.push(!1 === includeMode ? test.nativeDef : getPlaceholder(pos, test));
                     }
                     "auto" === opts.keepStatic && test.newBlockMarker && null !== test.fn && (opts.keepStatic = pos - 1), 
                     pos++;
@@ -397,7 +394,7 @@
                 return valid;
             }
             function getTests(pos, ndxIntlzr, tstPs) {
-                var latestMatch, maskTokens = getMaskSet().maskToken, testPos = ndxIntlzr ? tstPs : 0, ndxInitializer = ndxIntlzr ? ndxIntlzr.slice() : [ 0 ], matches = [], insertStop = !1, cacheDependency = ndxIntlzr ? ndxIntlzr.join("") : "";
+                var latestMatch, maskTokens = getMaskSet().maskToken, testPos = ndxIntlzr ? tstPs : 0, ndxInitializer = ndxIntlzr ? ndxIntlzr.slice() : [ 0 ], matches = [], insertStop = !1, cacheDependency = ndxIntlzr ? ndxIntlzr.join("") : "", offset = 0;
                 function resolveTestFromToken(maskToken, ndxInitializer, loopNdx, quantifierRecurse) {
                     function handleMatch(match, loopNdx, quantifierRecurse) {
                         function isFirstMatch(latestMatch, tokenGroup) {
@@ -514,13 +511,13 @@
                                 var tokenGroup = maskToken.matches[$.inArray(qt, maskToken.matches) - 1];
                                 if (match = handleMatch(tokenGroup, [ qndx ].concat(loopNdx), tokenGroup)) {
                                     if ((latestMatch = matches[matches.length - 1].match).optionalQuantifier = qndx > qt.quantifier.min - 1, 
-                                    latestMatch.jit = qndx + tokenGroup.matches.indexOf(latestMatch) >= qt.quantifier.jit, 
-                                    isFirstMatch(latestMatch, tokenGroup) && qndx > qt.quantifier.min - 1) {
+                                    latestMatch.jit = (qndx || 1) * tokenGroup.matches.indexOf(latestMatch) >= qt.quantifier.jit, 
+                                    isFirstMatch(latestMatch, tokenGroup) && latestMatch.optionalQuantifier) {
                                         insertStop = !0, testPos = pos;
                                         break;
                                     }
-                                    if (qt.quantifier.jit !== undefined && isNaN(qt.quantifier.max) && latestMatch.optionalQuantifier && getMaskSet().validPositions[pos - 1] === undefined) {
-                                        matches.pop(), insertStop = !0, testPos = pos, cacheDependency = undefined;
+                                    if (latestMatch.jit && !latestMatch.optionalQuantifier) {
+                                        offset = tokenGroup.matches.indexOf(latestMatch), testPos = pos, insertStop = !0;
                                         break;
                                     }
                                     return !0;
@@ -529,7 +526,7 @@
                         } else testPos++;
                         var source, target, sloc, tloc;
                     }
-                    for (var tndx = 0 < ndxInitializer.length ? ndxInitializer.shift() : 0; tndx < maskToken.matches.length; tndx++) if (!0 !== maskToken.matches[tndx].isQuantifier) {
+                    for (var tndx = 0 < ndxInitializer.length ? ndxInitializer.shift() : 0; tndx < maskToken.matches.length; tndx = tndx + 1 + offset) if (!(offset = 0) !== maskToken.matches[tndx].isQuantifier) {
                         var match = handleMatch(maskToken.matches[tndx], [ tndx ].concat(loopNdx), quantifierRecurse);
                         if (match && testPos === pos) return match;
                         if (pos < testPos) break;
@@ -563,7 +560,7 @@
                     mloc: {},
                     cd: cacheDependency
                 }), ndxIntlzr !== undefined && getMaskSet().tests[pos] ? $.extend(!0, [], matches) : (getMaskSet().tests[pos] = $.extend(!0, [], matches), 
-                console.log(pos + " - " + JSON.stringify(matches)), getMaskSet().tests[pos]);
+                getMaskSet().tests[pos]);
             }
             function getBufferTemplate() {
                 return getMaskSet()._buffer === undefined && (getMaskSet()._buffer = getMaskTemplate(!1, 1), 
@@ -638,9 +635,8 @@
                 strict = !0 === strict;
                 var maskPos = pos;
                 function _isValid(position, c, strict) {
-                    var rslt = !1, tstPos = position;
-                    return jitPos !== undefined && jitPos <= tstPos && getMaskSet().validPositions[jitPos + jitOffset - 1] == undefined && (tstPos += jitOffset - 1), 
-                    $.each(getTests(tstPos), function(ndx, tst) {
+                    var rslt = !1;
+                    return $.each(getTests(position), function(ndx, tst) {
                         var test = tst.match;
                         if (getBuffer(!0), !1 !== (rslt = null != test.fn ? test.fn.test(c, getMaskSet(), position, strict, opts, isSelection(pos)) : (c === test.def || c === opts.skipOptionalPartCharacter) && "" !== test.def && {
                             c: getPlaceholder(position, test, !0) || test.def,
@@ -698,7 +694,7 @@
                     (!strict || !0 === fromSetValid) && !1 === result && !0 !== validateOnly)) {
                         var currentPosValid = getMaskSet().validPositions[maskPos];
                         if (!currentPosValid || null !== currentPosValid.match.fn || currentPosValid.match.def !== c && c !== opts.skipOptionalPartCharacter) {
-                            if (opts.regex || (opts.insertMode || getMaskSet().validPositions[seekNext(maskPos)] === undefined) && !isMask(maskPos, !0)) for (var nPos = maskPos + 1, snPos = seekNext(maskPos); nPos <= snPos; nPos++) if (!1 !== (result = _isValid(nPos, c, strict))) {
+                            if ((opts.insertMode || getMaskSet().validPositions[seekNext(maskPos)] === undefined) && !isMask(maskPos, !0)) for (var nPos = maskPos + 1, snPos = seekNext(maskPos); nPos <= snPos; nPos++) if (!1 !== (result = _isValid(nPos, c, strict))) {
                                 result = trackbackPositions(maskPos, result.pos !== undefined ? result.pos : nPos) || result, 
                                 maskPos = nPos;
                                 break;

File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/bindings/inputmask.binding.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.jqlite.min.js


+ 1 - 1
dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.jquery.min.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 !function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof exports?module.exports=e(require("jquery")):window.dependencyLib=e(jQuery)}(function(e){return e});

File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.min.js


+ 1 - 1
dist/min/inputmask/global/document.min.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 "function"==typeof define&&define.amd?define(function(){return document}):"object"==typeof exports&&(module.exports=document);

+ 1 - 1
dist/min/inputmask/global/window.min.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/Inputmask
 * Copyright (c) 2010 - 2018 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 4.0.1-beta.25
+* Version: 4.0.1-beta.29
 */
 
 "function"==typeof define&&define.amd?define(function(){return window}):"object"==typeof exports&&(module.exports=window);

File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/inputmask.date.extensions.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/inputmask.extensions.min.js


File diff suppressed because it is too large
+ 2 - 2
dist/min/inputmask/inputmask.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/inputmask.numeric.extensions.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/inputmask.phone.extensions.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/jquery.inputmask.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/phone-codes/phone-be.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/phone-codes/phone-ca.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/phone-codes/phone-hu.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/phone-codes/phone-it.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/phone-codes/phone-mx.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/phone-codes/phone-nl.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/phone-codes/phone-ru.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/phone-codes/phone.min.js


File diff suppressed because it is too large
+ 2 - 2
dist/min/jquery.inputmask.bundle.min.js


+ 13 - 32
js/inputmask.js

@@ -827,19 +827,12 @@
                 maxLength,
                 mouseEnter = false,
                 colorMask,
-                jitPos,
-                jitOffset = 0,
                 originalPlaceholder = "";
 
             //maskset helperfunctions
             function getMaskTemplate(baseOnInput, minimalPos, includeMode, noJit, clearOptionalTail) {
                 //includeMode true => input, undefined => placeholder, false => mask
 
-                if (noJit !== true) {
-                    jitPos = undefined;
-                    jitOffset = 0;
-                }
-
                 var greedy = opts.greedy;
                 if (clearOptionalTail) opts.greedy = false;
                 minimalPos = minimalPos || 0;
@@ -856,10 +849,6 @@
                         test = testPos.match;
                         ndxIntlzr = testPos.locator.slice();
                         maskTemplate.push(includeMode === true ? testPos.input : includeMode === false ? test.nativeDef : getPlaceholder(pos, test));
-                        if (test.jit && test.optionalQuantifier !== undefined) {
-                            jitPos = pos;
-                            jitOffset = 0;
-                        }
                     } else {
                         testPos = getTestTemplate(pos, ndxIntlzr, pos - 1);
                         test = testPos.match;
@@ -867,9 +856,6 @@
                         var jitMasking = noJit === true ? false : (opts.jitMasking !== false ? opts.jitMasking : test.jit);
                         if (jitMasking === false || jitMasking === undefined || pos < lvp || (typeof jitMasking === "number" && isFinite(jitMasking) && jitMasking > pos)) {
                             maskTemplate.push(includeMode === false ? test.nativeDef : getPlaceholder(pos, test));
-                        } else if (test.jit && test.optionalQuantifier !== undefined) {
-                            if (jitPos === undefined) jitPos = pos;
-                            jitOffset++;
                         }
                     }
                     if (opts.keepStatic === "auto") {
@@ -985,7 +971,8 @@
                     matches = [],
                     insertStop = false,
                     latestMatch,
-                    cacheDependency = ndxIntlzr ? ndxIntlzr.join("") : "";
+                    cacheDependency = ndxIntlzr ? ndxIntlzr.join("") : "",
+                    offset = 0;
 
                 function resolveTestFromToken(maskToken, ndxInitializer, loopNdx, quantifierRecurse) { //ndxInitializer contains a set of indexes to speedup searches in the mtokens
                     function handleMatch(match, loopNdx, quantifierRecurse) {
@@ -1217,17 +1204,16 @@
                                         //TODO FIX RECURSIVE QUANTIFIERS
                                         latestMatch.optionalQuantifier = qndx > (qt.quantifier.min - 1);
                                         // console.log(pos + " " + qt.quantifier.min + " " + latestMatch.optionalQuantifier);
-                                        latestMatch.jit = qndx + tokenGroup.matches.indexOf(latestMatch) >= qt.quantifier.jit;
-                                        if (isFirstMatch(latestMatch, tokenGroup) && qndx > (qt.quantifier.min - 1)) {
+                                        latestMatch.jit = (qndx || 1) * tokenGroup.matches.indexOf(latestMatch) >= qt.quantifier.jit;
+                                        if (isFirstMatch(latestMatch, tokenGroup) && latestMatch.optionalQuantifier) {
                                             insertStop = true;
                                             testPos = pos; //match the position after the group
                                             break; //stop quantifierloop && search for next possible match
                                         }
-                                        if (qt.quantifier.jit !== undefined && isNaN(qt.quantifier.max) && latestMatch.optionalQuantifier && getMaskSet().validPositions[pos - 1] === undefined) {
-                                            matches.pop()
-                                            insertStop = true;
+                                        if (latestMatch.jit && !latestMatch.optionalQuantifier) {
+                                            offset = tokenGroup.matches.indexOf(latestMatch);
                                             testPos = pos; //match the position after the group
-                                            cacheDependency = undefined; //enforce revalidation when requested
+                                            insertStop = true;
                                             break; //stop quantifierloop && search for next possible match
                                         }
                                         return true;
@@ -1242,7 +1228,9 @@
                         }
                     }
 
-                    for (var tndx = (ndxInitializer.length > 0 ? ndxInitializer.shift() : 0); tndx < maskToken.matches.length; tndx++) {
+                    //the offset is set in the quantifierloop when git masking is used
+                    for (var tndx = (ndxInitializer.length > 0 ? ndxInitializer.shift() : 0); tndx < maskToken.matches.length; tndx = tndx + 1 + offset) {
+                        offset = 0; //reset offset
                         if (maskToken.matches[tndx].isQuantifier !== true) {
                             var match = handleMatch(maskToken.matches[tndx], [tndx].concat(loopNdx), quantifierRecurse);
                             if (match && testPos === pos) {
@@ -1322,7 +1310,7 @@
                     return $.extend(true, [], matches);
                 }
                 getMaskSet().tests[pos] = $.extend(true, [], matches); //set a clone to prevent overwriting some props
-                console.log(pos + " - " + JSON.stringify(matches));
+                // console.log(pos + " - " + JSON.stringify(matches));
                 return getMaskSet().tests[pos];
             }
 
@@ -1527,14 +1515,7 @@
                 function _isValid(position, c, strict) {
                     var rslt = false;
 
-                    //reposition with jitoffset
-                    var tstPos = position;
-                    // console.log("pos " + tstPos + " jitpos " + jitPos + " offset " + jitOffset);
-                    if (jitPos !== undefined && tstPos >= jitPos && getMaskSet().validPositions[jitPos + jitOffset - 1] == undefined)
-                        tstPos += jitOffset - 1;
-                    // console.log("validated pos " + tstPos);
-
-                    $.each(getTests(tstPos), function (ndx, tst) {
+                    $.each(getTests(position), function (ndx, tst) {
                         var test = tst.match;
                         //make sure the buffer is set and correct
                         getBuffer(true);
@@ -1606,7 +1587,7 @@
                                 result = {
                                     "caret": seekNext(maskPos)
                                 };
-                            } else if (opts.regex || ((opts.insertMode || getMaskSet().validPositions[seekNext(maskPos)] === undefined) && !isMask(maskPos, true))) { //does the input match on a further position?
+                            } else if ((opts.insertMode || getMaskSet().validPositions[seekNext(maskPos)] === undefined) && !isMask(maskPos, true)) { //does the input match on a further position?
                                 for (var nPos = maskPos + 1, snPos = seekNext(maskPos); nPos <= snPos; nPos++) {
                                     // if (!isMask(nPos, true)) {
                                     // 	continue;

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "inputmask",
-  "version": "4.0.1-beta.25",
+  "version": "4.0.1-beta.29",
   "description": "Inputmask is a javascript library which creates an input mask.  Inputmask can run against vanilla javascript, jQuery and jqlite.",
   "main": "index.js",
   "files": [

+ 1 - 1
qunit/qunit.html

@@ -8,6 +8,6 @@
   <div id="qunit"></div>
   <div id="qunit-fixture"></div>²
   <script src="../node_modules/qunitjs/qunit/qunit.js"></script>
-  <script src="qunit.js"></script>
+  <script src="qunit.js" charset="utf-8"></script>
 </body>
 </html>

+ 401 - 388
qunit/tests_dynamic.js

@@ -1,403 +1,382 @@
 export default function (qunit, $, Inputmask) {
 
-	qunit.module("Dynamic Masks");
-	qunit.test("inputmask(\"9-a{3}9{3}\" - simple dynamic mask", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("9-a{3}9{3}").mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("1abc123");
-
-		assert.equal(testmask.value, "1-abc123", "Result " + testmask.value);
-
-
-	});
-	qunit.test("inputmask(\"9-a{1,3}9{1,3}\" - simple dynamic mask", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("9-a{1,3}9{1,3}").mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("1a1");
-
-		assert.equal(testmask.value, "1-a1", "Result " + testmask.value);
-
-
-	});
-	qunit.test("inputmask(\"9-a{1,3}9{1,3}\" - simple dynamic mask - greedy false", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("9-a{1,3}9{1,3}", {
-			greedy: false
-		}).mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("1a1");
-
-		assert.equal(testmask.value, "1-a1", "Result " + testmask.value);
-
-
-	});
-	qunit.test("inputmask(\"9-a{1,3}/9{2,3}\" - simple dynamic mask - greedy true", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("9-a{1,3}/9{2,3}", {
-			greedy: true
-		}).mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("1a/123");
-
-		assert.equal(testmask.value, "1-a/123", "Result " + testmask.value);
-
-
-	});
-	qunit.test("email mask greedy false", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("email", {
-			greedy: false
-		}).mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("some.body@mail.com");
-		testmask.blur();
-		assert.equal(testmask.value, "some.body@mail.com", "Result " + testmask.value);
-
-
-	});
-	qunit.test("email mask greedy true", function (assert) {
-		var done = assert.async(),
-			$fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("email", {
-			greedy: true
-		}).mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("some.body@mail.com");
-		testmask.blur();
-		setTimeout(function () {
-			assert.equal(testmask.value, "some.body@mail.com", "Result " + testmask.value);
-			done();
-		}, 0);
-	});
+    qunit.module("Dynamic Masks");
+    qunit.test("inputmask(\"9-a{3}9{3}\" - simple dynamic mask", function (assert) {
+        var $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("9-a{3}9{3}").mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("1abc123");
+
+        assert.equal(testmask.value, "1-abc123", "Result " + testmask.value);
+
+
+    });
+    qunit.test("inputmask(\"9-a{1,3}9{1,3}\" - simple dynamic mask", function (assert) {
+        var $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("9-a{1,3}9{1,3}").mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("1a1");
+
+        assert.equal(testmask.value, "1-a1", "Result " + testmask.value);
+
+
+    });
+    qunit.test("inputmask(\"9-a{1,3}9{1,3}\" - simple dynamic mask - greedy false", function (assert) {
+        var $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("9-a{1,3}9{1,3}", {
+            greedy: false
+        }).mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("1a1");
 
-	qunit.test("email mask - partial input", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("email").mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("some.");
-		testmask.blur();
-		assert.equal(testmask.value, "some.@_._", "Result " + testmask.value);
-	});
-
-	qunit.test("email mask - partial input 2", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("email").mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("some@mail.com");
-		$.caret(testmask, 4);
-		$("#testmask").Type(".body");
-		assert.equal(testmask.value, "some.body@mail.com", "Result " + testmask.value);
-
-
-	});
-
-	qunit.test("email mask - babu@us.lufthansa.com - babupca", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("email").mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("babu@us.lufthansa.com");
-		assert.equal(testmask.value, "babu@us.lufthansa.com", "Result " + testmask.value);
-
-
-	});
-
-	qunit.test("email mask - email@subdomain.domain.com - babupca", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("email").mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("email@subdomain.domain.com");
-		assert.equal(testmask.value, "email@subdomain.domain.com", "Result " + testmask.value);
-
-
-	});
-
-	qunit.test("email mask - paste test.test@test.com - Kurumas", function (assert) {
-		var done = assert.async(),
-			$fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("email").mask(testmask);
-
-		testmask.focus();
-		$("#testmask").paste("test.test@test.com");
-		setTimeout(function () {
-			assert.equal(testmask.value, "test.test@test.com", "Result " + testmask.value);
-			done();
-
-		}, 0);
-	});
-
-	qunit.test("quantifier mask greedy false - FairSite2C", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("9{0,4}", {
-			greedy: false
-		}).mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("123");
-		assert.equal(testmask.value, "123", "Result " + testmask.value);
-
-
-	});
-
-	qunit.test("quantifier mask greedy true - FairSite2C", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("9{0,4}", {
-			greedy: true
-		}).mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("123");
-		assert.equal(testmask.value, "123", "Result " + testmask.value);
-
-
-	});
-
-
-	qunit.test("email mask - clearIncomplete - hiddenman", function (assert) {
-		var done = assert.async(),
-			$fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("email", {
-			clearIncomplete: true
-		}).mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("akornilov");
-		testmask.blur();
-		setTimeout(function () {
-			assert.equal(document.getElementById("testmask").inputmask._valueGet(), "", "Result " + document.getElementById("testmask").inputmask._valueGet());
-			done();
-
-		}, 0);
-	});
-
-	qunit.test("email mask - clearIncomplete - hiddenman", function (assert) {
-		var done = assert.async(),
-			$fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("email", {
-			clearIncomplete: true
-		}).mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("akornilov@");
-		testmask.blur();
-		setTimeout(function () {
-			assert.equal(document.getElementById("testmask").inputmask._valueGet(), "", "Result " + document.getElementById("testmask").inputmask._valueGet());
-			done();
-
-		}, 0);
-	});
-
-	qunit.test("email mask - clearIncomplete - hiddenman", function (assert) {
-		var done = assert.async(),
-			$fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("email", {
-			clearIncomplete: true
-		}).mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("akornilov@gmail.com");
-		testmask.blur();
-		setTimeout(function () {
-			assert.equal(document.getElementById("testmask").inputmask._valueGet(), "akornilov@gmail.com", "Result " + document.getElementById("testmask").inputmask._valueGet());
-			done();
-
-		}, 0);
-	});
-
-	qunit.test("mask: '\\\\a{*}', repeat: 5 - voidmain02", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask({
-			mask: '\\\\a{*}',
-			repeat: 5
-		}).mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("abcd abcd abcd abcd abcd");
-		assert.equal(document.getElementById("testmask").inputmask._valueGet(), "\\abcd\\abcd\\abcd\\abcd\\abcd", "Result " + document.getElementById("testmask").inputmask._valueGet());
-
-	});
-
-	qunit.test("[a{1,3}-]9999 - type abc1234 => delete c - ivodopyanov", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("[a{1,3}-]9999").mask(testmask);
-
-		$("#testmask").Type("abc1234");
-		$.caret(testmask, 2);
-		$("#testmask").SendKey(Inputmask.keyCode.DELETE);
-		assert.equal(document.getElementById("testmask").inputmask._valueGet(), "ab-1234", "Result " + document.getElementById("testmask").inputmask._valueGet());
-	});
-
-	qunit.test("email mask - mouseclick to domain part - hiddenman", function (assert) {
-		var done = assert.async(),
-			$fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("email").mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("akornilov");
-
-		//fake click in position
-		$.caret(testmask, 10);
-		$("#testmask").trigger("click");
-
-		$("#testmask").Type("gmail.com");
-		setTimeout(function () {
-			assert.equal(document.getElementById("testmask").inputmask._valueGet(), "akornilov@gmail.com", "Result " + document.getElementById("testmask").inputmask._valueGet());
-			done();
-		}, 0);
-	});
-	qunit.test("I{1,3}-ZZ - rgafaric", function (assert) {
-		var done = assert.async(),
-			$fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" value="VAA" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask({
-			"mask": "I{1,3}-ZZ",
-			definitions: {
-				'Z': {
-					"validator": "[A-Za-z]",
-					cardinality: 1
-				},
-				'I': {
-					"validator": "[ivxlcdmIVXLCDM]",
-					cardinality: 1
-				}
-			}
-		}).mask(testmask);
-		testmask.blur();
-		setTimeout(function () {
-			assert.equal(document.getElementById("testmask").inputmask._valueGet(), "V-AA", "Result " + document.getElementById("testmask").inputmask._valueGet());
-			done();
-		}, 0);
-	});
-
-	qunit.test("email mask - some.body@mail.com - delete before @", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("email").mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("some.body@mail.com");
-		$.caret(testmask, 9);
-		$("#testmask").SendKey(Inputmask.keyCode.DELETE);
-		assert.equal(testmask.value, "some.body@ail.com", "Result " + testmask.value);
-	});
-
-	qunit.test("email mask -123@mail.com - 123 => info", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("email").mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("123@mail.com");
-		$.caret(testmask, 0, 3);
-		$("#testmask").Type("info");
-		assert.equal(testmask.value, "info@mail.com", "Result " + testmask.value);
-	});
-
-	qunit.test("(aa)|(a.a.)|(aaa)|(aa.a.)|(a.aa.) - incomplete - danielpiterak", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("(aa)|(a.a.)|(aaa)|(aa.a.)|(a.aa.)", {
-			clearMaskOnLostFocus: true,
-			showMaskOnHover: false,
-			placeholder: " ",
-			casing: "upper"
-		}).mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("p.p");
-		testmask.blur();
-		assert.equal(testmask.value, "P.P.", "Result " + testmask.value);
-	});
-
-	qunit.test("(aa)|(a.a.)|(aaa)|(aa.a.)|(a.aa.) - complete - danielpiterak", function (assert) {
-		var $fixture = $("#qunit-fixture");
-		$fixture.append('<input type="text" id="testmask" />');
-		var testmask = document.getElementById("testmask");
-		Inputmask("(aa)|(a.a.)|(aaa)|(aa.a.)|(a.aa.)", {
-			clearMaskOnLostFocus: true,
-			showMaskOnHover: false,
-			placeholder: " ",
-			casing: "upper"
-		}).mask(testmask);
-
-		testmask.focus();
-		$("#testmask").Type("p.p.");
-		testmask.blur();
-		assert.equal(testmask.value, "P.P.", "Result " + testmask.value);
-	});
-
-    qunit.test("(.999){+|1},00 - Loop trigger in setValidPosition", function (assert) {
+        assert.equal(testmask.value, "1-a1", "Result " + testmask.value);
+
+
+    });
+    qunit.test("inputmask(\"9-a{1,3}/9{2,3}\" - simple dynamic mask - greedy true", function (assert) {
+        var $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("9-a{1,3}/9{2,3}", {
+            greedy: true
+        }).mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("1a/123");
+
+        assert.equal(testmask.value, "1-a/123", "Result " + testmask.value);
+
+
+    });
+    qunit.test("email mask greedy false", function (assert) {
         var $fixture = $("#qunit-fixture");
         $fixture.append('<input type="text" id="testmask" />');
         var testmask = document.getElementById("testmask");
-        Inputmask("(.999){+|1},00", {
-            radixPoint: ",",
-            numericInput: true,
-            placeholder: "0",
+        Inputmask("email", {
+            greedy: false
+        }).mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("some.body@mail.com");
+        testmask.blur();
+        assert.equal(testmask.value, "some.body@mail.com", "Result " + testmask.value);
+
+
+    });
+    qunit.test("email mask greedy true", function (assert) {
+        var done = assert.async(),
+            $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("email", {
+            greedy: true
+        }).mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("some.body@mail.com");
+        testmask.blur();
+        setTimeout(function () {
+            assert.equal(testmask.value, "some.body@mail.com", "Result " + testmask.value);
+            done();
+        }, 0);
+    });
+
+    qunit.test("email mask - partial input", function (assert) {
+        var $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("email").mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("some.");
+        testmask.blur();
+        assert.equal(testmask.value, "some.@_._", "Result " + testmask.value);
+    });
+
+    qunit.test("email mask - partial input 2", function (assert) {
+        var $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("email").mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("some@mail.com");
+        $.caret(testmask, 4);
+        $("#testmask").Type(".body");
+        assert.equal(testmask.value, "some.body@mail.com", "Result " + testmask.value);
+
+
+    });
+
+    qunit.test("email mask - babu@us.lufthansa.com - babupca", function (assert) {
+        var $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("email").mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("babu@us.lufthansa.com");
+        assert.equal(testmask.value, "babu@us.lufthansa.com", "Result " + testmask.value);
+
+
+    });
+
+    qunit.test("email mask - email@subdomain.domain.com - babupca", function (assert) {
+        var $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("email").mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("email@subdomain.domain.com");
+        assert.equal(testmask.value, "email@subdomain.domain.com", "Result " + testmask.value);
+
+
+    });
+
+    qunit.test("email mask - paste test.test@test.com - Kurumas", function (assert) {
+        var done = assert.async(),
+            $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("email").mask(testmask);
+
+        testmask.focus();
+        $("#testmask").paste("test.test@test.com");
+        setTimeout(function () {
+            assert.equal(testmask.value, "test.test@test.com", "Result " + testmask.value);
+            done();
+
+        }, 0);
+    });
+
+    qunit.test("quantifier mask greedy false - FairSite2C", function (assert) {
+        var $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("9{0,4}", {
+            greedy: false
+        }).mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("123");
+        assert.equal(testmask.value, "123", "Result " + testmask.value);
+
+
+    });
+
+    qunit.test("quantifier mask greedy true - FairSite2C", function (assert) {
+        var $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("9{0,4}", {
+            greedy: true
+        }).mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("123");
+        assert.equal(testmask.value, "123", "Result " + testmask.value);
+
+
+    });
+
+
+    qunit.test("email mask - clearIncomplete - hiddenman", function (assert) {
+        var done = assert.async(),
+            $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("email", {
+            clearIncomplete: true
+        }).mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("akornilov");
+        testmask.blur();
+        setTimeout(function () {
+            assert.equal(document.getElementById("testmask").inputmask._valueGet(), "", "Result " + document.getElementById("testmask").inputmask._valueGet());
+            done();
+
+        }, 0);
+    });
+
+    qunit.test("email mask - clearIncomplete - hiddenman", function (assert) {
+        var done = assert.async(),
+            $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("email", {
+            clearIncomplete: true
+        }).mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("akornilov@");
+        testmask.blur();
+        setTimeout(function () {
+            assert.equal(document.getElementById("testmask").inputmask._valueGet(), "", "Result " + document.getElementById("testmask").inputmask._valueGet());
+            done();
+
+        }, 0);
+    });
+
+    qunit.test("email mask - clearIncomplete - hiddenman", function (assert) {
+        var done = assert.async(),
+            $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("email", {
+            clearIncomplete: true
+        }).mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("akornilov@gmail.com");
+        testmask.blur();
+        setTimeout(function () {
+            assert.equal(document.getElementById("testmask").inputmask._valueGet(), "akornilov@gmail.com", "Result " + document.getElementById("testmask").inputmask._valueGet());
+            done();
+
+        }, 0);
+    });
+
+    qunit.test("mask: '\\\\a{*}', repeat: 5 - voidmain02", function (assert) {
+        var $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask({
+            mask: '\\\\a{*}',
+            repeat: 5
+        }).mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("abcd abcd abcd abcd abcd");
+        assert.equal(document.getElementById("testmask").inputmask._valueGet(), "\\abcd\\abcd\\abcd\\abcd\\abcd", "Result " + document.getElementById("testmask").inputmask._valueGet());
+
+    });
+
+    qunit.test("[a{1,3}-]9999 - type abc1234 => delete c - ivodopyanov", function (assert) {
+        var $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("[a{1,3}-]9999").mask(testmask);
+
+        $("#testmask").Type("abc1234");
+        $.caret(testmask, 2);
+        $("#testmask").SendKey(Inputmask.keyCode.DELETE);
+        assert.equal(document.getElementById("testmask").inputmask._valueGet(), "ab-1234", "Result " + document.getElementById("testmask").inputmask._valueGet());
+    });
+
+    qunit.test("email mask - mouseclick to domain part - hiddenman", function (assert) {
+        var done = assert.async(),
+            $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("email").mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("akornilov");
+
+        //fake click in position
+        $.caret(testmask, 10);
+        $("#testmask").trigger("click");
+
+        $("#testmask").Type("gmail.com");
+        setTimeout(function () {
+            assert.equal(document.getElementById("testmask").inputmask._valueGet(), "akornilov@gmail.com", "Result " + document.getElementById("testmask").inputmask._valueGet());
+            done();
+        }, 0);
+    });
+    qunit.test("I{1,3}-ZZ - rgafaric", function (assert) {
+        var done = assert.async(),
+            $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" value="VAA" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask({
+            "mask": "I{1,3}-ZZ",
             definitions: {
-                "0": {
-                    validator: "[0-9\uFF11-\uFF19]"
+                'Z': {
+                    "validator": "[A-Za-z]",
+                    cardinality: 1
+                },
+                'I': {
+                    "validator": "[ivxlcdmIVXLCDM]",
+                    cardinality: 1
                 }
             }
         }).mask(testmask);
+        testmask.blur();
+        setTimeout(function () {
+            assert.equal(document.getElementById("testmask").inputmask._valueGet(), "V-AA", "Result " + document.getElementById("testmask").inputmask._valueGet());
+            done();
+        }, 0);
+    });
+
+    qunit.test("email mask - some.body@mail.com - delete before @", function (assert) {
+        var $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("email").mask(testmask);
 
         testmask.focus();
-        $("#testmask").trigger("click");
-        $("#testmask").Type("123333333333333333333333");
-        assert.equal(testmask.value, "0,12", "Result " + testmask.value);
+        $("#testmask").Type("some.body@mail.com");
+        $.caret(testmask, 9);
+        $("#testmask").SendKey(Inputmask.keyCode.DELETE);
+        assert.equal(testmask.value, "some.body@ail.com", "Result " + testmask.value);
+    });
+
+    qunit.test("email mask -123@mail.com - 123 => info", function (assert) {
+        var $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("email").mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("123@mail.com");
+        $.caret(testmask, 0, 3);
+        $("#testmask").Type("info");
+        assert.equal(testmask.value, "info@mail.com", "Result " + testmask.value);
+    });
+
+    qunit.test("(aa)|(a.a.)|(aaa)|(aa.a.)|(a.aa.) - incomplete - danielpiterak", function (assert) {
+        var $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("(aa)|(a.a.)|(aaa)|(aa.a.)|(a.aa.)", {
+            clearMaskOnLostFocus: true,
+            showMaskOnHover: false,
+            placeholder: " ",
+            casing: "upper"
+        }).mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("p.p");
+        testmask.blur();
+        assert.equal(testmask.value, "P.P.", "Result " + testmask.value);
+    });
+
+    qunit.test("(aa)|(a.a.)|(aaa)|(aa.a.)|(a.aa.) - complete - danielpiterak", function (assert) {
+        var $fixture = $("#qunit-fixture");
+        $fixture.append('<input type="text" id="testmask" />');
+        var testmask = document.getElementById("testmask");
+        Inputmask("(aa)|(a.a.)|(aaa)|(aa.a.)|(a.aa.)", {
+            clearMaskOnLostFocus: true,
+            showMaskOnHover: false,
+            placeholder: " ",
+            casing: "upper"
+        }).mask(testmask);
+
+        testmask.focus();
+        $("#testmask").Type("p.p.");
+        testmask.blur();
+        assert.equal(testmask.value, "P.P.", "Result " + testmask.value);
     });
 
     qunit.test("(99){+|1}a - dynamic jit offset", function (assert) {
@@ -412,4 +391,38 @@ export default function (qunit, $, Inputmask) {
         assert.equal(testmask.value, "1a", "Result " + testmask.value);
     });
 
+    // qunit.test("(.999){+|1},00 - Loop trigger in revalidateMask", function (assert) {
+    //     var $fixture = $("#qunit-fixture");
+    //     $fixture.append('<input type="text" id="testmask" />');
+    //     var testmask = document.getElementById("testmask");
+    //     Inputmask("(.999){+|1},00", {
+    //         radixPoint: ",",
+    //         numericInput: true,
+    //         placeholder: "0",
+    //         definitions: {
+    //             "0": {
+    //                 validator: "[0-9\uFF11-\uFF19]"
+    //             }
+    //         }
+    //     }).mask(testmask);
+    //
+    //     testmask.focus();
+    //     $("#testmask").trigger("click");
+    //     $("#testmask").Type("123333333333333333333333");
+    //     assert.equal(testmask.value, "0,12", "Result " + testmask.value);
+    // });
+
+    // qunit.test("a9{+} - Loop trigger in revalidateMask", function (assert) {
+    //     var $fixture = $("#qunit-fixture");
+    //     $fixture.append('<input type="text" id="testmask" />');
+    //     var testmask = document.getElementById("testmask");
+    //     Inputmask("a9{+}").mask(testmask);
+    //
+    //     testmask.focus();
+    //     $("#testmask").trigger("click");
+    //     $("#testmask").Type("a");
+    //     $.caret(testmask, 0);
+    //     $("#testmask").Type("a");
+    //     assert.equal(testmask.value, "a_", "Result " + testmask.value);
+    // });
 };