(function(factory){if(typeof define==="function"&&define.amd){define(["jquery"],function($){factory($,window,document);});}else if(typeof module==="object"&&module.exports){module.exports=factory(require("jquery"),window,document);}else{factory(jQuery,window,document);}})(function($,window,document,undefined){"use strict";var pluginName="intlTelInput",id=1,defaults={allowDropdown:true,autoHideDialCode:true,autoPlaceholder:"polite",customPlaceholder:null,dropdownContainer:"",excludeCountries:[],formatOnDisplay:true,geoIpLookup:null,hiddenInput:"",initialCountry:"",nationalMode:true,onlyCountries:[],placeholderNumberType:"MOBILE",preferredCountries:["us","gb"],separateDialCode:false,utilsScript:""},keys={UP:38,DOWN:40,ENTER:13,ESC:27,PLUS:43,A:65,Z:90,SPACE:32,TAB:9},regionlessNanpNumbers=["800","822","833","844","855","866","877","880","881","882","883","884","885","886","887","888","889"];$(window).on("load",function(){$.fn[pluginName].windowLoaded=true;});function Plugin(element,options){this.telInput=$(element);this.options=$.extend({},defaults,options);this.ns="."+pluginName+id++;this.isGoodBrowser=Boolean(element.setSelectionRange);this.hadInitialPlaceholder=Boolean($(element).attr("placeholder"));} Plugin.prototype={_init:function(){if(this.options.nationalMode){this.options.autoHideDialCode=false;} if(this.options.separateDialCode){this.options.autoHideDialCode=this.options.nationalMode=false;} this.isMobile=/Android.+Mobile|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);if(this.isMobile){$("body").addClass("iti-mobile");if(!this.options.dropdownContainer){this.options.dropdownContainer="body";}} this.autoCountryDeferred=new $.Deferred();this.utilsScriptDeferred=new $.Deferred();this.selectedCountryData={};this._processCountryData();this._generateMarkup();this._setInitialState();this._initListeners();this._initRequests();return[this.autoCountryDeferred,this.utilsScriptDeferred];},_processCountryData:function(){this._processAllCountries();this._processCountryCodes();this._processPreferredCountries();},_addCountryCode:function(iso2,dialCode,priority){if(!(dialCode in this.countryCodes)){this.countryCodes[dialCode]=[];} var index=priority||0;this.countryCodes[dialCode][index]=iso2;},_processAllCountries:function(){if(this.options.onlyCountries.length){var lowerCaseOnlyCountries=this.options.onlyCountries.map(function(country){return country.toLowerCase();});this.countries=allCountries.filter(function(country){return lowerCaseOnlyCountries.indexOf(country.iso2)>-1;});this.countries.sort(this._countryNameSort);}else if(this.options.excludeCountries.length){var lowerCaseExcludeCountries=this.options.excludeCountries.map(function(country){return country.toLowerCase();});this.countries=allCountries.filter(function(country){return lowerCaseExcludeCountries.indexOf(country.iso2)===-1;});}else{this.countries=allCountries;}},_countryNameSort:function(a,b){return a.name.localeCompare(b.name);},_processCountryCodes:function(){this.countryCodes={};for(var i=0;i",{"class":parentClass}));this.flagsContainer=$("
",{"class":"flag-container"}).insertBefore(this.telInput);var selectedFlag=$("
",{"class":"selected-flag"});selectedFlag.appendTo(this.flagsContainer);this.selectedFlagInner=$("
",{"class":"iti-flag"}).appendTo(selectedFlag);if(this.options.separateDialCode){this.selectedDialCode=$("
",{"class":"selected-dial-code"}).appendTo(selectedFlag);} if(this.options.allowDropdown){selectedFlag.attr("tabindex","0");$("
",{"class":"iti-arrow"}).appendTo(selectedFlag);this.countryList=$("
    ",{"class":"country-list hide"});if(this.preferredCountries.length){this._appendListItems(this.preferredCountries,"preferred");$("
  • ",{"class":"divider"}).appendTo(this.countryList);} this._appendListItems(this.countries,"");this.countryListItems=this.countryList.children(".country");if(this.options.dropdownContainer){this.dropdown=$("
    ",{"class":"intl-tel-input iti-container"}).append(this.countryList);}else{this.countryList.appendTo(this.flagsContainer);}}else{this.countryListItems=$();} if(this.options.hiddenInput){this.hiddenInput=$("",{type:"hidden",name:this.options.hiddenInput}).insertAfter(this.telInput);}},_appendListItems:function(countries,className){var tmp="";for(var i=0;i";tmp+="
    ";tmp+=""+c.name+"";tmp+="+"+c.dialCode+"";tmp+="
  • ";} this.countryList.append(tmp);},_setInitialState:function(){var val=this.telInput.val();if(this._getDialCode(val)&&(!this._isRegionlessNanp(val)||this.options.nationalMode&&!this.options.initialCountry)){this._updateFlagFromNumber(val);}else if(this.options.initialCountry!=="auto"){if(this.options.initialCountry){this._setFlag(this.options.initialCountry.toLowerCase());}else{this.defaultCountry=this.preferredCountries.length?this.preferredCountries[0].iso2:this.countries[0].iso2;if(!val){this._setFlag(this.defaultCountry);}} if(!val&&!this.options.nationalMode&&!this.options.autoHideDialCode&&!this.options.separateDialCode){this.telInput.val("+"+this.selectedCountryData.dialCode);}} if(val){this._updateValFromNumber(val);}},_initListeners:function(){this._initKeyListeners();if(this.options.autoHideDialCode){this._initFocusListeners();} if(this.options.allowDropdown){this._initDropdownListeners();} if(this.hiddenInput){this._initHiddenInputListener();}},_initHiddenInputListener:function(){var that=this;this.telInput.keypress(function(event){that.hiddenInput.val(that.getNumber());});},_initDropdownListeners:function(){var that=this;var label=this.telInput.closest("label");if(label.length){label.on("click"+this.ns,function(e){if(that.countryList.hasClass("hide")){that.telInput.focus();}else{e.preventDefault();}});} var selectedFlag=this.selectedFlagInner.parent();selectedFlag.on("click"+this.ns,function(e){if(that.countryList.hasClass("hide")&&!that.telInput.prop("disabled")&&!that.telInput.prop("readonly")){that._showDropdown();}});this.flagsContainer.on("keydown"+that.ns,function(e){var isDropdownHidden=that.countryList.hasClass("hide");if(isDropdownHidden&&(e.which==keys.UP||e.which==keys.DOWN||e.which==keys.SPACE||e.which==keys.ENTER)){e.preventDefault();e.stopPropagation();that._showDropdown();} if(e.which==keys.TAB){that._closeDropdown();}});},_initRequests:function(){var that=this;if(this.options.utilsScript){if($.fn[pluginName].windowLoaded){$.fn[pluginName].loadUtils(this.options.utilsScript,this.utilsScriptDeferred);}else{$(window).on("load",function(){$.fn[pluginName].loadUtils(that.options.utilsScript,that.utilsScriptDeferred);});}}else{this.utilsScriptDeferred.resolve();} if(this.options.initialCountry==="auto"){this._loadAutoCountry();}else{this.autoCountryDeferred.resolve();}},_loadAutoCountry:function(){var that=this;if($.fn[pluginName].autoCountry){this.handleAutoCountry();}else if(!$.fn[pluginName].startedLoadingAutoCountry){$.fn[pluginName].startedLoadingAutoCountry=true;if(typeof this.options.geoIpLookup==="function"){this.options.geoIpLookup(function(countryCode){$.fn[pluginName].autoCountry=countryCode.toLowerCase();setTimeout(function(){$(".intl-tel-input input").intlTelInput("handleAutoCountry");});});}}},_initKeyListeners:function(){var that=this;this.telInput.on("keyup"+this.ns,function(){if(that._updateFlagFromNumber(that.telInput.val())){that._triggerCountryChange();}});this.telInput.on("cut"+this.ns+" paste"+this.ns,function(){setTimeout(function(){if(that._updateFlagFromNumber(that.telInput.val())){that._triggerCountryChange();}});});},_cap:function(number){var max=this.telInput.attr("maxlength");return max&&number.length>max?number.substr(0,max):number;},_initFocusListeners:function(){var that=this;this.telInput.on("mousedown"+this.ns,function(e){if(!that.telInput.is(":focus")&&!that.telInput.val()){e.preventDefault();that.telInput.focus();}});this.telInput.on("focus"+this.ns,function(e){if(!that.telInput.val()&&!that.telInput.prop("readonly")&&that.selectedCountryData.dialCode){that.telInput.val("+"+that.selectedCountryData.dialCode);that.telInput.one("keypress.plus"+that.ns,function(e){if(e.which==keys.PLUS){that.telInput.val("");}});setTimeout(function(){var input=that.telInput[0];if(that.isGoodBrowser){var len=that.telInput.val().length;input.setSelectionRange(len,len);}});}});var form=this.telInput.prop("form");if(form){$(form).on("submit"+this.ns,function(){that._removeEmptyDialCode();});} this.telInput.on("blur"+this.ns,function(){that._removeEmptyDialCode();});},_removeEmptyDialCode:function(){var value=this.telInput.val(),startsPlus=value.charAt(0)=="+";if(startsPlus){var numeric=this._getNumeric(value);if(!numeric||this.selectedCountryData.dialCode==numeric){this.telInput.val("");}} this.telInput.off("keypress.plus"+this.ns);},_getNumeric:function(s){return s.replace(/\D/g,"");},_showDropdown:function(){this._setDropdownPosition();var activeListItem=this.countryList.children(".active");if(activeListItem.length){this._highlightListItem(activeListItem);this._scrollTo(activeListItem);} this._bindDropdownListeners();this.selectedFlagInner.children(".iti-arrow").addClass("up");this.telInput.trigger("open:countrydropdown");},_setDropdownPosition:function(){var that=this;if(this.options.dropdownContainer){this.dropdown.appendTo(this.options.dropdownContainer);} this.dropdownHeight=this.countryList.removeClass("hide").outerHeight();if(!this.isMobile){var pos=this.telInput.offset(),inputTop=pos.top,windowTop=$(window).scrollTop(),dropdownFitsBelow=inputTop+this.telInput.outerHeight()+this.dropdownHeightwindowTop;this.countryList.toggleClass("dropup",!dropdownFitsBelow&&dropdownFitsAbove);if(this.options.dropdownContainer){var extraTop=!dropdownFitsBelow&&dropdownFitsAbove?0:this.telInput.innerHeight();this.dropdown.css({top:inputTop+extraTop,left:pos.left});$(window).on("scroll"+this.ns,function(){that._closeDropdown();});}}},_bindDropdownListeners:function(){var that=this;this.countryList.on("mouseover"+this.ns,".country",function(e){that._highlightListItem($(this));});this.countryList.on("click"+this.ns,".country",function(e){that._selectListItem($(this));});var isOpening=true;$("html").on("click"+this.ns,function(e){if(!isOpening){that._closeDropdown();} isOpening=false;});var query="",queryTimer=null;$(document).on("keydown"+this.ns,function(e){e.preventDefault();if(e.which==keys.UP||e.which==keys.DOWN){that._handleUpDownKey(e.which);}else if(e.which==keys.ENTER){that._handleEnterKey();}else if(e.which==keys.ESC){that._closeDropdown();}else if(e.which>=keys.A&&e.which<=keys.Z||e.which==keys.SPACE){if(queryTimer){clearTimeout(queryTimer);} query+=String.fromCharCode(e.which);that._searchForCountry(query);queryTimer=setTimeout(function(){query="";},1e3);}});},_handleUpDownKey:function(key){var current=this.countryList.children(".highlight").first();var next=key==keys.UP?current.prev():current.next();if(next.length){if(next.hasClass("divider")){next=key==keys.UP?next.prev():next.next();} this._highlightListItem(next);this._scrollTo(next);}},_handleEnterKey:function(){var currentCountry=this.countryList.children(".highlight").first();if(currentCountry.length){this._selectListItem(currentCountry);}},_searchForCountry:function(query){for(var i=0;i-1,isNanpAreaCode=dialCode=="+1"&&numeric.length>=4,nanpSelected=this.selectedCountryData.dialCode=="1";if(!(nanpSelected&&this._isRegionlessNanp(numeric))&&(!alreadySelected||isNanpAreaCode)){for(var j=0;j-1;} return false;},_highlightListItem:function(listItem){this.countryListItems.removeClass("highlight");listItem.addClass("highlight");},_getCountryData:function(countryCode,ignoreOnlyCountriesOption,allowFail){var countryList=ignoreOnlyCountriesOption?allCountries:this.countries;for(var i=0;icontainerBottom){if(middle){newScrollTop+=middleOffset;} var heightDifference=containerHeight-elementHeight;container.scrollTop(newScrollTop-heightDifference);}},_updateDialCode:function(newDialCode,hasSelectedListItem){var inputVal=this.telInput.val(),newNumber;newDialCode="+"+newDialCode;if(inputVal.charAt(0)=="+"){var prevDialCode=this._getDialCode(inputVal);if(prevDialCode){newNumber=inputVal.replace(prevDialCode,newDialCode);}else{newNumber=newDialCode;}}else if(this.options.nationalMode||this.options.separateDialCode){return;}else{if(inputVal){newNumber=newDialCode+inputVal;}else if(hasSelectedListItem||!this.options.autoHideDialCode){newNumber=newDialCode;}else{return;}} this.telInput.val(newNumber);},_getDialCode:function(number){var dialCode="";if(number.charAt(0)=="+"){var numericChars="";for(var i=0;i