UNPKG

ilib

Version:

iLib is a cross-engine library of internationalization (i18n) classes written in pure JS

1 lines 5.89 kB
var ilib=require("./ilib.js");var Utils=require("./Utils.js");var JSUtils=require("./JSUtils.js");var Locale=require("./Locale.js");var PhoneNumber=require("./PhoneNumber.js");var NumberingPlan=require("./NumberingPlan.js");var PhoneLocale=require("./PhoneLocale.js");var ResBundle=require("./ResBundle.js");var PhoneGeoLocator=function(e){var t=true,n={},i=ilib.getLocale();if(e){if(e.locale){i=e.locale}if(typeof e.sync==="boolean"){t=e.sync}if(e.loadParams){n=e.loadParams}}new PhoneLocale({locale:i,mcc:e&&e.mcc,countryCode:e&&e.countryCode,sync:t,loadParams:n,onLoad:ilib.bind(this,function(i){this.locale=i;new NumberingPlan({locale:this.locale,sync:t,loadParams:n,onLoad:ilib.bind(this,function(i){this.plan=i;new ResBundle({locale:this.locale,name:"phoneres",sync:t,loadParams:n,onLoad:ilib.bind(this,function(i){this.rb=i;Utils.loadData({name:"iddarea.json",object:PhoneGeoLocator,nonlocale:true,sync:t,loadParams:n,callback:ilib.bind(this,function(i){this.regiondata=i;Utils.loadData({name:"area.json",object:PhoneGeoLocator,locale:this.locale,sync:t,loadParams:JSUtils.merge(n,{returnOne:true}),callback:ilib.bind(this,function(t){this.areadata=t;if(e&&typeof e.onLoad==="function"){e.onLoad(this)}})})})})})})})})})})};PhoneGeoLocator.prototype={_parseAreaAndSubscriber:function(e,t){var n,i,r,a,o="",s,l,c,g=14;if(!e||!t){return undefined}c=t;i=0;while(i<e.length){n=PhoneNumber._getCharacterCode(e.charAt(i));if(n>=0){a=c.s&&c.s[n];if(!a&&c.s&&c.s[g]){a=c.s[g]}if(typeof a==="object"){if(typeof a.l!=="undefined"){l=a;s=i}c=a;i++}else{if(typeof a==="undefined"||a===0){a=l;i=s}if(typeof a==="number"&&a||typeof a==="object"&&typeof a.l!=="undefined"){var u=typeof a==="number"?a:a.l;r=PhoneNumber._states[u];return r==="area"?e.substring(0,i+1):undefined}else{break}}}else if(n===-1){i++}else{i++}}return undefined},_matchPrefix:function(e,t){var n,i,r=[];if(t[e]){return t[e]}for(var a in t){if(a&&typeof a==="string"){n=0;i=false;while(n<a.length&&(a.charAt(n)===e.charAt(n)||a.charAt(n)===".")){if(a.charAt(n)==="."){i=true}n++}if(n>=a.length){if(i){r.push(a)}else{return t[a]}}}}if(r.length>0){r.sort(function(e,t){return t<e?-1:e<t?1:0});return t[r[0]]}return undefined},_getAreaInfo:function(e,t,n,i,r){var a=true,o={},s,l,c,g,u,d,h;if(r&&typeof r.sync==="boolean"){a=r.sync}h=e.areaCode||e.serviceCode;u=t;if(h!==undefined){if(i.getExtendedAreaCode()){d=h+e.subscriberNumber;d=d.replace(/[wWpPtT\+#\*]/g,"");Utils.loadData({name:"extarea.json",object:PhoneGeoLocator,locale:n,sync:a,loadParams:JSUtils.merge(r&&r.loadParams||{},{returnOne:true}),callback:ilib.bind(this,function(t){this.extarea=t;Utils.loadData({name:"extstates.json",object:PhoneGeoLocator,locale:n,sync:a,loadParams:JSUtils.merge(r&&r.loadParams||{},{returnOne:true}),callback:ilib.bind(this,function(t){this.extstates=t;u=this.extarea;if(this.extarea&&this.extstates){h=this._parseAreaAndSubscriber(d,this.extstates)}if(!h){u=this.areadata;h=e.areaCode||e.serviceCode}if(!i.fieldLengths||i.getFieldLength("maxLocalLength")===undefined||!e.subscriberNumber||e.subscriberNumber.length<=i.fieldLengths("maxLocalLength")){l=this._matchPrefix(h,u);if(l&&l.sn&&l.ln){o.area={sn:this.rb.getString(l.sn).toString(),ln:this.rb.getString(l.ln).toString()}}}})})})})}else if(!i||i.getFieldLength("maxLocalLength")===undefined||!e.subscriberNumber||e.subscriberNumber.length<=i.getFieldLength("maxLocalLength")){if(u){g=h.replace(/[wWpPtT\+#\*]/g,"");l=this._matchPrefix(g,u);if(l&&l.sn&&l.ln){o.area={sn:this.rb.getString(l.sn).toString(),ln:this.rb.getString(l.ln).toString()}}else if(e.serviceCode){o.area={sn:this.rb.getString("Service Number").toString(),ln:this.rb.getString("Service Number").toString()}}}else{s=e.locale._mapRegiontoCC(this.locale.getRegion());if(s!=="0"&&this.regiondata){c=this.regiondata[s];if(c&&c.sn){o.country={sn:this.rb.getString(c.sn).toString(),ln:this.rb.getString(c.ln).toString(),code:this.locale.getRegion()}}}}}else{s=e.locale._mapRegiontoCC(this.locale.getRegion());if(s!=="0"&&this.regiondata){c=this.regiondata[s];if(c&&c.sn){o.country={sn:this.rb.getString(c.sn).toString(),ln:this.rb.getString(c.ln).toString(),code:this.locale.getRegion()}}}}}else if(e.mobilePrefix){o.area={sn:this.rb.getString("Mobile Number").toString(),ln:this.rb.getString("Mobile Number").toString()}}else if(e.emergency){o.area={sn:this.rb.getString("Emergency Services Number").toString(),ln:this.rb.getString("Emergency Services Number").toString()}}return o},locate:function(e,t){var n={},i={},r,a,o,s,l,c=this.locale,g=true;if(e===undefined||typeof e!=="object"||!(e instanceof PhoneNumber)){return i}if(t){if(typeof t.sync!=="undefined"){g=t.sync==true}if(t.loadParams){n=t.loadParams}}r=this.locale.getRegion();if(e.countryCode!==undefined&&this.regiondata){a=e.countryCode.replace(/[wWpPtT\+#\*]/g,"");o=this.regiondata[a];c=e.destinationLocale;s=e.destinationPlan;i.country={sn:this.rb.getString(o.sn).toString(),ln:this.rb.getString(o.ln).toString(),code:c.getRegion()}}if(!s){s=this.plan}Utils.loadData({name:"area.json",object:PhoneGeoLocator,locale:c,sync:g,loadParams:JSUtils.merge(n,{returnOne:true}),callback:ilib.bind(this,function(n){if(n){this.areadata=n}l=this._getAreaInfo(e,this.areadata,c,s,t);i=JSUtils.merge(i,l);if(i.country===undefined){a=e.locale._mapRegiontoCC(r);if(a!=="0"&&this.regiondata){o=this.regiondata[a];if(o&&o.sn){i.country={sn:this.rb.getString(o.sn).toString(),ln:this.rb.getString(o.ln).toString(),code:this.locale.getRegion()}}}}})});return i},country:function(e){var t,n,i;if(!e||!(e instanceof PhoneNumber)){return""}i=e.locale;n=e.countryCode&&i._mapCCtoRegion(e.countryCode)||e.locale&&e.locale.region||i.locale.getRegion()||this.locale.getRegion();t=e.countryCode||i._mapRegiontoCC(n);if(e.areaCode){n=i._mapAreatoRegion(t,e.areaCode)}else if(t==="33"&&e.serviceCode){n=i._mapAreatoRegion(t,e.serviceCode)}return n}};module.exports=PhoneGeoLocator;