ilib
Version:
iLib is a cross-engine library of internationalization (i18n) classes written in pure JS
2 lines • 7.07 kB
JavaScript
// !data iddarea area extarea extstates phoneres
var ilib=require("./ilib.js"),Utils=require("./Utils.js"),JSUtils=require("./JSUtils.js"),PhoneNumber=require("./PhoneNumber.js"),NumberingPlan=require("./NumberingPlan.js"),PhoneLocale=require("./PhoneLocale.js"),ResBundle=require("./ResBundle.js"),PhoneGeoLocator=function(options){var sync=!0,loadParams={},locale=ilib.getLocale();options&&(options.locale&&(locale=options.locale),"boolean"==typeof options.sync&&(sync=options.sync),options.loadParams&&(loadParams=options.loadParams)),new PhoneLocale({locale:locale,mcc:options&&options.mcc,countryCode:options&&options.countryCode,sync:sync,loadParams:loadParams,onLoad:ilib.bind(this,function(loc){this.locale=loc,new NumberingPlan({locale:this.locale,sync:sync,loadParams:loadParams,onLoad:ilib.bind(this,function(plan){this.plan=plan,new ResBundle({locale:this.locale,name:"phoneres",sync:sync,loadParams:loadParams,onLoad:ilib.bind(this,function(rb){this.rb=rb,Utils.loadData({name:"iddarea.json",object:"PhoneGeoLocator",nonlocale:!0,sync:sync,loadParams:loadParams,callback:ilib.bind(this,function(data){this.regiondata=data,Utils.loadData({name:"area.json",object:"PhoneGeoLocator",locale:this.locale,sync:sync,loadParams:JSUtils.merge(loadParams,{returnOne:!0}),callback:ilib.bind(this,function(areadata){this.areadata=areadata,options&&"function"==typeof options.onLoad&&options.onLoad(this)})})})})})})})})})})};PhoneGeoLocator.prototype={_parseAreaAndSubscriber:function(number,stateTable){var ch,i,newState,consumed,lastLeaf,currentState;if(number&&stateTable)for(currentState=stateTable,i=0;i<number.length;)if(0<=(ch=PhoneNumber._getCharacterCode(number.charAt(i)))){if(!(newState=currentState.s&¤tState.s[ch])&¤tState.s&¤tState.s[14]&&(newState=currentState.s[14]),"object"!=typeof newState){if(void 0!==newState&&0!==newState||(newState=lastLeaf,i=consumed),"number"==typeof newState&&newState||"object"==typeof newState&&void 0!==newState.l){var stateNumber="number"==typeof newState?newState:newState.l;return"area"===PhoneNumber._states[stateNumber]?number.substring(0,i+1):void 0}break}void 0!==newState.l&&(lastLeaf=newState,consumed=i),currentState=newState,i++}else i++},_matchPrefix:function(prefix,table){var i,matchedDot,matchesWithDots=[];if(table[prefix])return table[prefix];for(var entry in table)if(entry&&"string"==typeof entry){for(i=0,matchedDot=!1;i<entry.length&&(entry.charAt(i)===prefix.charAt(i)||"."===entry.charAt(i));)"."===entry.charAt(i)&&(matchedDot=!0),i++;if(i>=entry.length){if(!matchedDot)return table[entry];matchesWithDots.push(entry)}}return 0<matchesWithDots.length?(matchesWithDots.sort(function(left,right){return right<left?-1:left<right?1:0}),table[matchesWithDots[0]]):void 0},_getAreaInfo:function(number,data,locale,plan,options){var countryCode,areaInfo,temp,areaCode,geoTable,tempNumber,prefix,sync=!0,ret={};return options&&"boolean"==typeof options.sync&&(sync=options.sync),prefix=number.areaCode||number.serviceCode,geoTable=data,void 0!==prefix?plan.getExtendedAreaCode()?(tempNumber=(tempNumber=prefix+number.subscriberNumber).replace(/[wWpPtT\+#\*]/g,""),Utils.loadData({name:"extarea.json",object:"PhoneGeoLocator",locale:locale,sync:sync,loadParams:JSUtils.merge(options&&options.loadParams||{},{returnOne:!0}),callback:ilib.bind(this,function(data){this.extarea=data,Utils.loadData({name:"extstates.json",object:"PhoneGeoLocator",locale:locale,sync:sync,loadParams:JSUtils.merge(options&&options.loadParams||{},{returnOne:!0}),callback:ilib.bind(this,function(data){this.extstates=data,geoTable=this.extarea,this.extarea&&this.extstates&&(prefix=this._parseAreaAndSubscriber(tempNumber,this.extstates)),prefix||(geoTable=this.areadata,prefix=number.areaCode||number.serviceCode),(!plan.fieldLengths||void 0===plan.getFieldLength("maxLocalLength")||!number.subscriberNumber||number.subscriberNumber.length<=plan.fieldLengths("maxLocalLength"))&&(areaInfo=this._matchPrefix(prefix,geoTable))&&areaInfo.sn&&areaInfo.ln&&(ret.area={sn:this.rb.getString(areaInfo.sn).toString(),ln:this.rb.getString(areaInfo.ln).toString()})})})})})):(!plan||void 0===plan.getFieldLength("maxLocalLength")||!number.subscriberNumber||number.subscriberNumber.length<=plan.getFieldLength("maxLocalLength"))&&geoTable?(areaCode=prefix.replace(/[wWpPtT\+#\*]/g,""),(areaInfo=this._matchPrefix(areaCode,geoTable))&&areaInfo.sn&&areaInfo.ln?ret.area={sn:this.rb.getString(areaInfo.sn).toString(),ln:this.rb.getString(areaInfo.ln).toString()}:number.serviceCode&&(ret.area={sn:this.rb.getString("Service Number").toString(),ln:this.rb.getString("Service Number").toString()})):"0"!==(countryCode=number.locale._mapRegiontoCC(this.locale.getRegion()))&&this.regiondata&&(temp=this.regiondata[countryCode])&&temp.sn&&(ret.country={sn:this.rb.getString(temp.sn).toString(),ln:this.rb.getString(temp.ln).toString(),code:this.locale.getRegion()}):number.mobilePrefix?ret.area={sn:this.rb.getString("Mobile Number").toString(),ln:this.rb.getString("Mobile Number").toString()}:number.emergency&&(ret.area={sn:this.rb.getString("Emergency Services Number").toString(),ln:this.rb.getString("Emergency Services Number").toString()}),ret},locate:function(number,options){var region,countryCode,temp,plan,areaResult,loadParams={},ret={},phoneLoc=this.locale,sync=!0;return void 0!==number&&"object"==typeof number&&number instanceof PhoneNumber&&(options&&(void 0!==options.sync&&(sync=!!options.sync),options.loadParams&&(loadParams=options.loadParams)),region=this.locale.getRegion(),void 0!==number.countryCode&&this.regiondata&&(countryCode=number.countryCode.replace(/[wWpPtT\+#\*]/g,""),temp=this.regiondata[countryCode],phoneLoc=number.destinationLocale,plan=number.destinationPlan,ret.country={sn:this.rb.getString(temp.sn).toString(),ln:this.rb.getString(temp.ln).toString(),code:phoneLoc.getRegion()}),plan||(plan=this.plan),Utils.loadData({name:"area.json",object:"PhoneGeoLocator",locale:phoneLoc,sync:sync,loadParams:JSUtils.merge(loadParams,{returnOne:!0}),callback:ilib.bind(this,function(areadata){areadata&&(this.areadata=areadata),areaResult=this._getAreaInfo(number,this.areadata,phoneLoc,plan,options),void 0===(ret=JSUtils.merge(ret,areaResult)).country&&"0"!==(countryCode=number.locale._mapRegiontoCC(region))&&this.regiondata&&(temp=this.regiondata[countryCode])&&temp.sn&&(ret.country={sn:this.rb.getString(temp.sn).toString(),ln:this.rb.getString(temp.ln).toString(),code:this.locale.getRegion()})})})),ret},country:function(number){var countryCode,region,phoneLoc;return number&&number instanceof PhoneNumber?(phoneLoc=number.locale,region=number.countryCode&&phoneLoc._mapCCtoRegion(number.countryCode)||number.locale&&number.locale.region||phoneLoc.locale.getRegion()||this.locale.getRegion(),countryCode=number.countryCode||phoneLoc._mapRegiontoCC(region),number.areaCode?region=phoneLoc._mapAreatoRegion(countryCode,number.areaCode):"33"===countryCode&&number.serviceCode&&(region=phoneLoc._mapAreatoRegion(countryCode,number.serviceCode)),region):""}},module.exports=PhoneGeoLocator;