|
|
@@ -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) {
|