Browse Source

fine tune mask sorting in phone-alias #1158

Robin Herbots 9 years ago
parent
commit
051b6b3ea6

+ 3 - 0
CHANGELOG.md

@@ -3,10 +3,13 @@ All notable changes to this project will be documented in this file.
 
 ## [UNRELEASED]
 ### Added
+- extra extension points: analyseMask
 - colorMask option ~ css styleable mask
 - jquery.loader.js => main in package.json
 
 ### Updates
+- phone-alias - fine-tune mask sorting
+- make data-inputmask attribute naming configurable (dataAttribute on Inputmask)
 - numeric alias move negation symbols to the edges
 - handle android predictive text enabled
 - rename js/inputmask.dependencyLib.jquery.js to js/inputmask.dependencyLib.js

+ 1 - 1
bower.json

@@ -1,6 +1,6 @@
 {
   "name": "jquery.inputmask",
-  "version": "3.3.4-56",
+  "version": "3.3.4-60",
   "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-56",
+  "version": "3.3.4-60",
   "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-56",
+  "version": "3.3.4-60",
   "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-56
+* Version: 3.3.4-60
 */
 !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-56
+* Version: 3.3.4-60
 */
 !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-56
+* Version: 3.3.4-60
 */
 !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);

+ 157 - 161
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-56
+* Version: 3.3.4-60
 */
 !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);
@@ -12,7 +12,7 @@
         return this instanceof Inputmask ? ($.isPlainObject(alias) ? options = alias : (options = options || {}, 
         options.alias = alias), this.el = void 0, this.opts = $.extend(!0, {}, this.defaults, options), 
         this.noMasksCache = options && void 0 !== options.definitions, this.userOptions = options || {}, 
-        this.events = {}, void resolveAlias(this.opts.alias, options, this.opts)) : new Inputmask(alias, options);
+        this.events = {}, this.dataAttribute = "data-inputmask", void resolveAlias(this.opts.alias, options, this.opts)) : new Inputmask(alias, options);
     }
     function isInputEventSupported(eventName) {
         var el = document.createElement("input"), evName = "on" + eventName, isSupported = evName in el;
@@ -33,13 +33,13 @@
         $.extend(!0, opts, aliasDefinition), $.extend(!0, opts, options), !0) : (null === opts.mask && (opts.mask = aliasStr), 
         !1);
     }
-    function importAttributeOptions(npt, opts, userOptions) {
+    function importAttributeOptions(npt, opts, userOptions, dataAttribute) {
         function importOption(option, optionData) {
-            optionData = void 0 !== optionData ? optionData : npt.getAttribute("data-inputmask-" + option), 
+            optionData = void 0 !== optionData ? optionData : npt.getAttribute(dataAttribute + "-" + option), 
             null !== optionData && ("string" == typeof optionData && (0 === option.indexOf("on") ? optionData = window[optionData] : "false" === optionData ? optionData = !1 : "true" === optionData && (optionData = !0)), 
             userOptions[option] = optionData);
         }
-        var option, dataoptions, optionData, p, attrOptions = npt.getAttribute("data-inputmask");
+        var option, dataoptions, optionData, p, attrOptions = npt.getAttribute(dataAttribute);
         if (attrOptions && "" !== attrOptions && (attrOptions = attrOptions.replace(new RegExp("'", "g"), '"'), 
         dataoptions = JSON.parse("{" + attrOptions + "}")), dataoptions) {
             optionData = void 0;
@@ -62,154 +62,7 @@
         return $.extend(!0, opts, userOptions), opts;
     }
     function generateMaskSet(opts, nocache) {
-        function analyseMask(mask) {
-            function MaskToken(isGroup, isOptional, isQuantifier, isAlternator) {
-                this.matches = [], this.isGroup = isGroup || !1, this.isOptional = isOptional || !1, 
-                this.isQuantifier = isQuantifier || !1, this.isAlternator = isAlternator || !1, 
-                this.quantifier = {
-                    min: 1,
-                    max: 1
-                };
-            }
-            function insertTestDefinition(mtoken, element, position) {
-                var maskdef = opts.definitions[element];
-                position = void 0 !== position ? position : mtoken.matches.length;
-                var prevMatch = mtoken.matches[position - 1];
-                if (maskdef && !escaped) {
-                    maskdef.placeholder = $.isFunction(maskdef.placeholder) ? maskdef.placeholder(opts) : maskdef.placeholder;
-                    for (var prevalidators = maskdef.prevalidator, prevalidatorsL = prevalidators ? prevalidators.length : 0, i = 1; i < maskdef.cardinality; i++) {
-                        var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator.validator, cardinality = prevalidator.cardinality;
-                        mtoken.matches.splice(position++, 0, {
-                            fn: validator ? "string" == typeof validator ? new RegExp(validator) : new function() {
-                                this.test = validator;
-                            }() : new RegExp("."),
-                            cardinality: cardinality ? cardinality : 1,
-                            optionality: mtoken.isOptional,
-                            newBlockMarker: void 0 === prevMatch || prevMatch.def !== (maskdef.definitionSymbol || element),
-                            casing: maskdef.casing,
-                            def: maskdef.definitionSymbol || element,
-                            placeholder: maskdef.placeholder,
-                            nativeDef: element
-                        }), prevMatch = mtoken.matches[position - 1];
-                    }
-                    mtoken.matches.splice(position++, 0, {
-                        fn: maskdef.validator ? "string" == typeof maskdef.validator ? new RegExp(maskdef.validator) : new function() {
-                            this.test = maskdef.validator;
-                        }() : new RegExp("."),
-                        cardinality: maskdef.cardinality,
-                        optionality: mtoken.isOptional,
-                        newBlockMarker: void 0 === prevMatch || prevMatch.def !== (maskdef.definitionSymbol || element),
-                        casing: maskdef.casing,
-                        def: maskdef.definitionSymbol || element,
-                        placeholder: maskdef.placeholder,
-                        nativeDef: element
-                    });
-                } else mtoken.matches.splice(position++, 0, {
-                    fn: null,
-                    cardinality: 0,
-                    optionality: mtoken.isOptional,
-                    newBlockMarker: void 0 === prevMatch || prevMatch.def !== element,
-                    casing: null,
-                    def: opts.staticDefinitionSymbol || element,
-                    placeholder: void 0 !== opts.staticDefinitionSymbol ? element : void 0,
-                    nativeDef: element
-                }), escaped = !1;
-            }
-            function verifyGroupMarker(lastMatch, isOpenGroup) {
-                lastMatch.isGroup && (lastMatch.isGroup = !1, insertTestDefinition(lastMatch, opts.groupmarker.start, 0), 
-                isOpenGroup !== !0 && insertTestDefinition(lastMatch, opts.groupmarker.end));
-            }
-            function maskCurrentToken(m, currentToken, lastMatch, extraCondition) {
-                currentToken.matches.length > 0 && (void 0 === extraCondition || extraCondition) && (lastMatch = currentToken.matches[currentToken.matches.length - 1], 
-                verifyGroupMarker(lastMatch)), insertTestDefinition(currentToken, m);
-            }
-            function defaultCase() {
-                if (openenings.length > 0) {
-                    if (currentOpeningToken = openenings[openenings.length - 1], maskCurrentToken(m, currentOpeningToken, lastMatch, !currentOpeningToken.isAlternator), 
-                    currentOpeningToken.isAlternator) {
-                        alternator = openenings.pop();
-                        for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1;
-                        openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
-                        currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator);
-                    }
-                } else maskCurrentToken(m, currentToken, lastMatch);
-            }
-            function reverseTokens(maskToken) {
-                function reverseStatic(st) {
-                    return st === opts.optionalmarker.start ? st = opts.optionalmarker.end : st === opts.optionalmarker.end ? st = opts.optionalmarker.start : st === opts.groupmarker.start ? st = opts.groupmarker.end : st === opts.groupmarker.end && (st = opts.groupmarker.start), 
-                    st;
-                }
-                maskToken.matches = maskToken.matches.reverse();
-                for (var match in maskToken.matches) {
-                    var intMatch = parseInt(match);
-                    if (maskToken.matches[match].isQuantifier && maskToken.matches[intMatch + 1] && maskToken.matches[intMatch + 1].isGroup) {
-                        var qt = maskToken.matches[match];
-                        maskToken.matches.splice(match, 1), maskToken.matches.splice(intMatch + 1, 0, qt);
-                    }
-                    void 0 !== maskToken.matches[match].matches ? maskToken.matches[match] = reverseTokens(maskToken.matches[match]) : maskToken.matches[match] = reverseStatic(maskToken.matches[match]);
-                }
-                return maskToken;
-            }
-            for (var match, m, openingToken, currentOpeningToken, alternator, lastMatch, groupToken, tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g, escaped = !1, currentToken = new MaskToken(), openenings = [], maskTokens = []; match = tokenizer.exec(mask); ) if (m = match[0], 
-            escaped) defaultCase(); else switch (m.charAt(0)) {
-              case opts.escapeChar:
-                escaped = !0;
-                break;
-
-              case opts.optionalmarker.end:
-              case opts.groupmarker.end:
-                if (openingToken = openenings.pop(), void 0 !== openingToken) if (openenings.length > 0) {
-                    if (currentOpeningToken = openenings[openenings.length - 1], currentOpeningToken.matches.push(openingToken), 
-                    currentOpeningToken.isAlternator) {
-                        alternator = openenings.pop();
-                        for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1;
-                        openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
-                        currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator);
-                    }
-                } else currentToken.matches.push(openingToken); else defaultCase();
-                break;
-
-              case opts.optionalmarker.start:
-                openenings.push(new MaskToken((!1), (!0)));
-                break;
-
-              case opts.groupmarker.start:
-                openenings.push(new MaskToken((!0)));
-                break;
-
-              case opts.quantifiermarker.start:
-                var quantifier = new MaskToken((!1), (!1), (!0));
-                m = m.replace(/[{}]/g, "");
-                var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]);
-                if ("*" !== mq1 && "+" !== mq1 || (mq0 = "*" === mq1 ? 0 : 1), quantifier.quantifier = {
-                    min: mq0,
-                    max: mq1
-                }, openenings.length > 0) {
-                    var matches = openenings[openenings.length - 1].matches;
-                    match = matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), groupToken.matches.push(match), 
-                    match = groupToken), matches.push(match), matches.push(quantifier);
-                } else match = currentToken.matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), 
-                groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match), 
-                currentToken.matches.push(quantifier);
-                break;
-
-              case opts.alternatormarker:
-                openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
-                lastMatch = currentOpeningToken.matches.pop()) : lastMatch = currentToken.matches.pop(), 
-                lastMatch.isAlternator ? openenings.push(lastMatch) : (alternator = new MaskToken((!1), (!1), (!1), (!0)), 
-                alternator.matches.push(lastMatch), openenings.push(alternator));
-                break;
-
-              default:
-                defaultCase();
-            }
-            for (;openenings.length > 0; ) openingToken = openenings.pop(), verifyGroupMarker(openingToken, !0), 
-            currentToken.matches.push(openingToken);
-            return currentToken.matches.length > 0 && (lastMatch = currentToken.matches[currentToken.matches.length - 1], 
-            verifyGroupMarker(lastMatch), maskTokens.push(currentToken)), opts.numericInput && reverseTokens(maskTokens[0]), 
-            maskTokens;
-        }
-        function generateMask(mask, metadata) {
+        function generateMask(mask, metadata, opts) {
             if (null !== mask && "" !== mask) {
                 if (1 === mask.length && opts.greedy === !1 && 0 !== opts.repeat && (opts.placeholder = ""), 
                 opts.repeat > 0 || "*" === opts.repeat || "+" === opts.repeat) {
@@ -219,7 +72,7 @@
                 var masksetDefinition;
                 return void 0 === Inputmask.prototype.masksCache[mask] || nocache === !0 ? (masksetDefinition = {
                     mask: mask,
-                    maskToken: analyseMask(mask),
+                    maskToken: Inputmask.analyseMask(mask, opts),
                     validPositions: {},
                     _buffer: void 0,
                     buffer: void 0,
@@ -231,21 +84,18 @@
                 masksetDefinition;
             }
         }
-        function preProcessMask(mask) {
-            return mask = mask.toString();
-        }
         var ms;
         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 = "(";
                 return $.each(opts.numericInput ? opts.mask.reverse() : opts.mask, function(ndx, msk) {
-                    altMask.length > 1 && (altMask += ")|("), altMask += preProcessMask(void 0 === msk.mask || $.isFunction(msk.mask) ? msk : msk.mask);
-                }), altMask += ")", generateMask(altMask, opts.mask);
+                    altMask.length > 1 && (altMask += ")|("), altMask += void 0 === msk.mask || $.isFunction(msk.mask) ? msk : msk.mask;
+                }), altMask += ")", generateMask(altMask, opts.mask, opts);
             }
             opts.mask = opts.mask.pop();
         }
-        return opts.mask && (ms = void 0 === opts.mask.mask || $.isFunction(opts.mask.mask) ? generateMask(preProcessMask(opts.mask), opts.mask) : generateMask(preProcessMask(opts.mask.mask), opts.mask)), 
+        return opts.mask && (ms = void 0 === opts.mask.mask || $.isFunction(opts.mask.mask) ? generateMask(opts.mask, opts.mask, opts) : generateMask(opts.mask.mask, opts.mask, opts)), 
         ms;
     }
     function maskScope(actionObj, maskset, opts) {
@@ -1444,7 +1294,7 @@
             return "string" == typeof elems && (elems = document.getElementById(elems) || document.querySelectorAll(elems)), 
             elems = elems.nodeName ? [ elems ] : elems, $.each(elems, function(ndx, el) {
                 var scopedOpts = $.extend(!0, {}, that.opts);
-                importAttributeOptions(el, scopedOpts, $.extend(!0, {}, that.userOptions));
+                importAttributeOptions(el, scopedOpts, $.extend(!0, {}, that.userOptions), that.dataAttribute);
                 var maskset = generateMaskSet(scopedOpts, that.noMasksCache);
                 void 0 !== maskset && (void 0 !== el.inputmask && el.inputmask.remove(), el.inputmask = new Inputmask(), 
                 el.inputmask.opts = scopedOpts, el.inputmask.noMasksCache = that.noMasksCache, el.inputmask.userOptions = $.extend(!0, {}, that.userOptions), 
@@ -1558,6 +1408,152 @@
         UP: 38,
         WINDOWS: 91,
         X: 88
+    }, Inputmask.analyseMask = function(mask, opts) {
+        function MaskToken(isGroup, isOptional, isQuantifier, isAlternator) {
+            this.matches = [], this.isGroup = isGroup || !1, this.isOptional = isOptional || !1, 
+            this.isQuantifier = isQuantifier || !1, this.isAlternator = isAlternator || !1, 
+            this.quantifier = {
+                min: 1,
+                max: 1
+            };
+        }
+        function insertTestDefinition(mtoken, element, position) {
+            var maskdef = opts.definitions[element];
+            position = void 0 !== position ? position : mtoken.matches.length;
+            var prevMatch = mtoken.matches[position - 1];
+            if (maskdef && !escaped) {
+                maskdef.placeholder = $.isFunction(maskdef.placeholder) ? maskdef.placeholder(opts) : maskdef.placeholder;
+                for (var prevalidators = maskdef.prevalidator, prevalidatorsL = prevalidators ? prevalidators.length : 0, i = 1; i < maskdef.cardinality; i++) {
+                    var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator.validator, cardinality = prevalidator.cardinality;
+                    mtoken.matches.splice(position++, 0, {
+                        fn: validator ? "string" == typeof validator ? new RegExp(validator) : new function() {
+                            this.test = validator;
+                        }() : new RegExp("."),
+                        cardinality: cardinality ? cardinality : 1,
+                        optionality: mtoken.isOptional,
+                        newBlockMarker: void 0 === prevMatch || prevMatch.def !== (maskdef.definitionSymbol || element),
+                        casing: maskdef.casing,
+                        def: maskdef.definitionSymbol || element,
+                        placeholder: maskdef.placeholder,
+                        nativeDef: element
+                    }), prevMatch = mtoken.matches[position - 1];
+                }
+                mtoken.matches.splice(position++, 0, {
+                    fn: maskdef.validator ? "string" == typeof maskdef.validator ? new RegExp(maskdef.validator) : new function() {
+                        this.test = maskdef.validator;
+                    }() : new RegExp("."),
+                    cardinality: maskdef.cardinality,
+                    optionality: mtoken.isOptional,
+                    newBlockMarker: void 0 === prevMatch || prevMatch.def !== (maskdef.definitionSymbol || element),
+                    casing: maskdef.casing,
+                    def: maskdef.definitionSymbol || element,
+                    placeholder: maskdef.placeholder,
+                    nativeDef: element
+                });
+            } else mtoken.matches.splice(position++, 0, {
+                fn: null,
+                cardinality: 0,
+                optionality: mtoken.isOptional,
+                newBlockMarker: void 0 === prevMatch || prevMatch.def !== element,
+                casing: null,
+                def: opts.staticDefinitionSymbol || element,
+                placeholder: void 0 !== opts.staticDefinitionSymbol ? element : void 0,
+                nativeDef: element
+            }), escaped = !1;
+        }
+        function verifyGroupMarker(lastMatch, isOpenGroup) {
+            lastMatch.isGroup && (lastMatch.isGroup = !1, insertTestDefinition(lastMatch, opts.groupmarker.start, 0), 
+            isOpenGroup !== !0 && insertTestDefinition(lastMatch, opts.groupmarker.end));
+        }
+        function maskCurrentToken(m, currentToken, lastMatch, extraCondition) {
+            currentToken.matches.length > 0 && (void 0 === extraCondition || extraCondition) && (lastMatch = currentToken.matches[currentToken.matches.length - 1], 
+            verifyGroupMarker(lastMatch)), insertTestDefinition(currentToken, m);
+        }
+        function defaultCase() {
+            if (openenings.length > 0) {
+                if (currentOpeningToken = openenings[openenings.length - 1], maskCurrentToken(m, currentOpeningToken, lastMatch, !currentOpeningToken.isAlternator), 
+                currentOpeningToken.isAlternator) {
+                    alternator = openenings.pop();
+                    for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1;
+                    openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
+                    currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator);
+                }
+            } else maskCurrentToken(m, currentToken, lastMatch);
+        }
+        function reverseTokens(maskToken) {
+            function reverseStatic(st) {
+                return st === opts.optionalmarker.start ? st = opts.optionalmarker.end : st === opts.optionalmarker.end ? st = opts.optionalmarker.start : st === opts.groupmarker.start ? st = opts.groupmarker.end : st === opts.groupmarker.end && (st = opts.groupmarker.start), 
+                st;
+            }
+            maskToken.matches = maskToken.matches.reverse();
+            for (var match in maskToken.matches) {
+                var intMatch = parseInt(match);
+                if (maskToken.matches[match].isQuantifier && maskToken.matches[intMatch + 1] && maskToken.matches[intMatch + 1].isGroup) {
+                    var qt = maskToken.matches[match];
+                    maskToken.matches.splice(match, 1), maskToken.matches.splice(intMatch + 1, 0, qt);
+                }
+                void 0 !== maskToken.matches[match].matches ? maskToken.matches[match] = reverseTokens(maskToken.matches[match]) : maskToken.matches[match] = reverseStatic(maskToken.matches[match]);
+            }
+            return maskToken;
+        }
+        for (var match, m, openingToken, currentOpeningToken, alternator, lastMatch, groupToken, tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g, escaped = !1, currentToken = new MaskToken(), openenings = [], maskTokens = []; match = tokenizer.exec(mask); ) if (m = match[0], 
+        escaped) defaultCase(); else switch (m.charAt(0)) {
+          case opts.escapeChar:
+            escaped = !0;
+            break;
+
+          case opts.optionalmarker.end:
+          case opts.groupmarker.end:
+            if (openingToken = openenings.pop(), void 0 !== openingToken) if (openenings.length > 0) {
+                if (currentOpeningToken = openenings[openenings.length - 1], currentOpeningToken.matches.push(openingToken), 
+                currentOpeningToken.isAlternator) {
+                    alternator = openenings.pop();
+                    for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1;
+                    openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
+                    currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator);
+                }
+            } else currentToken.matches.push(openingToken); else defaultCase();
+            break;
+
+          case opts.optionalmarker.start:
+            openenings.push(new MaskToken((!1), (!0)));
+            break;
+
+          case opts.groupmarker.start:
+            openenings.push(new MaskToken((!0)));
+            break;
+
+          case opts.quantifiermarker.start:
+            var quantifier = new MaskToken((!1), (!1), (!0));
+            m = m.replace(/[{}]/g, "");
+            var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]);
+            if ("*" !== mq1 && "+" !== mq1 || (mq0 = "*" === mq1 ? 0 : 1), quantifier.quantifier = {
+                min: mq0,
+                max: mq1
+            }, openenings.length > 0) {
+                var matches = openenings[openenings.length - 1].matches;
+                match = matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), groupToken.matches.push(match), 
+                match = groupToken), matches.push(match), matches.push(quantifier);
+            } else match = currentToken.matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), 
+            groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match), 
+            currentToken.matches.push(quantifier);
+            break;
+
+          case opts.alternatormarker:
+            openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
+            lastMatch = currentOpeningToken.matches.pop()) : lastMatch = currentToken.matches.pop(), 
+            lastMatch.isAlternator ? openenings.push(lastMatch) : (alternator = new MaskToken((!1), (!1), (!1), (!0)), 
+            alternator.matches.push(lastMatch), openenings.push(alternator));
+            break;
+
+          default:
+            defaultCase();
+        }
+        for (;openenings.length > 0; ) openingToken = openenings.pop(), verifyGroupMarker(openingToken, !0), 
+        currentToken.matches.push(openingToken);
+        return currentToken.matches.length > 0 && (lastMatch = currentToken.matches[currentToken.matches.length - 1], 
+        verifyGroupMarker(lastMatch), maskTokens.push(currentToken)), opts.numericInput && reverseTokens(maskTokens[0]), 
+        maskTokens;
     };
     var ua = navigator.userAgent, mobile = /mobile/i.test(ua), iemobile = /iemobile/i.test(ua), iphone = /iphone/i.test(ua) && !iemobile, android = /android/i.test(ua) && !iemobile;
     return window.Inputmask = Inputmask, Inputmask;

File diff suppressed because it is too large
+ 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-56
+* Version: 3.3.4-60
 */
 !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);

+ 2 - 2
dist/inputmask/inputmask.phone.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-54
+* Version: 3.3.4-60
 */
 !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);
@@ -17,7 +17,7 @@
                     "#": opts.definitions[9]
                 };
                 var masks = opts.phoneCodes.sort(function(a, b) {
-                    var maska = (a.mask || a).replace(/#/g, "9").replace(/[\+\(\)#-]/g, ""), maskb = (b.mask || b).replace(/#/g, "9").replace(/[\+\(\)#-]/g, ""), maskas = (a.mask || a).split("#")[0], maskbs = (b.mask || b).split("#")[0];
+                    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;

+ 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-56
+* Version: 3.3.4-60
 */
 !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-56
+* Version: 3.3.4-60
 */
 !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);

+ 160 - 173
dist/jquery.inputmask.bundle.js

@@ -3,14 +3,14 @@
 * 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-56
+* Version: 3.3.4-60
 */
 !function($) {
     function Inputmask(alias, options) {
         return this instanceof Inputmask ? ($.isPlainObject(alias) ? options = alias : (options = options || {}, 
         options.alias = alias), this.el = void 0, this.opts = $.extend(!0, {}, this.defaults, options), 
         this.noMasksCache = options && void 0 !== options.definitions, this.userOptions = options || {}, 
-        this.events = {}, void resolveAlias(this.opts.alias, options, this.opts)) : new Inputmask(alias, options);
+        this.events = {}, this.dataAttribute = "data-inputmask", void resolveAlias(this.opts.alias, options, this.opts)) : new Inputmask(alias, options);
     }
     function isInputEventSupported(eventName) {
         var el = document.createElement("input"), evName = "on" + eventName, isSupported = evName in el;
@@ -31,13 +31,13 @@
         $.extend(!0, opts, aliasDefinition), $.extend(!0, opts, options), !0) : (null === opts.mask && (opts.mask = aliasStr), 
         !1);
     }
-    function importAttributeOptions(npt, opts, userOptions) {
+    function importAttributeOptions(npt, opts, userOptions, dataAttribute) {
         function importOption(option, optionData) {
-            optionData = void 0 !== optionData ? optionData : npt.getAttribute("data-inputmask-" + option), 
+            optionData = void 0 !== optionData ? optionData : npt.getAttribute(dataAttribute + "-" + option), 
             null !== optionData && ("string" == typeof optionData && (0 === option.indexOf("on") ? optionData = window[optionData] : "false" === optionData ? optionData = !1 : "true" === optionData && (optionData = !0)), 
             userOptions[option] = optionData);
         }
-        var option, dataoptions, optionData, p, attrOptions = npt.getAttribute("data-inputmask");
+        var option, dataoptions, optionData, p, attrOptions = npt.getAttribute(dataAttribute);
         if (attrOptions && "" !== attrOptions && (attrOptions = attrOptions.replace(new RegExp("'", "g"), '"'), 
         dataoptions = JSON.parse("{" + attrOptions + "}")), dataoptions) {
             optionData = void 0;
@@ -60,154 +60,7 @@
         return $.extend(!0, opts, userOptions), opts;
     }
     function generateMaskSet(opts, nocache) {
-        function analyseMask(mask) {
-            function MaskToken(isGroup, isOptional, isQuantifier, isAlternator) {
-                this.matches = [], this.isGroup = isGroup || !1, this.isOptional = isOptional || !1, 
-                this.isQuantifier = isQuantifier || !1, this.isAlternator = isAlternator || !1, 
-                this.quantifier = {
-                    min: 1,
-                    max: 1
-                };
-            }
-            function insertTestDefinition(mtoken, element, position) {
-                var maskdef = opts.definitions[element];
-                position = void 0 !== position ? position : mtoken.matches.length;
-                var prevMatch = mtoken.matches[position - 1];
-                if (maskdef && !escaped) {
-                    maskdef.placeholder = $.isFunction(maskdef.placeholder) ? maskdef.placeholder(opts) : maskdef.placeholder;
-                    for (var prevalidators = maskdef.prevalidator, prevalidatorsL = prevalidators ? prevalidators.length : 0, i = 1; i < maskdef.cardinality; i++) {
-                        var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator.validator, cardinality = prevalidator.cardinality;
-                        mtoken.matches.splice(position++, 0, {
-                            fn: validator ? "string" == typeof validator ? new RegExp(validator) : new function() {
-                                this.test = validator;
-                            }() : new RegExp("."),
-                            cardinality: cardinality ? cardinality : 1,
-                            optionality: mtoken.isOptional,
-                            newBlockMarker: void 0 === prevMatch || prevMatch.def !== (maskdef.definitionSymbol || element),
-                            casing: maskdef.casing,
-                            def: maskdef.definitionSymbol || element,
-                            placeholder: maskdef.placeholder,
-                            nativeDef: element
-                        }), prevMatch = mtoken.matches[position - 1];
-                    }
-                    mtoken.matches.splice(position++, 0, {
-                        fn: maskdef.validator ? "string" == typeof maskdef.validator ? new RegExp(maskdef.validator) : new function() {
-                            this.test = maskdef.validator;
-                        }() : new RegExp("."),
-                        cardinality: maskdef.cardinality,
-                        optionality: mtoken.isOptional,
-                        newBlockMarker: void 0 === prevMatch || prevMatch.def !== (maskdef.definitionSymbol || element),
-                        casing: maskdef.casing,
-                        def: maskdef.definitionSymbol || element,
-                        placeholder: maskdef.placeholder,
-                        nativeDef: element
-                    });
-                } else mtoken.matches.splice(position++, 0, {
-                    fn: null,
-                    cardinality: 0,
-                    optionality: mtoken.isOptional,
-                    newBlockMarker: void 0 === prevMatch || prevMatch.def !== element,
-                    casing: null,
-                    def: opts.staticDefinitionSymbol || element,
-                    placeholder: void 0 !== opts.staticDefinitionSymbol ? element : void 0,
-                    nativeDef: element
-                }), escaped = !1;
-            }
-            function verifyGroupMarker(lastMatch, isOpenGroup) {
-                lastMatch.isGroup && (lastMatch.isGroup = !1, insertTestDefinition(lastMatch, opts.groupmarker.start, 0), 
-                isOpenGroup !== !0 && insertTestDefinition(lastMatch, opts.groupmarker.end));
-            }
-            function maskCurrentToken(m, currentToken, lastMatch, extraCondition) {
-                currentToken.matches.length > 0 && (void 0 === extraCondition || extraCondition) && (lastMatch = currentToken.matches[currentToken.matches.length - 1], 
-                verifyGroupMarker(lastMatch)), insertTestDefinition(currentToken, m);
-            }
-            function defaultCase() {
-                if (openenings.length > 0) {
-                    if (currentOpeningToken = openenings[openenings.length - 1], maskCurrentToken(m, currentOpeningToken, lastMatch, !currentOpeningToken.isAlternator), 
-                    currentOpeningToken.isAlternator) {
-                        alternator = openenings.pop();
-                        for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1;
-                        openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
-                        currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator);
-                    }
-                } else maskCurrentToken(m, currentToken, lastMatch);
-            }
-            function reverseTokens(maskToken) {
-                function reverseStatic(st) {
-                    return st === opts.optionalmarker.start ? st = opts.optionalmarker.end : st === opts.optionalmarker.end ? st = opts.optionalmarker.start : st === opts.groupmarker.start ? st = opts.groupmarker.end : st === opts.groupmarker.end && (st = opts.groupmarker.start), 
-                    st;
-                }
-                maskToken.matches = maskToken.matches.reverse();
-                for (var match in maskToken.matches) {
-                    var intMatch = parseInt(match);
-                    if (maskToken.matches[match].isQuantifier && maskToken.matches[intMatch + 1] && maskToken.matches[intMatch + 1].isGroup) {
-                        var qt = maskToken.matches[match];
-                        maskToken.matches.splice(match, 1), maskToken.matches.splice(intMatch + 1, 0, qt);
-                    }
-                    void 0 !== maskToken.matches[match].matches ? maskToken.matches[match] = reverseTokens(maskToken.matches[match]) : maskToken.matches[match] = reverseStatic(maskToken.matches[match]);
-                }
-                return maskToken;
-            }
-            for (var match, m, openingToken, currentOpeningToken, alternator, lastMatch, groupToken, tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g, escaped = !1, currentToken = new MaskToken(), openenings = [], maskTokens = []; match = tokenizer.exec(mask); ) if (m = match[0], 
-            escaped) defaultCase(); else switch (m.charAt(0)) {
-              case opts.escapeChar:
-                escaped = !0;
-                break;
-
-              case opts.optionalmarker.end:
-              case opts.groupmarker.end:
-                if (openingToken = openenings.pop(), void 0 !== openingToken) if (openenings.length > 0) {
-                    if (currentOpeningToken = openenings[openenings.length - 1], currentOpeningToken.matches.push(openingToken), 
-                    currentOpeningToken.isAlternator) {
-                        alternator = openenings.pop();
-                        for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1;
-                        openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
-                        currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator);
-                    }
-                } else currentToken.matches.push(openingToken); else defaultCase();
-                break;
-
-              case opts.optionalmarker.start:
-                openenings.push(new MaskToken((!1), (!0)));
-                break;
-
-              case opts.groupmarker.start:
-                openenings.push(new MaskToken((!0)));
-                break;
-
-              case opts.quantifiermarker.start:
-                var quantifier = new MaskToken((!1), (!1), (!0));
-                m = m.replace(/[{}]/g, "");
-                var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]);
-                if ("*" !== mq1 && "+" !== mq1 || (mq0 = "*" === mq1 ? 0 : 1), quantifier.quantifier = {
-                    min: mq0,
-                    max: mq1
-                }, openenings.length > 0) {
-                    var matches = openenings[openenings.length - 1].matches;
-                    match = matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), groupToken.matches.push(match), 
-                    match = groupToken), matches.push(match), matches.push(quantifier);
-                } else match = currentToken.matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), 
-                groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match), 
-                currentToken.matches.push(quantifier);
-                break;
-
-              case opts.alternatormarker:
-                openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
-                lastMatch = currentOpeningToken.matches.pop()) : lastMatch = currentToken.matches.pop(), 
-                lastMatch.isAlternator ? openenings.push(lastMatch) : (alternator = new MaskToken((!1), (!1), (!1), (!0)), 
-                alternator.matches.push(lastMatch), openenings.push(alternator));
-                break;
-
-              default:
-                defaultCase();
-            }
-            for (;openenings.length > 0; ) openingToken = openenings.pop(), verifyGroupMarker(openingToken, !0), 
-            currentToken.matches.push(openingToken);
-            return currentToken.matches.length > 0 && (lastMatch = currentToken.matches[currentToken.matches.length - 1], 
-            verifyGroupMarker(lastMatch), maskTokens.push(currentToken)), opts.numericInput && reverseTokens(maskTokens[0]), 
-            maskTokens;
-        }
-        function generateMask(mask, metadata) {
+        function generateMask(mask, metadata, opts) {
             if (null !== mask && "" !== mask) {
                 if (1 === mask.length && opts.greedy === !1 && 0 !== opts.repeat && (opts.placeholder = ""), 
                 opts.repeat > 0 || "*" === opts.repeat || "+" === opts.repeat) {
@@ -217,7 +70,7 @@
                 var masksetDefinition;
                 return void 0 === Inputmask.prototype.masksCache[mask] || nocache === !0 ? (masksetDefinition = {
                     mask: mask,
-                    maskToken: analyseMask(mask),
+                    maskToken: Inputmask.analyseMask(mask, opts),
                     validPositions: {},
                     _buffer: void 0,
                     buffer: void 0,
@@ -229,21 +82,18 @@
                 masksetDefinition;
             }
         }
-        function preProcessMask(mask) {
-            return mask = mask.toString();
-        }
         var ms;
         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 = "(";
                 return $.each(opts.numericInput ? opts.mask.reverse() : opts.mask, function(ndx, msk) {
-                    altMask.length > 1 && (altMask += ")|("), altMask += preProcessMask(void 0 === msk.mask || $.isFunction(msk.mask) ? msk : msk.mask);
-                }), altMask += ")", generateMask(altMask, opts.mask);
+                    altMask.length > 1 && (altMask += ")|("), altMask += void 0 === msk.mask || $.isFunction(msk.mask) ? msk : msk.mask;
+                }), altMask += ")", generateMask(altMask, opts.mask, opts);
             }
             opts.mask = opts.mask.pop();
         }
-        return opts.mask && (ms = void 0 === opts.mask.mask || $.isFunction(opts.mask.mask) ? generateMask(preProcessMask(opts.mask), opts.mask) : generateMask(preProcessMask(opts.mask.mask), opts.mask)), 
+        return opts.mask && (ms = void 0 === opts.mask.mask || $.isFunction(opts.mask.mask) ? generateMask(opts.mask, opts.mask, opts) : generateMask(opts.mask.mask, opts.mask, opts)), 
         ms;
     }
     function maskScope(actionObj, maskset, opts) {
@@ -1442,7 +1292,7 @@
             return "string" == typeof elems && (elems = document.getElementById(elems) || document.querySelectorAll(elems)), 
             elems = elems.nodeName ? [ elems ] : elems, $.each(elems, function(ndx, el) {
                 var scopedOpts = $.extend(!0, {}, that.opts);
-                importAttributeOptions(el, scopedOpts, $.extend(!0, {}, that.userOptions));
+                importAttributeOptions(el, scopedOpts, $.extend(!0, {}, that.userOptions), that.dataAttribute);
                 var maskset = generateMaskSet(scopedOpts, that.noMasksCache);
                 void 0 !== maskset && (void 0 !== el.inputmask && el.inputmask.remove(), el.inputmask = new Inputmask(), 
                 el.inputmask.opts = scopedOpts, el.inputmask.noMasksCache = that.noMasksCache, el.inputmask.userOptions = $.extend(!0, {}, that.userOptions), 
@@ -1556,6 +1406,152 @@
         UP: 38,
         WINDOWS: 91,
         X: 88
+    }, Inputmask.analyseMask = function(mask, opts) {
+        function MaskToken(isGroup, isOptional, isQuantifier, isAlternator) {
+            this.matches = [], this.isGroup = isGroup || !1, this.isOptional = isOptional || !1, 
+            this.isQuantifier = isQuantifier || !1, this.isAlternator = isAlternator || !1, 
+            this.quantifier = {
+                min: 1,
+                max: 1
+            };
+        }
+        function insertTestDefinition(mtoken, element, position) {
+            var maskdef = opts.definitions[element];
+            position = void 0 !== position ? position : mtoken.matches.length;
+            var prevMatch = mtoken.matches[position - 1];
+            if (maskdef && !escaped) {
+                maskdef.placeholder = $.isFunction(maskdef.placeholder) ? maskdef.placeholder(opts) : maskdef.placeholder;
+                for (var prevalidators = maskdef.prevalidator, prevalidatorsL = prevalidators ? prevalidators.length : 0, i = 1; i < maskdef.cardinality; i++) {
+                    var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator.validator, cardinality = prevalidator.cardinality;
+                    mtoken.matches.splice(position++, 0, {
+                        fn: validator ? "string" == typeof validator ? new RegExp(validator) : new function() {
+                            this.test = validator;
+                        }() : new RegExp("."),
+                        cardinality: cardinality ? cardinality : 1,
+                        optionality: mtoken.isOptional,
+                        newBlockMarker: void 0 === prevMatch || prevMatch.def !== (maskdef.definitionSymbol || element),
+                        casing: maskdef.casing,
+                        def: maskdef.definitionSymbol || element,
+                        placeholder: maskdef.placeholder,
+                        nativeDef: element
+                    }), prevMatch = mtoken.matches[position - 1];
+                }
+                mtoken.matches.splice(position++, 0, {
+                    fn: maskdef.validator ? "string" == typeof maskdef.validator ? new RegExp(maskdef.validator) : new function() {
+                        this.test = maskdef.validator;
+                    }() : new RegExp("."),
+                    cardinality: maskdef.cardinality,
+                    optionality: mtoken.isOptional,
+                    newBlockMarker: void 0 === prevMatch || prevMatch.def !== (maskdef.definitionSymbol || element),
+                    casing: maskdef.casing,
+                    def: maskdef.definitionSymbol || element,
+                    placeholder: maskdef.placeholder,
+                    nativeDef: element
+                });
+            } else mtoken.matches.splice(position++, 0, {
+                fn: null,
+                cardinality: 0,
+                optionality: mtoken.isOptional,
+                newBlockMarker: void 0 === prevMatch || prevMatch.def !== element,
+                casing: null,
+                def: opts.staticDefinitionSymbol || element,
+                placeholder: void 0 !== opts.staticDefinitionSymbol ? element : void 0,
+                nativeDef: element
+            }), escaped = !1;
+        }
+        function verifyGroupMarker(lastMatch, isOpenGroup) {
+            lastMatch.isGroup && (lastMatch.isGroup = !1, insertTestDefinition(lastMatch, opts.groupmarker.start, 0), 
+            isOpenGroup !== !0 && insertTestDefinition(lastMatch, opts.groupmarker.end));
+        }
+        function maskCurrentToken(m, currentToken, lastMatch, extraCondition) {
+            currentToken.matches.length > 0 && (void 0 === extraCondition || extraCondition) && (lastMatch = currentToken.matches[currentToken.matches.length - 1], 
+            verifyGroupMarker(lastMatch)), insertTestDefinition(currentToken, m);
+        }
+        function defaultCase() {
+            if (openenings.length > 0) {
+                if (currentOpeningToken = openenings[openenings.length - 1], maskCurrentToken(m, currentOpeningToken, lastMatch, !currentOpeningToken.isAlternator), 
+                currentOpeningToken.isAlternator) {
+                    alternator = openenings.pop();
+                    for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1;
+                    openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
+                    currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator);
+                }
+            } else maskCurrentToken(m, currentToken, lastMatch);
+        }
+        function reverseTokens(maskToken) {
+            function reverseStatic(st) {
+                return st === opts.optionalmarker.start ? st = opts.optionalmarker.end : st === opts.optionalmarker.end ? st = opts.optionalmarker.start : st === opts.groupmarker.start ? st = opts.groupmarker.end : st === opts.groupmarker.end && (st = opts.groupmarker.start), 
+                st;
+            }
+            maskToken.matches = maskToken.matches.reverse();
+            for (var match in maskToken.matches) {
+                var intMatch = parseInt(match);
+                if (maskToken.matches[match].isQuantifier && maskToken.matches[intMatch + 1] && maskToken.matches[intMatch + 1].isGroup) {
+                    var qt = maskToken.matches[match];
+                    maskToken.matches.splice(match, 1), maskToken.matches.splice(intMatch + 1, 0, qt);
+                }
+                void 0 !== maskToken.matches[match].matches ? maskToken.matches[match] = reverseTokens(maskToken.matches[match]) : maskToken.matches[match] = reverseStatic(maskToken.matches[match]);
+            }
+            return maskToken;
+        }
+        for (var match, m, openingToken, currentOpeningToken, alternator, lastMatch, groupToken, tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g, escaped = !1, currentToken = new MaskToken(), openenings = [], maskTokens = []; match = tokenizer.exec(mask); ) if (m = match[0], 
+        escaped) defaultCase(); else switch (m.charAt(0)) {
+          case opts.escapeChar:
+            escaped = !0;
+            break;
+
+          case opts.optionalmarker.end:
+          case opts.groupmarker.end:
+            if (openingToken = openenings.pop(), void 0 !== openingToken) if (openenings.length > 0) {
+                if (currentOpeningToken = openenings[openenings.length - 1], currentOpeningToken.matches.push(openingToken), 
+                currentOpeningToken.isAlternator) {
+                    alternator = openenings.pop();
+                    for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1;
+                    openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
+                    currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator);
+                }
+            } else currentToken.matches.push(openingToken); else defaultCase();
+            break;
+
+          case opts.optionalmarker.start:
+            openenings.push(new MaskToken((!1), (!0)));
+            break;
+
+          case opts.groupmarker.start:
+            openenings.push(new MaskToken((!0)));
+            break;
+
+          case opts.quantifiermarker.start:
+            var quantifier = new MaskToken((!1), (!1), (!0));
+            m = m.replace(/[{}]/g, "");
+            var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]);
+            if ("*" !== mq1 && "+" !== mq1 || (mq0 = "*" === mq1 ? 0 : 1), quantifier.quantifier = {
+                min: mq0,
+                max: mq1
+            }, openenings.length > 0) {
+                var matches = openenings[openenings.length - 1].matches;
+                match = matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), groupToken.matches.push(match), 
+                match = groupToken), matches.push(match), matches.push(quantifier);
+            } else match = currentToken.matches.pop(), match.isGroup || (groupToken = new MaskToken((!0)), 
+            groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match), 
+            currentToken.matches.push(quantifier);
+            break;
+
+          case opts.alternatormarker:
+            openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], 
+            lastMatch = currentOpeningToken.matches.pop()) : lastMatch = currentToken.matches.pop(), 
+            lastMatch.isAlternator ? openenings.push(lastMatch) : (alternator = new MaskToken((!1), (!1), (!1), (!0)), 
+            alternator.matches.push(lastMatch), openenings.push(alternator));
+            break;
+
+          default:
+            defaultCase();
+        }
+        for (;openenings.length > 0; ) openingToken = openenings.pop(), verifyGroupMarker(openingToken, !0), 
+        currentToken.matches.push(openingToken);
+        return currentToken.matches.length > 0 && (lastMatch = currentToken.matches[currentToken.matches.length - 1], 
+        verifyGroupMarker(lastMatch), maskTokens.push(currentToken)), opts.numericInput && reverseTokens(maskTokens[0]), 
+        maskTokens;
     };
     var ua = navigator.userAgent, mobile = /mobile/i.test(ua), iemobile = /iemobile/i.test(ua), iphone = /iphone/i.test(ua) && !iemobile, android = /android/i.test(ua) && !iemobile;
     return window.Inputmask = Inputmask, Inputmask;
@@ -2594,20 +2590,11 @@
             countrycode: "",
             phoneCodes: [],
             mask: function(opts) {
-                function regionize() {
-                    opts.regions = {
-                        base: []
-                    }, $.each(opts.phoneCodes, function(ndx, phoneCode) {
-                        var region = phoneCode.region;
-                        void 0 === region ? opts.regions.base.push(phoneCode) : void 0 === opts.regions[region] ? (opts.regions[region] = [], 
-                        opts.regions.base.push(phoneCode), opts.regions[region].push(phoneCode)) : opts.regions[region].push(phoneCode);
-                    });
-                }
                 opts.definitions = {
                     "#": opts.definitions[9]
-                }, regionize();
-                var masks = opts.regions.base.sort(function(a, b) {
-                    var maska = (a.mask || a).replace(/#/g, "9").replace(/[\+\(\)#-]/g, ""), maskb = (b.mask || b).replace(/#/g, "9").replace(/[\+\(\)#-]/g, ""), maskas = (a.mask || a).split("#")[0], maskbs = (b.mask || b).split("#")[0];
+                };
+                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;

File diff suppressed because it is too large
+ 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-56
+* Version: 3.3.4-60
 */
 !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});

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
+ 1 - 1
dist/min/inputmask/inputmask.loader.min.js


File diff suppressed because it is too large
+ 3 - 3
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
+ 2 - 2
dist/min/inputmask/inputmask.phone.extensions.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/inputmask.regex.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
+ 4 - 4
dist/min/jquery.inputmask.bundle.min.js


+ 284 - 291
js/inputmask.js

@@ -34,6 +34,7 @@
 		this.noMasksCache = options && options.definitions !== undefined;
 		this.userOptions = options || {}; //user passed options
 		this.events = {};
+		this.dataAttribute = "data-inputmask"; //data attribute prefix used for attribute binding
 		resolveAlias(this.opts.alias, options, this.opts);
 	}
 
@@ -134,7 +135,7 @@
 			elems = elems.nodeName ? [elems] : elems;
 			$.each(elems, function (ndx, el) {
 				var scopedOpts = $.extend(true, {}, that.opts);
-				importAttributeOptions(el, scopedOpts, $.extend(true, {}, that.userOptions));
+				importAttributeOptions(el, scopedOpts, $.extend(true, {}, that.userOptions), that.dataAttribute);
 				var maskset = generateMaskSet(scopedOpts, that.noMasksCache);
 				if (maskset !== undefined) {
 					if (el.inputmask !== undefined) {
@@ -288,6 +289,273 @@
 		X: 88
 	};
 
+	Inputmask.analyseMask = function (mask, opts) {
+		var tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g,
+			escaped = false,
+			currentToken = new MaskToken(),
+			match,
+			m,
+			openenings = [],
+			maskTokens = [],
+			openingToken,
+			currentOpeningToken,
+			alternator,
+			lastMatch,
+			groupToken;
+
+		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
+			};
+		}
+
+		//test definition => {fn: RegExp/function, cardinality: int, optionality: bool, newBlockMarker: bool, casing: null/upper/lower, def: definitionSymbol, placeholder: placeholder, mask: real maskDefinition}
+		function insertTestDefinition(mtoken, element, position) {
+			var maskdef = opts.definitions[element];
+			position = position !== undefined ? position : mtoken.matches.length;
+			var prevMatch = mtoken.matches[position - 1];
+			if (maskdef && !escaped) {
+				maskdef.placeholder = $.isFunction(maskdef.placeholder) ? maskdef.placeholder(opts) : maskdef.placeholder;
+				var prevalidators = maskdef.prevalidator,
+					prevalidatorsL = prevalidators ? prevalidators.length : 0;
+				//handle prevalidators
+				for (var i = 1; i < maskdef.cardinality; i++) {
+					var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [],
+						validator = prevalidator.validator,
+						cardinality = prevalidator.cardinality;
+					mtoken.matches.splice(position++, 0, {
+						fn: validator ? typeof validator === "string" ? new RegExp(validator) : new function () {
+							this.test = validator;
+						} : new RegExp("."),
+						cardinality: cardinality ? cardinality : 1,
+						optionality: mtoken.isOptional,
+						newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element),
+						casing: maskdef.casing,
+						def: maskdef.definitionSymbol || element,
+						placeholder: maskdef.placeholder,
+						nativeDef: element
+					});
+					prevMatch = mtoken.matches[position - 1];
+				}
+				mtoken.matches.splice(position++, 0, {
+					fn: maskdef.validator ? typeof maskdef.validator == "string" ? new RegExp(maskdef.validator) : new function () {
+						this.test = maskdef.validator;
+					} : new RegExp("."),
+					cardinality: maskdef.cardinality,
+					optionality: mtoken.isOptional,
+					newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element),
+					casing: maskdef.casing,
+					def: maskdef.definitionSymbol || element,
+					placeholder: maskdef.placeholder,
+					nativeDef: element
+				});
+			} else {
+				mtoken.matches.splice(position++, 0, {
+					fn: null,
+					cardinality: 0,
+					optionality: mtoken.isOptional,
+					newBlockMarker: prevMatch === undefined || prevMatch.def !== element,
+					casing: null,
+					def: opts.staticDefinitionSymbol || element,
+					placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined,
+					nativeDef: element
+				});
+				escaped = false;
+			}
+		}
+
+		function verifyGroupMarker(lastMatch, isOpenGroup) {
+			if (lastMatch.isGroup) { //this is not a group but a normal mask => convert
+				lastMatch.isGroup = false;
+				insertTestDefinition(lastMatch, opts.groupmarker.start, 0);
+				if (isOpenGroup !== true) {
+					insertTestDefinition(lastMatch, opts.groupmarker.end);
+				}
+			}
+		}
+
+		function maskCurrentToken(m, currentToken, lastMatch, extraCondition) {
+			if (currentToken.matches.length > 0 && (extraCondition === undefined || extraCondition)) {
+				lastMatch = currentToken.matches[currentToken.matches.length - 1];
+				verifyGroupMarker(lastMatch);
+			}
+			insertTestDefinition(currentToken, m);
+		}
+
+		function defaultCase() {
+			if (openenings.length > 0) {
+				currentOpeningToken = openenings[openenings.length - 1];
+				maskCurrentToken(m, currentOpeningToken, lastMatch, !currentOpeningToken.isAlternator);
+				if (currentOpeningToken.isAlternator) { //handle alternator a | b case
+					alternator = openenings.pop();
+					for (var mndx = 0; mndx < alternator.matches.length; mndx++) {
+						alternator.matches[mndx].isGroup = false; //don't mark alternate groups as group
+					}
+					if (openenings.length > 0) {
+						currentOpeningToken = openenings[openenings.length - 1];
+						currentOpeningToken.matches.push(alternator);
+					} else {
+						currentToken.matches.push(alternator);
+					}
+				}
+			} else {
+				maskCurrentToken(m, currentToken, lastMatch);
+			}
+		}
+
+		function reverseTokens(maskToken) {
+			function reverseStatic(st) {
+				if (st === opts.optionalmarker.start) st = opts.optionalmarker.end;
+				else if (st === opts.optionalmarker.end) st = opts.optionalmarker.start;
+				else if (st === opts.groupmarker.start) st = opts.groupmarker.end;
+				else if (st === opts.groupmarker.end) st = opts.groupmarker.start;
+
+				return st;
+			}
+
+			maskToken.matches = maskToken.matches.reverse();
+			for (var match in maskToken.matches) {
+				var intMatch = parseInt(match);
+				if (maskToken.matches[match].isQuantifier && maskToken.matches[intMatch + 1] && maskToken.matches[intMatch + 1].isGroup) { //reposition quantifier
+					var qt = maskToken.matches[match];
+					maskToken.matches.splice(match, 1);
+					maskToken.matches.splice(intMatch + 1, 0, qt);
+				}
+				if (maskToken.matches[match].matches !== undefined) {
+					maskToken.matches[match] = reverseTokens(maskToken.matches[match]);
+				} else {
+					maskToken.matches[match] = reverseStatic(maskToken.matches[match]);
+				}
+			}
+
+			return maskToken;
+		}
+
+		while (match = tokenizer.exec(mask)) {
+			m = match[0];
+
+			if (escaped) {
+				defaultCase();
+				continue;
+			}
+			switch (m.charAt(0)) {
+				case opts.escapeChar:
+					escaped = true;
+					break;
+				case opts.optionalmarker.end:
+				// optional closing
+				case opts.groupmarker.end:
+					// Group closing
+					openingToken = openenings.pop();
+					if (openingToken !== undefined) {
+						if (openenings.length > 0) {
+							currentOpeningToken = openenings[openenings.length - 1];
+							currentOpeningToken.matches.push(openingToken);
+							if (currentOpeningToken.isAlternator) { //handle alternator (a) | (b) case
+								alternator = openenings.pop();
+								for (var mndx = 0; mndx < alternator.matches.length; mndx++) {
+									alternator.matches[mndx].isGroup = false; //don't mark alternate groups as group
+								}
+								if (openenings.length > 0) {
+									currentOpeningToken = openenings[openenings.length - 1];
+									currentOpeningToken.matches.push(alternator);
+								} else {
+									currentToken.matches.push(alternator);
+								}
+							}
+						} else {
+							currentToken.matches.push(openingToken);
+						}
+					} else defaultCase();
+					break;
+				case opts.optionalmarker.start:
+					// optional opening
+					openenings.push(new MaskToken(false, true));
+					break;
+				case opts.groupmarker.start:
+					// Group opening
+					openenings.push(new MaskToken(true));
+					break;
+				case opts.quantifiermarker.start:
+					//Quantifier
+					var quantifier = new MaskToken(false, false, true);
+
+					m = m.replace(/[{}]/g, "");
+					var mq = m.split(","),
+						mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]),
+						mq1 = mq.length === 1 ? mq0 : (isNaN(mq[1]) ? mq[1] : parseInt(mq[1]));
+					if (mq1 === "*" || mq1 === "+") {
+						mq0 = mq1 === "*" ? 0 : 1;
+					}
+					quantifier.quantifier = {
+						min: mq0,
+						max: mq1
+					};
+					if (openenings.length > 0) {
+						var matches = openenings[openenings.length - 1].matches;
+						match = matches.pop();
+						if (!match.isGroup) {
+							groupToken = new MaskToken(true);
+							groupToken.matches.push(match);
+							match = groupToken;
+						}
+						matches.push(match);
+						matches.push(quantifier);
+					} else {
+						match = currentToken.matches.pop();
+						if (!match.isGroup) {
+							groupToken = new MaskToken(true);
+							groupToken.matches.push(match);
+							match = groupToken;
+						}
+						currentToken.matches.push(match);
+						currentToken.matches.push(quantifier);
+					}
+					break;
+				case opts.alternatormarker:
+					if (openenings.length > 0) {
+						currentOpeningToken = openenings[openenings.length - 1];
+						lastMatch = currentOpeningToken.matches.pop();
+					} else {
+						lastMatch = currentToken.matches.pop();
+					}
+					if (lastMatch.isAlternator) {
+						openenings.push(lastMatch);
+					} else {
+						alternator = new MaskToken(false, false, false, true);
+						alternator.matches.push(lastMatch);
+						openenings.push(alternator);
+					}
+					break;
+				default:
+					defaultCase();
+			}
+		}
+
+		while (openenings.length > 0) {
+			openingToken = openenings.pop();
+			verifyGroupMarker(openingToken, true);
+			currentToken.matches.push(openingToken);
+		}
+		if (currentToken.matches.length > 0) {
+			lastMatch = currentToken.matches[currentToken.matches.length - 1];
+			verifyGroupMarker(lastMatch);
+			maskTokens.push(currentToken);
+		}
+
+		if (opts.numericInput) {
+			reverseTokens(maskTokens[0]);
+		}
+		//console.log(JSON.stringify(maskTokens));
+		return maskTokens;
+	};
+
 	//helper functions
 	function isInputEventSupported(eventName) {
 		var el = document.createElement("input"),
@@ -328,12 +596,12 @@
 		return false;
 	}
 
-	function importAttributeOptions(npt, opts, userOptions) {
-		var attrOptions = npt.getAttribute("data-inputmask"),
+	function importAttributeOptions(npt, opts, userOptions, dataAttribute) {
+		var attrOptions = npt.getAttribute(dataAttribute),
 			option, dataoptions, optionData, p;
 
 		function importOption(option, optionData) {
-			optionData = optionData !== undefined ? optionData : npt.getAttribute("data-inputmask-" + option);
+			optionData = optionData !== undefined ? optionData : npt.getAttribute(dataAttribute + "-" + option);
 			if (optionData !== null) {
 				if (typeof optionData === "string") {
 					if (option.indexOf("on") === 0) optionData = window[optionData]; //get function definition
@@ -350,7 +618,7 @@
 		}
 
 		//resolve aliases
-		if (dataoptions) { //pickup alias from data-inputmask
+		if (dataoptions) { //pickup alias from dataAttribute
 			optionData = undefined;
 			for (p in dataoptions) {
 				if (p.toLowerCase() === "alias") {
@@ -359,7 +627,7 @@
 				}
 			}
 		}
-		importOption("alias", optionData); //pickup alias from data-inputmask-alias
+		importOption("alias", optionData); //pickup alias from dataAttribute-alias
 		if (userOptions.alias) {
 			resolveAlias(userOptions.alias, userOptions, opts);
 		}
@@ -382,276 +650,7 @@
 	}
 
 	function generateMaskSet(opts, nocache) {
-		var ms;
-
-		function analyseMask(mask) {
-			var tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g,
-				escaped = false,
-				currentToken = new MaskToken(),
-				match,
-				m,
-				openenings = [],
-				maskTokens = [],
-				openingToken,
-				currentOpeningToken,
-				alternator,
-				lastMatch,
-				groupToken;
-
-			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
-				};
-			}
-
-			//test definition => {fn: RegExp/function, cardinality: int, optionality: bool, newBlockMarker: bool, casing: null/upper/lower, def: definitionSymbol, placeholder: placeholder, mask: real maskDefinition}
-			function insertTestDefinition(mtoken, element, position) {
-				var maskdef = opts.definitions[element];
-				position = position !== undefined ? position : mtoken.matches.length;
-				var prevMatch = mtoken.matches[position - 1];
-				if (maskdef && !escaped) {
-					maskdef.placeholder = $.isFunction(maskdef.placeholder) ? maskdef.placeholder(opts) : maskdef.placeholder;
-					var prevalidators = maskdef.prevalidator,
-						prevalidatorsL = prevalidators ? prevalidators.length : 0;
-					//handle prevalidators
-					for (var i = 1; i < maskdef.cardinality; i++) {
-						var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [],
-							validator = prevalidator.validator,
-							cardinality = prevalidator.cardinality;
-						mtoken.matches.splice(position++, 0, {
-							fn: validator ? typeof validator === "string" ? new RegExp(validator) : new function () {
-								this.test = validator;
-							} : new RegExp("."),
-							cardinality: cardinality ? cardinality : 1,
-							optionality: mtoken.isOptional,
-							newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element),
-							casing: maskdef.casing,
-							def: maskdef.definitionSymbol || element,
-							placeholder: maskdef.placeholder,
-							nativeDef: element
-						});
-						prevMatch = mtoken.matches[position - 1];
-					}
-					mtoken.matches.splice(position++, 0, {
-						fn: maskdef.validator ? typeof maskdef.validator == "string" ? new RegExp(maskdef.validator) : new function () {
-							this.test = maskdef.validator;
-						} : new RegExp("."),
-						cardinality: maskdef.cardinality,
-						optionality: mtoken.isOptional,
-						newBlockMarker: prevMatch === undefined || prevMatch.def !== (maskdef.definitionSymbol || element),
-						casing: maskdef.casing,
-						def: maskdef.definitionSymbol || element,
-						placeholder: maskdef.placeholder,
-						nativeDef: element
-					});
-				} else {
-					mtoken.matches.splice(position++, 0, {
-						fn: null,
-						cardinality: 0,
-						optionality: mtoken.isOptional,
-						newBlockMarker: prevMatch === undefined || prevMatch.def !== element,
-						casing: null,
-						def: opts.staticDefinitionSymbol || element,
-						placeholder: opts.staticDefinitionSymbol !== undefined ? element : undefined,
-						nativeDef: element
-					});
-					escaped = false;
-				}
-			}
-
-			function verifyGroupMarker(lastMatch, isOpenGroup) {
-				if (lastMatch.isGroup) { //this is not a group but a normal mask => convert
-					lastMatch.isGroup = false;
-					insertTestDefinition(lastMatch, opts.groupmarker.start, 0);
-					if (isOpenGroup !== true) {
-						insertTestDefinition(lastMatch, opts.groupmarker.end);
-					}
-				}
-			}
-
-			function maskCurrentToken(m, currentToken, lastMatch, extraCondition) {
-				if (currentToken.matches.length > 0 && (extraCondition === undefined || extraCondition)) {
-					lastMatch = currentToken.matches[currentToken.matches.length - 1];
-					verifyGroupMarker(lastMatch);
-				}
-				insertTestDefinition(currentToken, m);
-			}
-
-			function defaultCase() {
-				if (openenings.length > 0) {
-					currentOpeningToken = openenings[openenings.length - 1];
-					maskCurrentToken(m, currentOpeningToken, lastMatch, !currentOpeningToken.isAlternator);
-					if (currentOpeningToken.isAlternator) { //handle alternator a | b case
-						alternator = openenings.pop();
-						for (var mndx = 0; mndx < alternator.matches.length; mndx++) {
-							alternator.matches[mndx].isGroup = false; //don't mark alternate groups as group
-						}
-						if (openenings.length > 0) {
-							currentOpeningToken = openenings[openenings.length - 1];
-							currentOpeningToken.matches.push(alternator);
-						} else {
-							currentToken.matches.push(alternator);
-						}
-					}
-				} else {
-					maskCurrentToken(m, currentToken, lastMatch);
-				}
-			}
-
-			function reverseTokens(maskToken) {
-				function reverseStatic(st) {
-					if (st === opts.optionalmarker.start) st = opts.optionalmarker.end;
-					else if (st === opts.optionalmarker.end) st = opts.optionalmarker.start;
-					else if (st === opts.groupmarker.start) st = opts.groupmarker.end;
-					else if (st === opts.groupmarker.end) st = opts.groupmarker.start;
-
-					return st;
-				}
-
-				maskToken.matches = maskToken.matches.reverse();
-				for (var match in maskToken.matches) {
-					var intMatch = parseInt(match);
-					if (maskToken.matches[match].isQuantifier && maskToken.matches[intMatch + 1] && maskToken.matches[intMatch + 1].isGroup) { //reposition quantifier
-						var qt = maskToken.matches[match];
-						maskToken.matches.splice(match, 1);
-						maskToken.matches.splice(intMatch + 1, 0, qt);
-					}
-					if (maskToken.matches[match].matches !== undefined) {
-						maskToken.matches[match] = reverseTokens(maskToken.matches[match]);
-					} else {
-						maskToken.matches[match] = reverseStatic(maskToken.matches[match]);
-					}
-				}
-
-				return maskToken;
-			}
-
-			while (match = tokenizer.exec(mask)) {
-				m = match[0];
-
-				if (escaped) {
-					defaultCase();
-					continue;
-				}
-				switch (m.charAt(0)) {
-					case opts.escapeChar:
-						escaped = true;
-						break;
-					case opts.optionalmarker.end:
-					// optional closing
-					case opts.groupmarker.end:
-						// Group closing
-						openingToken = openenings.pop();
-						if (openingToken !== undefined) {
-							if (openenings.length > 0) {
-								currentOpeningToken = openenings[openenings.length - 1];
-								currentOpeningToken.matches.push(openingToken);
-								if (currentOpeningToken.isAlternator) { //handle alternator (a) | (b) case
-									alternator = openenings.pop();
-									for (var mndx = 0; mndx < alternator.matches.length; mndx++) {
-										alternator.matches[mndx].isGroup = false; //don't mark alternate groups as group
-									}
-									if (openenings.length > 0) {
-										currentOpeningToken = openenings[openenings.length - 1];
-										currentOpeningToken.matches.push(alternator);
-									} else {
-										currentToken.matches.push(alternator);
-									}
-								}
-							} else {
-								currentToken.matches.push(openingToken);
-							}
-						} else defaultCase();
-						break;
-					case opts.optionalmarker.start:
-						// optional opening
-						openenings.push(new MaskToken(false, true));
-						break;
-					case opts.groupmarker.start:
-						// Group opening
-						openenings.push(new MaskToken(true));
-						break;
-					case opts.quantifiermarker.start:
-						//Quantifier
-						var quantifier = new MaskToken(false, false, true);
-
-						m = m.replace(/[{}]/g, "");
-						var mq = m.split(","),
-							mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]),
-							mq1 = mq.length === 1 ? mq0 : (isNaN(mq[1]) ? mq[1] : parseInt(mq[1]));
-						if (mq1 === "*" || mq1 === "+") {
-							mq0 = mq1 === "*" ? 0 : 1;
-						}
-						quantifier.quantifier = {
-							min: mq0,
-							max: mq1
-						};
-						if (openenings.length > 0) {
-							var matches = openenings[openenings.length - 1].matches;
-							match = matches.pop();
-							if (!match.isGroup) {
-								groupToken = new MaskToken(true);
-								groupToken.matches.push(match);
-								match = groupToken;
-							}
-							matches.push(match);
-							matches.push(quantifier);
-						} else {
-							match = currentToken.matches.pop();
-							if (!match.isGroup) {
-								groupToken = new MaskToken(true);
-								groupToken.matches.push(match);
-								match = groupToken;
-							}
-							currentToken.matches.push(match);
-							currentToken.matches.push(quantifier);
-						}
-						break;
-					case opts.alternatormarker:
-						if (openenings.length > 0) {
-							currentOpeningToken = openenings[openenings.length - 1];
-							lastMatch = currentOpeningToken.matches.pop();
-						} else {
-							lastMatch = currentToken.matches.pop();
-						}
-						if (lastMatch.isAlternator) {
-							openenings.push(lastMatch);
-						} else {
-							alternator = new MaskToken(false, false, false, true);
-							alternator.matches.push(lastMatch);
-							openenings.push(alternator);
-						}
-						break;
-					default:
-						defaultCase();
-				}
-			}
-
-			while (openenings.length > 0) {
-				openingToken = openenings.pop();
-				verifyGroupMarker(openingToken, true);
-				currentToken.matches.push(openingToken);
-			}
-			if (currentToken.matches.length > 0) {
-				lastMatch = currentToken.matches[currentToken.matches.length - 1];
-				verifyGroupMarker(lastMatch);
-				maskTokens.push(currentToken);
-			}
-
-			if (opts.numericInput) {
-				reverseTokens(maskTokens[0]);
-			}
-			//console.log(JSON.stringify(maskTokens));
-			return maskTokens;
-		}
-
-		function generateMask(mask, metadata) {
+		function generateMask(mask, metadata, opts) {
 			if (mask === null || mask === "") {
 				return undefined;
 			} else {
@@ -668,7 +667,7 @@
 				if (Inputmask.prototype.masksCache[mask] === undefined || nocache === true) {
 					masksetDefinition = {
 						"mask": mask,
-						"maskToken": analyseMask(mask),
+						"maskToken": Inputmask.analyseMask(mask, opts),
 						"validPositions": {},
 						"_buffer": undefined,
 						"buffer": undefined,
@@ -686,14 +685,7 @@
 			}
 		}
 
-		function preProcessMask(mask) {
-			mask = mask.toString();
-			// if (opts.numericInput) {
-			// 	mask = mask.split('').reverse();
-			// 	mask = mask.join('');
-			// }
-			return mask;
-		}
+		var ms;
 
 		if ($.isFunction(opts.mask)) { //allow mask to be a preprocessing fn - should return a valid mask
 			opts.mask = opts.mask(opts);
@@ -707,27 +699,28 @@
 						altMask += ")|(";
 					}
 					if (msk.mask !== undefined && !$.isFunction(msk.mask)) {
-						altMask += preProcessMask(msk.mask);
+						altMask += msk.mask;
 					} else {
-						altMask += preProcessMask(msk);
+						altMask += msk;
 					}
 				});
 				altMask += ")";
 				// console.log(altMask);
-				return generateMask(altMask, opts.mask);
+				return generateMask(altMask, opts.mask, opts);
 			} else opts.mask = opts.mask.pop();
 		}
 
 		if (opts.mask) {
 			if (opts.mask.mask !== undefined && !$.isFunction(opts.mask.mask)) {
-				ms = generateMask(preProcessMask(opts.mask.mask), opts.mask);
+				ms = generateMask(opts.mask.mask, opts.mask, opts);
 			} else {
-				ms = generateMask(preProcessMask(opts.mask), opts.mask);
+				ms = generateMask(opts.mask, opts.mask, opts);
 			}
 		}
 
 		return ms;
-	}
+	};
+
 
 	var ua = navigator.userAgent,
 		mobile = /mobile/i.test(ua),

+ 27 - 3
js/inputmask.phone.extensions.js

@@ -23,16 +23,40 @@
 			countrycode: "",
 			phoneCodes: [],
 			mask: function (opts) {
+				function consolidate() {
+					opts.regions = {
+						base: []
+					};
+
+					//split up in regions
+					$.each(opts.phoneCodes, function (ndx, phoneCode) {
+						var region = phoneCode.region;
+						if (region === undefined)
+							opts.regions.base.push(phoneCode);
+						else {
+							if (opts.regions[region] === undefined) {
+								opts.regions[region] = [];
+								opts.regions.base.push(phoneCode);
+								opts.regions[region].push(phoneCode);
+							} else {
+								opts.regions[region].push(phoneCode);
+							}
+						}
+					});
+				}
+
 				opts.definitions = {"#": opts.definitions["9"]};
+				// consolidate();
+				//do some sorting
 				var masks = opts.phoneCodes.sort(function (a, b) {
-					var maska = (a.mask || a).replace(/#/g, "9").replace(/[\+\(\)#-]/g, ""),
-						maskb = (b.mask || b).replace(/#/g, "9").replace(/[\+\(\)#-]/g, ""),
+					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));
 				});
-				//console.log(JSON.stringify(masks));
+				// console.log(JSON.stringify(masks));
 				return masks;
 			},
 			keepStatic: true,

+ 1 - 1
package.json

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