(function ($) { var triggerMaskComplete = false; var phoneCodes = [ { mask: "+1(###)###-##-##", cc: ["US", "CA"], name_en: "USA and Canada", desc_en: "", name_ru: "США и Канада", desc_ru: "" }, { mask: "+1(246)###-####", cc: "BB", name_en: "Barbados", desc_en: "", name_ru: "Барбадос", desc_ru: "" }, { mask: "+30(6##)###-##-##", cc: "GR", name_en: "Greece", desc_en: "", name_ru: "Греция", desc_ru: "" }, { mask: "+31(##)###-##-##", cc: "NL", name_en: "Netherlands", desc_en: "", name_ru: "Нидерланды", desc_ru: "" }, { mask: "+32(###)###-###", cc: "BE", name_en: "Belgium", desc_en: "", name_ru: "Бельгия", desc_ru: "" }, { mask: "+33(###)###-###", cc: "FR", name_en: "France", desc_en: "", name_ru: "Франция", desc_ru: "" }, { mask: "+34(###)###-###", cc: "ES", name_en: "Spain", desc_en: "", name_ru: "Испания", desc_ru: "" }, { mask: "+350-5###-####", cc: "GI", name_en: "Gibraltar", desc_en: "", name_ru: "Гибралтар", desc_ru: "" }, { mask: "+351(9)####-####", cc: "PT", name_en: "Portugal", desc_en: "", name_ru: "Португалия", desc_ru: "" }, { mask: "+353(8#)###-##-##", cc: "IE", name_en: "Ireland", desc_en: "", name_ru: "Ирландия", desc_ru: "" }, { mask: "+354(###)####[#][#]", cc: "IS", name_en: "Iceland", desc_en: "", name_ru: "Исландия", desc_ru: "" }, { mask: "+355(###)###-###", cc: "AL", name_en: "Albania", desc_en: "", name_ru: "Албания", desc_ru: "" }, { mask: "+356(##)###-###", cc: "MT", name_en: "Malta", desc_en: "", name_ru: "Мальта", desc_ru: "" }, { mask: "+357(9#)###-###", cc: "CY", name_en: "Cyprus", desc_en: "", name_ru: "Кипр", desc_ru: "" }, { mask: "+358(###)###-##-#[#]", cc: "FI", name_en: "Finland", desc_en: "", name_ru: "Финляндия", desc_ru: "" }, { mask: "+359(##)###-###[#]", cc: "BG", name_en: "Bulgaria", desc_en: "", name_ru: "Болгария", desc_ru: "" }, { mask: "+36(##)###-##-##", cc: "HU", name_en: "Hungary", desc_en: "", name_ru: "Венгрия", desc_ru: "" }, { mask: "+370(###)##-###", cc: "LT", name_en: "Lithuania", desc_en: "", name_ru: "Литва", desc_ru: "" }, { mask: "+371-##-###-###", cc: "LV", name_en: "Latvia", desc_en: "", name_ru: "Латвия", desc_ru: "" }, { mask: "+372-####-####", cc: "EE", name_en: "Estonia ", desc_en: "", name_ru: "Эстония ", desc_ru: "" }, { mask: "+373-####-####", cc: "MD", name_en: "Moldova", desc_en: "", name_ru: "Молдова", desc_ru: "" }, { mask: "+374-##-###-###", cc: "AM", name_en: "Armenia", desc_en: "", name_ru: "Армения", desc_ru: "" }, { mask: "+375(##)###-##-##", cc: "BY", name_en: "Belarus", desc_en: "", name_ru: "Беларусь (Белоруссия)", desc_ru: "" }, { mask: "+376-##-##-##", cc: "AD", name_en: "Andorra", desc_en: "", name_ru: "Андорра", desc_ru: "" }, { mask: "+377-####-####", cc: "MC", name_en: "Monaco", desc_en: "", name_ru: "Монако", desc_ru: "" }, { mask: "+378(###)###-##-##", cc: "SM", name_en: "San Marino", desc_en: "", name_ru: "Сан-Марино", desc_ru: "" }, { mask: "+380(##)###-##-##", cc: "UA", name_en: "Ukraine", desc_en: "", name_ru: "Украина", desc_ru: "" }, { mask: "+381-##-###-####", cc: "RS", name_en: "Serbia", desc_en: "", name_ru: "Сербия", desc_ru: "" }, { mask: "+382(6#)###-###", cc: "ME", name_en: "Montenegro", desc_en: "", name_ru: "Черногория", desc_ru: "" }, { mask: "+385(9#)###-##-##", cc: "HR", name_en: "Croatia", desc_en: "", name_ru: "Хорватия", desc_ru: "" }, { mask: "+386(##)###-###", cc: "SI", name_en: "Slovenia", desc_en: "", name_ru: "Словения", desc_ru: "" }, { mask: "+387(##)###-###", cc: "BA", name_en: "Bosnia and Herzegovina", desc_en: "", name_ru: "Босния и Герцеговина", desc_ru: "" }, { mask: "+389(7#)###-###", cc: "MK", name_en: "Republic of Macedonia", desc_en: "", name_ru: "Македония", desc_ru: "" }, { mask: "+39(###)####-###", cc: "IT", name_en: "Italy", desc_en: "", name_ru: "Италия", desc_ru: "" }, { mask: "+40(7##)###-###", cc: "RO", name_en: "Romania", desc_en: "", name_ru: "Румыния", desc_ru: "" }, { mask: "+41(7#)###-##-##", cc: "CH", name_en: "Switzerland", desc_en: "", name_ru: "Швейцария", desc_ru: "" }, { mask: "+420(###)###-###", cc: "CZ", name_en: "Czech Republic", desc_en: "", name_ru: "Чехия", desc_ru: "" }, { mask: "+421(9##)###-###", cc: "SK", name_en: "Slovakia", desc_en: "", name_ru: "Словакия", desc_ru: "" }, { mask: "+423-###-####", cc: "LI", name_en: "Liechtenstein", desc_en: "", name_ru: "Лихтенштейн", desc_ru: "" }, { mask: "+43(6##)###-##-##", cc: "AT", name_en: "Austria", desc_en: "", name_ru: "Австрия", desc_ru: "" }, { mask: "+44(7###)###-###", cc: "UK", name_en: "United Kingdom", desc_en: "", name_ru: "Великобритания", desc_ru: "" }, { mask: "+45-####-####", cc: "DK", name_en: "Denmark", desc_en: "", name_ru: "Дания", desc_ru: "" }, { mask: "+46(7#)###-##-##", cc: "SE", name_en: "Sweden", desc_en: "", name_ru: "Швеция", desc_ru: "" }, { mask: "+47-####-####", cc: "NO", name_en: "Norway", desc_en: "", name_ru: "Норвегия", desc_ru: "" }, { mask: "+48(##)###-##-##", cc: "PL", name_en: "Poland", desc_en: "", name_ru: "Польша", desc_ru: "" }, { mask: "+49(####)###-###[#]", cc: "DE", name_en: "Germany", desc_en: "", name_ru: "Германия", desc_ru: "" }, { mask: "+52(1)###-###-##[#][#]", cc: "MX", name_en: "Mexico", desc_en: "", name_ru: "Мексика", desc_ru: "" }, { mask: "+61-#-####-####[#][#]", cc: "AU", name_en: "Australia", desc_en: "", name_ru: "Австралия", desc_ru: "" }, { mask: "+64-(###)-###-##[#][#]", cc: "NZ", name_en: "New Zealand", desc_en: "", name_ru: "Новая Зеландия", desc_ru: "" }, { mask: "+7 (###) ###-##-##", cc: "RU", name_en: "Russia", desc_en: "", name_ru: "Россия", desc_ru: "" }, { mask: "+7 (6##) ###-##-##", cc: "KZ", name_en: "Kazakhstan", desc_en: "", name_ru: "Казахстан", desc_ru: "" }, { mask: "+7 (7##) ###-##-##", cc: "KZ", name_en: "Kazakhstan", desc_en: "", name_ru: "Казахстан", desc_ru: "" }, // { mask: "+81(##)####-###[#]", cc: "JP", name_en: "Japan ", desc_en: "", name_ru: "Япония", desc_ru: "" }, // { mask: "+86(###)####-###[#]", cc: "CN", name_en: "China (PRC)", desc_en: "", name_ru: "КНР", desc_ru: "" }, { mask: "+90(5##)###-##-##", cc: "TR", name_en: "Turkey", desc_en: "", name_ru: "Турция", desc_ru: "" }, { mask: "+91(##)####-####", cc: "IN", name_en: "India", desc_en: "", name_ru: "Индия", desc_ru: "" }, { mask: "+966(5)-####-###[#]", cc: "SA", name_en: "Saudi Arabia ", desc_en: "", name_ru: "Саудовская Аравия", desc_ru: "" }, { mask: "+971(5#)###-###[#]", cc: "AE", name_en: "United Arab Emirates", desc_en: "", name_ru: "Объединенные Арабские Эмираты", desc_ru: "мобильные" }, { mask: "+972(5#)###-###[#]", cc: "IL", name_en: "Israel ", desc_en: "", name_ru: "Израиль", desc_ru: "" }, { mask: "+992-##-###-####", cc: "TJ", name_en: "Tajikistan", desc_en: "", name_ru: "Таджикистан", desc_ru: "" }, { mask: "+993-#-###-####", cc: "TM", name_en: "Turkmenistan", desc_en: "", name_ru: "Туркменистан", desc_ru: "" }, { mask: "+994-##-###-##-##", cc: "AZ", name_en: "Azerbaijan", desc_en: "", name_ru: "Азербайджан", desc_ru: "" }, { mask: "+995(###)###-###", cc: "GE", name_en: "Rep. of Georgia", desc_en: "", name_ru: "Грузия", desc_ru: "" }, { mask: "+996(###)##-##-##", cc: "KG", name_en: "Kyrgyzstan", desc_en: "", name_ru: "Киргизия", desc_ru: "" }, { mask: "+998-##-###-####", cc: "UZ", name_en: "Uzbekistan", desc_en: "", name_ru: "Узбекистан", desc_ru: "" } ]; var maskOptions = { inputmask: { definitions: { '#': { validator: "[0-9]", cardinality: 1 } }, showMaskOnHover: false, autoUnmask: true, oncomplete: function () { if (triggerMaskComplete) { $(this).trigger('abcpInputMobileMaskComplete'); triggerMaskComplete = false; } }, onBeforePaste: function (pastedValue, opts) { pastedValue = pastedValue ? pastedValue.replace(/[^\d]/g, '') : ''; var newValue = pastedValue; if (newValue && newValue.length == 11 && newValue[0] == '8' && $.inArray(newValue.substring(0,2) , ['81', '86'])) { pastedValue = '7' + newValue.substring(1); } return pastedValue; }, postValidation: function (buffer, currentResult) { if (buffer.length - 1 == currentResult.pos) { triggerMaskComplete = true; } return currentResult; }, onUnMask: function(maskedValue) { return maskedValue ? maskedValue.replace(/[^\d]/g, '') : maskedValue; }, greedy: false }, match: /[0-9]/, replace: '#', list: phoneCodes, listKey: "mask", onMaskChange: function(maskObj, determined) { if (determined) { var hint = maskObj.name_en; if (maskObj.desc_en && maskObj.desc_en != "") { hint += " (" + maskObj.desc_en + ")"; } $("#descr").html(hint); } else { $("#descr").html("Mask of input"); } } }; $.masksSort = function(maskList, defs, match, key) { maskList.sort(function (a, b) { var ia = 0, ib = 0; for (; (ia 0 || newMask.charAt(pos) != maskOpts.replace)); pos++) { if (newMask.charAt(pos) == maskOpts.replace) { startPos--; } } startPos = pos; for (; (pos < newMask.length && endPos > 0); pos++) { if (newMask.charAt(pos) == maskOpts.replace) { endPos--; } } endPos = pos; return { begin: startPos, end: endPos }; } var maskUnbind = function() { $(this).off(".inputmasks"); } var unbindOriginal = function() { events = $._data(this, "events"); var types = ["keydown", "keypress", "dragdrop", "drop", "setvalue", "reset", "cut", "blur"] var that = this; $.each(types, function(idx, evt_name) { $.each(that.inputmask.events[evt_name], function(evt_idx, evt_func) { $(that).off(evt_name, evt_func); }); }); } var runOriginal = function(event) { var that = this; $.each(this.inputmask.events[event.type], function(evt_idx, evt_func) { evt_func.call(that, event); }); } var maskBind = function() { $(this) .on("keydown.inputmasks", masksKeyDown) .on("keypress.inputmasks", masksKeyPress) // .on("paste.inputmasks", masksPaste) .on("dragdrop.inputmasks", masksPaste) .on("drop.inputmasks", masksPaste) .on("cut.inputmasks", masksPaste) .on("setvalue.inputmasks", masksChange) .on("blur.inputmasks", masksChange) .on("reset.inputmasks", masksChange); } var maskApply = function(match, newtext) { var maskOpts = this.inputmasks.options; if (match && (newtext !== undefined || match.mask != this.inputmasks.oldmatch.mask)) { var caretPos; if (newtext === undefined) { caretPos = caretApply.call(this, this.inputmasks.oldmatch.mask, match.mask, caret.call(this)); } else { if (this.inputmask) { this.inputmask.remove(); } this.value = newtext; } $(this).inputmask(match.mask, $.extend(true, maskOpts.inputmask, { insertMode: this.inputmasks.insertMode })); unbindOriginal.call(this); if (newtext === undefined) { caret.call(this, caretPos.begin, caretPos.end); } } this.inputmasks.oldmatch = match; maskOpts.onMaskChange.call(this, match.obj, match.determined); } var keyboardApply = function(e, text, insert) { var match = maskMatch.call(this, text); if (!match || match.obj != this.inputmasks.oldmatch.obj || match.determined != this.inputmasks.oldmatch.determined) { if (match) { if (insert) { maskApply.call(this, match); runOriginal.call(this, e); } else { runOriginal.call(this, e); maskApply.call(this, match); } } else { if (!insert || !this.inputmasks.insertMode) { maskInit.call(this, text); } } return false; } runOriginal.call(this, e); return true; } var masksKeyDown = function(e) { if (e.metaKey) { runOriginal.call(this, e); return true; } var maskOpts = this.inputmasks.options; e = e || window.event; var k = e.which || e.charCode || e.keyCode; if (k == 8 || k == 46 || (this.inputmasks.iphone && k == 127)) { // delete or backspace var text = this.inputmask._valueGet(); var caretPos = caret.call(this); if (caretPos.begin == caretPos.end) { var pos = caretPos.begin; do { if (k != 46) { // backspace pos--; } var chr = text.charAt(pos); text = text.substring(0, pos) + text.substring(pos+1); } while (pos>0 && pos0) { text = text.substr(0, text.length-1); match = maskMatch.call(this, text); } maskApply.call(this, match, text); } var maskStart = function() { var maskOpts = $.extend(true, { onMaskChange: $.noop }, maskOptions); var defs = {}; for (var def in maskOpts.inputmask.definitions) { var validator = maskOpts.inputmask.definitions[def].validator; switch (typeof validator) { case "string": defs[def] = new RegExp(validator); break; case "object": if ("test" in maskOpts.definitions[def].validator) { defs[def] = validator; } break; case "function": defs[def] = { test: validator }; break; } } maskOpts.inputmask.definitions[maskOpts.replace] = { validator: maskOpts.match.source, cardinality: 1 }; if (this.inputmasks) { $(this).inputmasks("remove"); } this.inputmasks = {} this.inputmasks.options = maskOpts; this.inputmasks.defs = defs; this.inputmasks.iphone = navigator.userAgent.match(/iphone/i) != null; this.inputmasks.oldmatch = false; this.inputmasks.placeholder = maskOpts.inputmask.placeholder || Inputmask.prototype.defaults.placeholder; this.inputmasks.insertMode = (maskOpts.inputmask.insertMode !== undefined) ? maskOpts.inputmask.insertMode : Inputmask.prototype.defaults.insertMode; maskInit.call(this); } $.fn.inputmasks = function(fn) { var $self = $(this); if ($self.length > 0 && !$self.ghostInput) { $self.off('copy'); var ghostInput = document.createElement('input'); ghostInput.style.opacity = 0; ghostInput.style.position = 'fixed'; document.body.appendChild(ghostInput); $self.__proto__.ghostInput = ghostInput; $self[0].addEventListener('copy', function(e) { e.preventDefault(); e.stopImmediatePropagation(); var start = $self[0].selectionStart; var end = $self[0].selectionEnd; var val = $self[0].inputmask.maskset.buffer .slice(start, end) .filter(function(item) { return /[0-9]/.test(item); }) .join(''); ghostInput.value = val; ghostInput.select(); document.execCommand('copy'); setTimeout(function () { $self.focus(); }, 0); // $self.selectRange(start, end); }); } switch (fn) { case "remove": maskUnbind.call(this); this.inputmasks = undefined; $(this).inputmask("remove"); break; case "isCompleted": var res = maskMatch.call(this[0], (this[0].inputmask && this[0].inputmask._valueGet()) || this[0].value); return (res && res.completed); default: this.each(function () { var maskValue = this.value; maskValue = maskValue ? maskValue.replace(/[^\d]/g, '') : ''; var newValue = maskValue; if (newValue && newValue.length == 11 && newValue[0] == '8' && $.inArray(newValue.substring(0,2) , ['81', '86'])) { maskValue = '7' + newValue.substring(1); } if (maskValue) { this.value = maskValue; } maskStart.call(this, fn); maskBind.call(this); }); return this; } } var maskList = $.masksSort(phoneCodes, ['#'], /[0-9]|#/, "mask"); })(jQuery);