inputmask.phone.extensions.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. Input Mask plugin extensions
  3. http://github.com/RobinHerbots/jquery.inputmask
  4. Copyright (c) 2010 - Robin Herbots
  5. Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
  6. Version: 0.0.0-dev
  7. Phone extension.
  8. */
  9. (function (factory) {
  10. if (typeof define === "function" && define.amd) {
  11. define(["./dependencyLibs/inputmask.dependencyLib", "./inputmask"], factory);
  12. } else if (typeof exports === "object") {
  13. module.exports = factory(require("./dependencyLibs/inputmask.dependencyLib"), require("./inputmask"));
  14. } else {
  15. factory(window.dependencyLib || jQuery, window.Inputmask);
  16. }
  17. }
  18. (function ($, Inputmask) {
  19. function maskSort(a, b) {
  20. var maska = (a.mask || a).replace(/#/g, "9").replace(/\)/, "9").replace(/[+()#-]/g, ""),
  21. maskb = (b.mask || b).replace(/#/g, "9").replace(/\)/, "9").replace(/[+()#-]/g, ""),
  22. maskas = (a.mask || a).split("#")[0],
  23. maskbs = (b.mask || b).split("#")[0];
  24. // return maskbs.indexOf(maskas) === 0 ? -1 : (maskas.indexOf(maskbs) === 0 ? 1 : maska.localeCompare(maskb));
  25. return maska.localeCompare(maskb);
  26. }
  27. var analyseMaskBase = Inputmask.prototype.analyseMask;
  28. Inputmask.prototype.analyseMask = function (mask, regexMask, opts) {
  29. var maskGroups = {};
  30. function reduceVariations(masks, previousVariation, previousmaskGroup) {
  31. previousVariation = previousVariation || "";
  32. previousmaskGroup = previousmaskGroup || maskGroups;
  33. if (previousVariation !== "") {
  34. previousmaskGroup[previousVariation] = {};
  35. }
  36. var variation = "", maskGroup = previousmaskGroup[previousVariation] || previousmaskGroup;
  37. for (var i = masks.length - 1; i >= 0; i--) {
  38. mask = masks[i].mask || masks[i];
  39. variation = mask.substr(0, 1);
  40. maskGroup[variation] = maskGroup[variation] || [];
  41. maskGroup[variation].unshift(mask.substr(1));
  42. masks.splice(i, 1);
  43. }
  44. for (var ndx in maskGroup) {
  45. if (maskGroup[ndx].length > 500) {
  46. reduceVariations(maskGroup[ndx].slice(), ndx, maskGroup);
  47. }
  48. }
  49. }
  50. function rebuild(maskGroup) {
  51. var mask = "", submasks = [];
  52. for (var ndx in maskGroup) {
  53. if ($.isArray(maskGroup[ndx])) {
  54. if (maskGroup[ndx].length === 1) {
  55. submasks.push(ndx + maskGroup[ndx]);
  56. }
  57. else {
  58. submasks.push(ndx + opts.groupmarker[0] + maskGroup[ndx].join(opts.groupmarker[1] + opts.alternatormarker + opts.groupmarker[0]) + opts.groupmarker[1]);
  59. }
  60. } else {
  61. submasks.push(ndx + rebuild(maskGroup[ndx]));
  62. }
  63. }
  64. if (submasks.length === 1) {
  65. mask += submasks[0];
  66. } else {
  67. mask += opts.groupmarker[0] + submasks.join(opts.groupmarker[1] + opts.alternatormarker + opts.groupmarker[0]) + opts.groupmarker[1];
  68. }
  69. return mask;
  70. }
  71. if (opts.phoneCodes) {
  72. if (opts.phoneCodes && opts.phoneCodes.length > 1000) {
  73. mask = mask.substr(1, mask.length - 2);
  74. reduceVariations(mask.split(opts.groupmarker[1] + opts.alternatormarker + opts.groupmarker[0]));
  75. mask = rebuild(maskGroups);
  76. }
  77. //escape 9 definition
  78. mask = mask.replace(/9/g, "\\9");
  79. }
  80. // console.log(mask);
  81. var mt = analyseMaskBase.call(this, mask, regexMask, opts);
  82. return mt;
  83. };
  84. Inputmask.extendAliases({
  85. "abstractphone": {
  86. groupmarker: ["<", ">"],
  87. countrycode: "",
  88. phoneCodes: [],
  89. mask: function (opts) {
  90. opts.definitions = {"#": Inputmask.prototype.definitions["9"]};
  91. var sorted = opts.phoneCodes.sort(maskSort);
  92. return sorted;
  93. },
  94. keepStatic: 3,
  95. onBeforeMask: function (value, opts) {
  96. var processedValue = value.replace(/^0{1,2}/, "").replace(/[\s]/g, "");
  97. if (processedValue.indexOf(opts.countrycode) > 1 || processedValue.indexOf(opts.countrycode) === -1) {
  98. processedValue = "+" + opts.countrycode + processedValue;
  99. }
  100. return processedValue;
  101. },
  102. onUnMask: function (maskedValue, unmaskedValue, opts) {
  103. var unmasked = maskedValue.replace(/[()#-]/g, "");
  104. return unmasked;
  105. },
  106. inputmode: "tel",
  107. }
  108. });
  109. return Inputmask;
  110. }));