浏览代码

fix delete + wip on phone optimization

Robin Herbots 9 年之前
父节点
当前提交
00ab29fd6c

+ 2 - 1
CHANGELOG.md

@@ -18,7 +18,8 @@ All notable changes to this project will be documented in this file.
 - improve inputfallback (Android support)
 
 ### Fixed
-- In valid Leap Year dates can be entered #1368
+- Can't remove dot from the middle of a word #1439
+- Invalid Leap Year dates can be entered #1368
 - jquery.val returns empty value (when using an unsupported input type) #1415
 - Losing the decimal part when the maximum number of digits is reached #1257
 - Not allowing to change existing number to 0 #1381

+ 1 - 1
bower.json

@@ -1,6 +1,6 @@
 {
   "name": "jquery.inputmask",
-  "version": "3.3.4-64",
+  "version": "3.3.4-92",
   "main": [
 	  "./dist/inputmask/inputmask.loader.js"
   ],

+ 1 - 1
component.json

@@ -2,7 +2,7 @@
   "name": "jquery_inputmask",
   "repository": "robinherbots/jquery.inputmask",
   "description": "jquery.inputmask is a jquery plugin which create an input mask.",
-  "version": "3.3.4-64",
+  "version": "3.3.4-92",
   "keywords": ["jquery", "plugins", "input", "form", "inputmask", "mask"],
   "main": "./dist/inputmask/inputmask.loader.js",
   "scripts": [

+ 1 - 1
composer.json

@@ -1,7 +1,7 @@
 {
   "name": "robinherbots/jquery.inputmask",
   "description": "jquery.inputmask is a jquery plugin which create an input mask.",
-  "version": "3.3.4-64",
+  "version": "3.3.4-92",
   "type": "library",
   "keywords": ["jquery", "plugins", "input", "form", "inputmask", "mask"],
   "homepage": "http://robinherbots.github.io/jquery.inputmask",

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

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2016 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.4-64
+* Version: 3.3.4-92
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "inputmask.dependencyLib", "inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask);

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

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2016 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.4-64
+* Version: 3.3.4-92
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define("inputmask.dependencyLib", [ "jquery" ], factory) : "object" == typeof exports ? module.exports = factory(require("jquery")) : factory(jQuery);

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

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2016 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.4-64
+* Version: 3.3.4-92
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "inputmask.dependencyLib", "inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask);

+ 7 - 6
dist/inputmask/inputmask.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2016 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.4-64
+* Version: 3.3.4-92
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define("inputmask", [ "inputmask.dependencyLib" ], factory) : "object" == typeof exports ? module.exports = factory(require("./inputmask.dependencyLib")) : factory(window.dependencyLib || jQuery);
@@ -88,10 +88,11 @@
         if ($.isFunction(opts.mask) && (opts.mask = opts.mask(opts)), $.isArray(opts.mask)) {
             if (opts.mask.length > 1) {
                 opts.keepStatic = null === opts.keepStatic || opts.keepStatic;
-                var altMask = "(";
+                var altMask = opts.groupmarker.start;
                 return $.each(opts.numericInput ? opts.mask.reverse() : opts.mask, function(ndx, msk) {
-                    altMask.length > 1 && (altMask += ")|("), altMask += void 0 === msk.mask || $.isFunction(msk.mask) ? msk : msk.mask;
-                }), altMask += ")", generateMask(altMask, opts.mask, opts);
+                    altMask.length > 1 && (altMask += opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start), 
+                    altMask += void 0 === msk.mask || $.isFunction(msk.mask) ? msk : msk.mask;
+                }), altMask += opts.groupmarker.end, generateMask(altMask, opts.mask, opts);
             }
             opts.mask = opts.mask.pop();
         }
@@ -138,7 +139,7 @@
                 return !1;
             }
             var i, startPos = start, positionsClone = $.extend(!0, {}, getMaskSet().validPositions), needsValidation = !1;
-            for (getMaskSet().p = start, i = end - 1; i >= startPos; i--) void 0 !== getMaskSet().validPositions[i] && (nocheck === !0 || !IsEnclosedStatic(i) && opts.canClearPosition(getMaskSet(), i, getLastValidPosition(), strict, opts) !== !1) && delete getMaskSet().validPositions[i];
+            for (getMaskSet().p = start, i = end - 1; i >= startPos; i--) void 0 !== getMaskSet().validPositions[i] && (nocheck !== !0 && (!getMaskSet().validPositions[i].match.optionality && IsEnclosedStatic(i) || opts.canClearPosition(getMaskSet(), i, getLastValidPosition(), strict, opts) === !1) || delete getMaskSet().validPositions[i]);
             for (resetMaskSet(!0), i = startPos + 1; i <= getLastValidPosition(); ) {
                 for (;void 0 !== getMaskSet().validPositions[startPos]; ) startPos++;
                 var s = getMaskSet().validPositions[startPos];
@@ -955,7 +956,7 @@
                         var clickPosition = selectedCaret.begin, lvclickPosition = getLastValidPosition(clickPosition, !0), lastPosition = seekNext(lvclickPosition);
                         if (clickPosition < lastPosition) caret(input, isMask(clickPosition) || isMask(clickPosition - 1) ? clickPosition : seekNext(clickPosition)); else {
                             var placeholder = getPlaceholder(lastPosition);
-                            ("" !== placeholder && getBuffer()[lastPosition] !== placeholder && getTest(lastPosition).match.optionalQuantifier !== !0 || !isMask(lastPosition, !0) && getTest(lastPosition).match.def === placeholder) && (lastPosition = seekNext(lastPosition)), 
+                            ("" !== placeholder && getBuffer()[lastPosition] !== placeholder && getTest(lastPosition).match.optionalQuantifier !== !0 || !isMask(lastPosition) && getTest(lastPosition).match.def === placeholder) && (lastPosition = seekNext(lastPosition)), 
                             caret(input, lastPosition);
                         }
                     }

文件差异内容过多而无法显示
+ 1 - 1
dist/inputmask/inputmask.loader.js


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

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2016 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.4-64
+* Version: 3.3.4-92
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "inputmask.dependencyLib", "inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask);

+ 28 - 8
dist/inputmask/inputmask.phone.extensions.js

@@ -3,28 +3,48 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2016 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.4-64
+* Version: 3.3.4-92
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "inputmask.dependencyLib", "inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask);
 }(function($, Inputmask) {
+    function maskSort(a, b) {
+        var maska = (a.mask || a).replace(/#/g, "9").replace(/\)/, "9").replace(/[+()#-]/g, ""), maskb = (b.mask || b).replace(/#/g, "9").replace(/\)/, "9").replace(/[+()#-]/g, ""), maskas = (a.mask || a).split("#")[0], maskbs = (b.mask || b).split("#")[0];
+        return 0 === maskbs.indexOf(maskas) ? -1 : 0 === maskas.indexOf(maskbs) ? 1 : maska.localeCompare(maskb);
+    }
     var analyseMaskBase = Inputmask.analyseMask;
     return Inputmask.analyseMask = function(mask, opts) {
+        function reduceVariations(masks, previousVariation, previousmaskGroup) {
+            previousVariation = previousVariation || "", previousmaskGroup = previousmaskGroup || maskGroups, 
+            "" !== previousVariation && (previousmaskGroup[previousVariation] = {});
+            for (var variation = "", maskGroup = previousmaskGroup[previousVariation] || previousmaskGroup, i = masks.length - 1; i >= 0; i--) mask = masks[i].mask || masks[i], 
+            variation = mask.substr(0, 1), maskGroup[variation] = maskGroup[variation] || [], 
+            maskGroup[variation].unshift(mask.substr(1)), masks.splice(i, 1);
+            for (var ndx in maskGroup) maskGroup[ndx].length > 1e3 && reduceVariations(maskGroup[ndx].slice(), ndx, maskGroup);
+        }
+        function rebuild(maskGroup) {
+            var mask = "", submasks = [];
+            for (var ndx in maskGroup) $.isArray(maskGroup[ndx]) ? 1 === maskGroup[ndx].length ? submasks.push(ndx + maskGroup[ndx]) : submasks.push(ndx + opts.groupmarker.start + maskGroup[ndx].join(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start) + opts.groupmarker.end) : submasks.push(ndx + rebuild(maskGroup[ndx]));
+            return mask += 1 === submasks.length ? submasks[0] : opts.groupmarker.start + submasks.join(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start) + opts.groupmarker.end;
+        }
+        var maskGroups = {};
+        opts.phoneCodes && opts.phoneCodes.length > 500 && (mask = mask.substr(1, mask.length - 2), 
+        reduceVariations(mask.split(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start)), 
+        mask = rebuild(maskGroups)), console.log(mask);
         var mt = analyseMaskBase.call(this, mask, opts);
         return mt;
     }, Inputmask.extendAliases({
         abstractphone: {
+            groupmarker: {
+                start: "<",
+                end: ">"
+            },
             countrycode: "",
             phoneCodes: [],
             mask: function(opts) {
-                opts.definitions = {
+                return opts.definitions = {
                     "#": opts.definitions[9]
-                };
-                var masks = opts.phoneCodes.sort(function(a, b) {
-                    var maska = (a.mask || a).replace(/#/g, "9").replace(/[\)]/, "9").replace(/[\+\(\)#-]/g, ""), maskb = (b.mask || b).replace(/#/g, "9").replace(/[\)]/, "9").replace(/[\+\(\)#-]/g, ""), maskas = (a.mask || a).split("#")[0], maskbs = (b.mask || b).split("#")[0];
-                    return 0 === maskbs.indexOf(maskas) ? -1 : 0 === maskas.indexOf(maskbs) ? 1 : maska.localeCompare(maskb);
-                });
-                return masks;
+                }, opts.phoneCodes.sort(maskSort);
             },
             keepStatic: !0,
             onBeforeMask: function(value, opts) {

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

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2016 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.4-64
+* Version: 3.3.4-92
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "inputmask.dependencyLib", "inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask);

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

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2016 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.4-64
+* Version: 3.3.4-92
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "jquery", "inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("jquery"), require("./inputmask")) : factory(jQuery, window.Inputmask);

+ 34 - 13
dist/jquery.inputmask.bundle.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2016 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.4-64
+* Version: 3.3.4-92
 */
 !function($) {
     function Inputmask(alias, options) {
@@ -86,10 +86,11 @@
         if ($.isFunction(opts.mask) && (opts.mask = opts.mask(opts)), $.isArray(opts.mask)) {
             if (opts.mask.length > 1) {
                 opts.keepStatic = null === opts.keepStatic || opts.keepStatic;
-                var altMask = "(";
+                var altMask = opts.groupmarker.start;
                 return $.each(opts.numericInput ? opts.mask.reverse() : opts.mask, function(ndx, msk) {
-                    altMask.length > 1 && (altMask += ")|("), altMask += void 0 === msk.mask || $.isFunction(msk.mask) ? msk : msk.mask;
-                }), altMask += ")", generateMask(altMask, opts.mask, opts);
+                    altMask.length > 1 && (altMask += opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start), 
+                    altMask += void 0 === msk.mask || $.isFunction(msk.mask) ? msk : msk.mask;
+                }), altMask += opts.groupmarker.end, generateMask(altMask, opts.mask, opts);
             }
             opts.mask = opts.mask.pop();
         }
@@ -136,7 +137,7 @@
                 return !1;
             }
             var i, startPos = start, positionsClone = $.extend(!0, {}, getMaskSet().validPositions), needsValidation = !1;
-            for (getMaskSet().p = start, i = end - 1; i >= startPos; i--) void 0 !== getMaskSet().validPositions[i] && (nocheck === !0 || !IsEnclosedStatic(i) && opts.canClearPosition(getMaskSet(), i, getLastValidPosition(), strict, opts) !== !1) && delete getMaskSet().validPositions[i];
+            for (getMaskSet().p = start, i = end - 1; i >= startPos; i--) void 0 !== getMaskSet().validPositions[i] && (nocheck !== !0 && (!getMaskSet().validPositions[i].match.optionality && IsEnclosedStatic(i) || opts.canClearPosition(getMaskSet(), i, getLastValidPosition(), strict, opts) === !1) || delete getMaskSet().validPositions[i]);
             for (resetMaskSet(!0), i = startPos + 1; i <= getLastValidPosition(); ) {
                 for (;void 0 !== getMaskSet().validPositions[startPos]; ) startPos++;
                 var s = getMaskSet().validPositions[startPos];
@@ -953,7 +954,7 @@
                         var clickPosition = selectedCaret.begin, lvclickPosition = getLastValidPosition(clickPosition, !0), lastPosition = seekNext(lvclickPosition);
                         if (clickPosition < lastPosition) caret(input, isMask(clickPosition) || isMask(clickPosition - 1) ? clickPosition : seekNext(clickPosition)); else {
                             var placeholder = getPlaceholder(lastPosition);
-                            ("" !== placeholder && getBuffer()[lastPosition] !== placeholder && getTest(lastPosition).match.optionalQuantifier !== !0 || !isMask(lastPosition, !0) && getTest(lastPosition).match.def === placeholder) && (lastPosition = seekNext(lastPosition)), 
+                            ("" !== placeholder && getBuffer()[lastPosition] !== placeholder && getTest(lastPosition).match.optionalQuantifier !== !0 || !isMask(lastPosition) && getTest(lastPosition).match.def === placeholder) && (lastPosition = seekNext(lastPosition)), 
                             caret(input, lastPosition);
                         }
                     }
@@ -2574,23 +2575,43 @@
         }
     }), Inputmask;
 }(jQuery, Inputmask), function($, Inputmask) {
+    function maskSort(a, b) {
+        var maska = (a.mask || a).replace(/#/g, "9").replace(/\)/, "9").replace(/[+()#-]/g, ""), maskb = (b.mask || b).replace(/#/g, "9").replace(/\)/, "9").replace(/[+()#-]/g, ""), maskas = (a.mask || a).split("#")[0], maskbs = (b.mask || b).split("#")[0];
+        return 0 === maskbs.indexOf(maskas) ? -1 : 0 === maskas.indexOf(maskbs) ? 1 : maska.localeCompare(maskb);
+    }
     var analyseMaskBase = Inputmask.analyseMask;
     return Inputmask.analyseMask = function(mask, opts) {
+        function reduceVariations(masks, previousVariation, previousmaskGroup) {
+            previousVariation = previousVariation || "", previousmaskGroup = previousmaskGroup || maskGroups, 
+            "" !== previousVariation && (previousmaskGroup[previousVariation] = {});
+            for (var variation = "", maskGroup = previousmaskGroup[previousVariation] || previousmaskGroup, i = masks.length - 1; i >= 0; i--) mask = masks[i].mask || masks[i], 
+            variation = mask.substr(0, 1), maskGroup[variation] = maskGroup[variation] || [], 
+            maskGroup[variation].unshift(mask.substr(1)), masks.splice(i, 1);
+            for (var ndx in maskGroup) maskGroup[ndx].length > 1e3 && reduceVariations(maskGroup[ndx].slice(), ndx, maskGroup);
+        }
+        function rebuild(maskGroup) {
+            var mask = "", submasks = [];
+            for (var ndx in maskGroup) $.isArray(maskGroup[ndx]) ? 1 === maskGroup[ndx].length ? submasks.push(ndx + maskGroup[ndx]) : submasks.push(ndx + opts.groupmarker.start + maskGroup[ndx].join(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start) + opts.groupmarker.end) : submasks.push(ndx + rebuild(maskGroup[ndx]));
+            return mask += 1 === submasks.length ? submasks[0] : opts.groupmarker.start + submasks.join(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start) + opts.groupmarker.end;
+        }
+        var maskGroups = {};
+        opts.phoneCodes && opts.phoneCodes.length > 500 && (mask = mask.substr(1, mask.length - 2), 
+        reduceVariations(mask.split(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start)), 
+        mask = rebuild(maskGroups)), console.log(mask);
         var mt = analyseMaskBase.call(this, mask, opts);
         return mt;
     }, Inputmask.extendAliases({
         abstractphone: {
+            groupmarker: {
+                start: "<",
+                end: ">"
+            },
             countrycode: "",
             phoneCodes: [],
             mask: function(opts) {
-                opts.definitions = {
+                return opts.definitions = {
                     "#": opts.definitions[9]
-                };
-                var masks = opts.phoneCodes.sort(function(a, b) {
-                    var maska = (a.mask || a).replace(/#/g, "9").replace(/[\)]/, "9").replace(/[\+\(\)#-]/g, ""), maskb = (b.mask || b).replace(/#/g, "9").replace(/[\)]/, "9").replace(/[\+\(\)#-]/g, ""), maskas = (a.mask || a).split("#")[0], maskbs = (b.mask || b).split("#")[0];
-                    return 0 === maskbs.indexOf(maskas) ? -1 : 0 === maskas.indexOf(maskbs) ? 1 : maska.localeCompare(maskb);
-                });
-                return masks;
+                }, opts.phoneCodes.sort(maskSort);
             },
             keepStatic: !0,
             onBeforeMask: function(value, opts) {

文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/inputmask.date.extensions.min.js


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

@@ -3,6 +3,6 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2016 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.4-64
+* Version: 3.3.4-92
 */
 !function(a){"function"==typeof define&&define.amd?define("inputmask.dependencyLib",["jquery"],a):"object"==typeof exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return window.dependencyLib=a,a});

文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/inputmask.extensions.min.js


文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/inputmask.loader.min.js


文件差异内容过多而无法显示
+ 3 - 3
dist/min/inputmask/inputmask.min.js


文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/inputmask.numeric.extensions.min.js


文件差异内容过多而无法显示
+ 2 - 2
dist/min/inputmask/inputmask.phone.extensions.min.js


文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/inputmask.regex.extensions.min.js


文件差异内容过多而无法显示
+ 1 - 1
dist/min/inputmask/jquery.inputmask.min.js


文件差异内容过多而无法显示
+ 4 - 4
dist/min/jquery.inputmask.bundle.min.js


+ 5 - 5
js/inputmask.js

@@ -693,10 +693,10 @@
 		if ($.isArray(opts.mask)) {
 			if (opts.mask.length > 1) {
 				opts.keepStatic = opts.keepStatic === null ? true : opts.keepStatic; //enable by default when passing multiple masks when the option is not explicitly specified
-				var altMask = "(";
+				var altMask = opts.groupmarker.start;
 				$.each(opts.numericInput ? opts.mask.reverse() : opts.mask, function (ndx, msk) {
 					if (altMask.length > 1) {
-						altMask += ")|(";
+						altMask += opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start;
 					}
 					if (msk.mask !== undefined && !$.isFunction(msk.mask)) {
 						altMask += msk.mask;
@@ -704,7 +704,7 @@
 						altMask += msk;
 					}
 				});
-				altMask += ")";
+				altMask += opts.groupmarker.end;
 				// console.log(altMask);
 				return generateMask(altMask, opts.mask, opts);
 			} else opts.mask = opts.mask.pop();
@@ -822,7 +822,7 @@
 			for (i = end - 1; i >= startPos; i--) { //clear selection
 				if (getMaskSet().validPositions[i] !== undefined) {
 					if (nocheck === true ||
-						(!IsEnclosedStatic(i) && opts.canClearPosition(getMaskSet(), i, getLastValidPosition(), strict, opts) !== false)) {
+						((getMaskSet().validPositions[i].match.optionality || !IsEnclosedStatic(i)) && opts.canClearPosition(getMaskSet(), i, getLastValidPosition(), strict, opts) !== false)) {
 						delete getMaskSet().validPositions[i];
 					}
 				}
@@ -2590,7 +2590,7 @@
 									caret(input, !isMask(clickPosition) && !isMask(clickPosition - 1) ? seekNext(clickPosition) : clickPosition);
 								} else {
 									var placeholder = getPlaceholder(lastPosition);
-									if ((placeholder !== "" && getBuffer()[lastPosition] !== placeholder && getTest(lastPosition).match.optionalQuantifier !== true) || (!isMask(lastPosition, true) && getTest(lastPosition).match.def === placeholder)) {
+									if ((placeholder !== "" && getBuffer()[lastPosition] !== placeholder && getTest(lastPosition).match.optionalQuantifier !== true) || (!isMask(lastPosition) && getTest(lastPosition).match.def === placeholder)) {
 										lastPosition = seekNext(lastPosition);
 									}
 									caret(input, lastPosition);

+ 58 - 74
js/inputmask.phone.extensions.js

@@ -18,98 +18,82 @@
 	}
 }
 (function ($, Inputmask) {
-	var analyseMaskBase = Inputmask.analyseMask;
+	function maskSort(a, b) {
+		var maska = (a.mask || a).replace(/#/g, "9").replace(/\)/, "9").replace(/[+()#-]/g, ""),
+			maskb = (b.mask || b).replace(/#/g, "9").replace(/\)/, "9").replace(/[+()#-]/g, ""),
+			maskas = (a.mask || a).split("#")[0],
+			maskbs = (b.mask || b).split("#")[0];
 
-	function MaskToken(isGroup, isOptional, isQuantifier, isAlternator) {
-		this.matches = [];
-		this.isGroup = isGroup || false;
-		this.isOptional = isOptional || false;
-		this.isQuantifier = isQuantifier || false;
-		this.isAlternator = isAlternator || false;
-		this.quantifier = {
-			min: 1,
-			max: 1
-		};
+		return maskbs.indexOf(maskas) === 0 ? -1 : (maskas.indexOf(maskbs) === 0 ? 1 : maska.localeCompare(maskb));
 	}
 
+	var analyseMaskBase = Inputmask.analyseMask;
+
 	Inputmask.analyseMask = function (mask, opts) {
-		function consolidateAlternateTokens(matches) {
-			var consolidatedTokens = [];
-			$.each(matches, function (ndx, maskToken) {
-				if (maskToken.isAlternator) {
-					var cleanupNdx = [];
-					$.each(maskToken.matches, function (ndx, childToken) {
-						if (childToken && childToken.matches) {
-							if (childToken.matches.length > 0) {
-								if (consolidatedTokens[childToken.matches[0].nativeDef] === undefined && childToken.matches && !childToken.isGroup && !childToken.isOptional && !childToken.isQuantifier && !childToken.isAlternator) {
-									consolidatedTokens[childToken.matches[0].nativeDef] = new MaskToken(false, false, false, true);
-									var alternateToken = consolidatedTokens[childToken.matches[0].nativeDef];
-									var token = new MaskToken();
-									token.matches = childToken.matches.slice(1);
-									alternateToken.matches.push(token);
-									childToken.matches.splice(1, token.matches.length, alternateToken);
-								}
-								else {
-									cleanupNdx.push(ndx);
-									var alternateToken = consolidatedTokens[childToken.matches[0].nativeDef];
-									var token = new MaskToken();
-									token.matches = childToken.matches.slice(1);
-									alternateToken.matches.push(token);
-								}
-							} else {
-								maskToken.matches.splice(ndx, 1);
-							}
-						}
-					});
-					maskToken.matches = $.map(maskToken.matches, function (match, ndx) {
-						if (cleanupNdx.indexOf(ndx) === -1) return match;
-					});
-				}
-				if (maskToken.matches) {
-					if (maskToken.matches.length === 1) //remove unnecessary nesting
-						matches[ndx] = maskToken.matches[0];
-					else if (maskToken.matches.length > 1) {
-						var prevMatch;
-						$.each(maskToken.matches, function (ndx, match) {
-							if (prevMatch) {
+		var maskGroups = {};
 
-							} else prevMatch = match;
-						});
-					}
+		function reduceVariations(masks, previousVariation, previousmaskGroup) {
+			previousVariation = previousVariation || "";
+			previousmaskGroup = previousmaskGroup || maskGroups;
+			if (previousVariation !== "")
+				previousmaskGroup[previousVariation] = {};
+			var variation = "", maskGroup = previousmaskGroup[previousVariation] || previousmaskGroup;
+			for (var i = masks.length - 1; i >= 0; i--) {
+				mask = masks[i].mask || masks[i];
+				variation = mask.substr(0, 1);
+				maskGroup[variation] = maskGroup[variation] || [];
+				maskGroup[variation].unshift(mask.substr(1));
+				masks.splice(i, 1);
+			}
+			for (var ndx in maskGroup) {
+				if (maskGroup[ndx].length > 1000) {
+					reduceVariations(maskGroup[ndx].slice(), ndx, maskGroup);
 				}
-				if (matches[ndx].matches) {
-					consolidateAlternateTokens(matches[ndx].matches);
+			}
+		}
+
+		function rebuild(maskGroup) {
+			var mask = "", submasks = [];
+			for (var ndx in maskGroup) {
+				if ($.isArray(maskGroup[ndx])) {
+					if (maskGroup[ndx].length === 1)
+						submasks.push(ndx + maskGroup[ndx]);
+					else
+						submasks.push(ndx + opts.groupmarker.start + maskGroup[ndx].join(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start) + opts.groupmarker.end);
+				} else {
+					submasks.push(ndx + rebuild(maskGroup[ndx]));
 				}
-			});
+			}
+			if (submasks.length === 1) {
+				mask += submasks[0];
+			} else {
+				mask += opts.groupmarker.start + submasks.join(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start) + opts.groupmarker.end;
+			}
+
+			return mask;
 		}
 
-		var mt = analyseMaskBase.call(this, mask, opts);
-		if (false && opts.phoneCodes) {
-			console.time("Optimizing...");
-			consolidateAlternateTokens(mt[0].matches);
-			if (mt[0].matches && mt[0].matches.length === 1) //remove unnecessary nesting
-				mt[0] = mt[0].matches[0];
-			console.timeEnd("Optimizing...");
-			console.log(JSON.stringify(mt));
+
+		if (opts.phoneCodes && opts.phoneCodes.length > 500) {
+			mask = mask.substr(1, mask.length - 2);
+			reduceVariations(mask.split(opts.groupmarker.end + opts.alternatormarker + opts.groupmarker.start));
+			mask = rebuild(maskGroups);
 		}
+		console.log(mask);
+		var mt = analyseMaskBase.call(this, mask, opts);
 		return mt;
 	};
 	Inputmask.extendAliases({
 		"abstractphone": {
+			groupmarker: {
+				start: "<",
+				end: ">"
+			},
 			countrycode: "",
 			phoneCodes: [],
 			mask: function (opts) {
 				opts.definitions = {"#": opts.definitions["9"]};
-				//do some sorting
-				var masks = opts.phoneCodes.sort(function (a, b) {
-					var maska = (a.mask || a).replace(/#/g, "9").replace(/[\)]/, "9").replace(/[\+\(\)#-]/g, ""),
-						maskb = (b.mask || b).replace(/#/g, "9").replace(/[\)]/, "9").replace(/[\+\(\)#-]/g, ""),
-						maskas = (a.mask || a).split("#")[0],
-						maskbs = (b.mask || b).split("#")[0];
-
-					return maskbs.indexOf(maskas) === 0 ? -1 : (maskas.indexOf(maskbs) === 0 ? 1 : maska.localeCompare(maskb));
-				});
-				return masks;
+				return opts.phoneCodes.sort(maskSort);
 			},
 			keepStatic: true,
 			onBeforeMask: function (value, opts) {

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "jquery.inputmask",
-  "version": "3.3.4-64",
+  "version": "3.3.4-92",
   "description": "jquery.inputmask is a jquery plugin which create an input mask.",
   "main": "./dist/inputmask/inputmask.loader.js",
   "files": [

+ 2 - 2
qunit/config.js

@@ -7,7 +7,7 @@ require.config({
 		"inputmask.dependencyLib": "../extra/dependencyLibs/inputmask.dependencyLib.jquery",
 		// "inputmask.dependencyLib": "../extra/dependencyLibs/inputmask.dependencyLib",
 		// "inputmask.dependencyLib": "../extra/dependencyLibs/inputmask.dependencyLib.jqlite",
-		"inputmask": "../dist/inputmask/inputmask"
-		// "inputmask": "../js/inputmask"
+		// "inputmask": "../dist/inputmask/inputmask"
+		"inputmask": "../js/inputmask"
 	}
 });