﻿
function PhoneNumberManager()
{this.SortedDialCodes=null;this.SortedDialCodesString=null;this.Create=function(full,dc,nr)
{if(dc)
{dc=this.CleanNumber(dc,false);}
if(null!=full)
{full=this.CleanNumber(full,true);if(!dc||""==dc)
{dc=this.GetDialCode(full,false);}
if(""!=dc)
{nr=full.substr(dc.length);}}
else if(dc&&!this.IsValidDialCode(dc))
{dc="";}
if($un!=typeof(nr)&&""!=nr&&""!=dc)
{if(!needsTrailing0(dc,nr))
{nr=nr.replace(/^0/,"")}
var ex="-1";var ix=nr.indexOf("x");if(ix>-1)
{ex=nr.substr(ix+1);nr=nr.substr(0,ix);}
if(""!=nr)
{return new TelObj(dc,nr,ex);}}
return null;};this.FromSerialized=function(s)
{var dc,nr,ex="-1",ix_dc=s.indexOf("-"),ix_ex=s.indexOf("x");if(-1<ix_dc)
{dc=s.substr(0,ix_dc);if(this.IsValidDialCode(dc))
{if(-1<ix_ex)
{nr=s.substring(ix_dc+1,ix_ex);ex=s.substr(ix_ex+1);}
else
{nr=s.substr(ix_dc+1);}
if(3<nr.length)
{return new TelObj(dc,nr,ex);}}}
return null;};this.IsValidDialCode=function(dc)
{if(null==this.SortedDialCodesString)
{var l="|";for(var i=0,len=NrControlMgr.List.length;i<len;i++)
{l+=NrControlMgr.List[i].DialCode+"|";}
this.SortedDialCodesString=l;}
return this.SortedDialCodesString.indexOf("|"+dc+"|")>-1;};this.GetDialCode=function(nr)
{if(null==this.SortedDialCodes)
{this.SortedDialCodes=NrControlMgr.List.clone(true);this.SortedDialCodes.sort(NrControlMgr.SortByDCLength);}
for(var i=0,len=this.SortedDialCodes.length;i<len;i++)
{if(nr.substring(0,String(this.SortedDialCodes[i].DialCode).length)==String(this.SortedDialCodes[i].DialCode))
{return String(this.SortedDialCodes[i].DialCode);}}
return"";};this.CleanNumber=function(nr,ex)
{return filterNumbers(nr,ex).replace(/^00/,"").replace(/^\+/,"").trim();};this.IsTelObj=function(o)
{if(isObject(o))
{return o.constructor==new TelObj().constructor;}
return false;};this.GetPhoneByControl=function(f)
{var pr=this.GetPrivateData(f.Params);if(null!=pr)
{return new TelObj().CreatePrivate(pr.hash,pr.type,pr.mask);}
var nr=f.Number.value.trim();if(nr.startsWith("00")||nr.startsWith("+"))
{splitNumber(f);}
return $Tel.Create(null,f.Country.value.trim(),f.Number.value.trim());};this.GetPrivateData=function(p)
{if(p.isprivate)
{return{hash:p.privatehash,mask:p.privatemask,type:p.privatetype};}
return null;};this.ClearPrivateData=function(ctrl)
{var p=ctrl.Params;if(p.isprivate)
{ctrl.Number.value=ctrl.Number.value.replace(/(^[x]*)||([x]*$)/g,"");}
this.ClearPrivateParams(p);};this.ClearPrivateParams=function(p)
{if(p.isprivate)
{p.isprivate=false;delete p.privatehash;delete p.privatemask;delete p.privatetype;}};this.SetPrivateData=function(p,h,m,t)
{p.isprivate=true;p.privatehash=h;p.privatemask=m;p.privatetype=t;};}
function TelObj(dc,nr,ex)
{this.DialCode=dc;this.Number=nr;this.Extension=ex;this.Type=0;this.IsPrivate=false;this.PrivateHash=null;this.MaskedNumber="";}
TelObj.prototype={CreateHidden:function(nr)
{var tel=$Tel.FromSerialized(nr);if(null!=tel)
{this.DialCode=tel.DialCode;this.Number="xxxxxxxx";this.Extension="";this.IsPrivate=true;this.PrivateHash=tel.Serialize();this.Type=4;this.MaskedNumber=this.DialCode+"-"+this.Number;return this;}
return null;},CreatePrivate:function(hash,type,mask)
{mask=mask.replace(/\+/,"");this.IsPrivate=true;this.PrivateHash=hash;this.Type=type;this.MaskedNumber=mask;var ix_dc=mask.indexOf("-");if(-1<ix_dc)
{var dc=mask.substr(0,ix_dc);if($Tel.IsValidDialCode(dc))
{this.DialCode=dc;this.Number=mask.substr(ix_dc+1);this.Extension="";return this;}}
return null;},ToString:function(addplus)
{return(addplus?"+":"")+this.DialCode+this.Number+this.GetExtension();},Serialize:function(addprivatetype)
{if(this.IsPrivate)
{return this.PrivateHash+(addprivatetype?"|"+this.Type:"");}
return this.DialCode+"-"+this.Number+this.GetExtension();},GetExtension:function()
{return""!=this.Extension&&-1<this.Extension?"x"+this.Extension:"";},IsEqual:function(other)
{if(null==other)
{return false;}
if(this.constructor==other.constructor)
{other=other.Serialize(true);}
return other==this.Serialize(true);},Encrypt:function(addplus)
{if(!addplus)
{addplus=false;}
return CryptNumber(this.ToString(addplus));}};function NrControlManager()
{this.List=[];this.SharedDialCodeCountryList={};this.PreferredCountryList=[];if($un!=typeof(NrControlCountryList))
{this.AddRange(NrControlCountryList);}
this.DropDowns={all:null,source:null,destination:null};this.prefix={Country:'cou_',DialCode:'dc_',Number:'num_',Delete:'DeleteLink_'};this.GenerateTemplate=function()
{var root=create('div');root.className='nrcontrol';var _1=create('div'),_2=create('div'),_3=create('div');_1.className='countrylist';_2.className='dialcode';_3.className='number';root.appendChild(_1);root.appendChild(_2);root.appendChild(_3);var dc=create('input'),n=create('input'),a=create('a');_2.appendChild(dc);_2.appendChild($d.createTextNode($T('country')));_3.appendChild(n);_3.appendChild($d.createTextNode($T('area+phone')));_3.appendChild(a);a.appendChild($d.createTextNode($T('delete')));return root;};this.Template=this.GenerateTemplate();this.GetDropDown=function(type,custom)
{if(null==this.DropDowns[type])
{var customlist=null;if($un!=typeof custom&&null!=custom)
{customlist=[];for(var i=0,len=custom.length;i<len;i++)
{customlist.push(this.GetCountry(custom[i]));}}
this.FillDropDown(type,customlist);}
var s=this.DropDowns[type];if(null!=s)
{return s.cloneNode(true);}
return null;},this.CreateControl=function(name,typ,custom,nr,parent,replace,params)
{if("string"==typeof(parent))
{parent=el(parent);}
if(null==parent)
{return;}
if($un==typeof(params)||null==params)
{params={};}
if($un==typeof(params.showdelete))
{params.showdelete=false;}
var struct=this.Template.cloneNode(true);var type='custom'==typ?typ+'_'+custom.join('_'):typ;struct.firstChild.appendChild(this.GetDropDown(type,custom));var f=this.GetFields(struct);f.Params=params;f.Country.name=f.Country.id=this.prefix.Country+name;f.DialCode.name=f.DialCode.id=this.prefix.DialCode+name;f.Number.name=f.Number.id=this.prefix.Number+name;f.Delete.href='#';f.Delete.id=this.prefix.Delete+name;if(params.deleteclick)
{AttachEvent(f.Delete,'click',function(e){params.deleteclick();preventDefaultEvent(e);return false;});}
else
{AttachEvent(f.Delete,'click',function(e){DestMgr.Remove(f.Container);CallMgr.CalcRate();preventDefaultEvent(e);return false;});}
if(!params.showdelete)
{f.Delete.style.display="none";}
f.DialCode.maxLength=7;f.Number.maxLength=25;f.DialCode.autocomplete='off';f.Number.autocomplete='off';var cn="_Controls";f.Container[cn]=f.Country[cn]=f.DialCode[cn]=f.Number[cn]=f;if(f.Country.options.length<2)
{f.Country.className='disabled';f.Country.disabled=true;f.DialCode.className='disabled';f.DialCode.readOnly=true;if(params.locked)
{f.Number.className='disabled';f.Number.readOnly=true;}}
else
{AttachEvent(f.Country,'change',function(){onCountryChanged(f);});AttachEvent(f.Country,'keyup',function(){onCountryChanged(f);});AttachEvent(f.Country,'focus',focusHandler);AttachEvent(f.Number,'focus',focusHandler);AttachEvent(f.DialCode,'focus',focusHandler);AttachEvent(f.DialCode,'blur',function(){onDialCodeChanged(f,true,true);});var fnc=function(e)
{return onDialCodeKeyDown(f,e);};AttachEvent(f.DialCode,'keypress',fnc);AttachEvent(f.DialCode,'keyup',fnc);}
if(params.autocomplete)
{PrepareTypeAhead(f.Number,{IsNrControl:true,SearchType:params.searchtype});f.Number.className+=' typeahead';}
AttachEvent(f.Number,'change',function(){splitNumber(f);});AttachEvent(f.Number,'keypress',function(e){return onlyDigits(fixE(e),f.Number,true,true)});if(params.onchange)
{var oc=function()
{var f=eval(params.onchange);if("function"==typeof(f))
{f.apply(CallMgr,[]);}};AttachEvent(f.Country,'change',oc);AttachEvent(f.DialCode,'change',oc);AttachEvent(f.Number,'change',oc);}
if(null!=nr)
{if(params.isprivate)
{var p=$Tel.GetPrivateData(params);nr=new TelObj().CreatePrivate(p.hash,p.type,p.mask)}
if("string"==typeof(nr)&&""!=nr)
{f.Number.value=nr;splitNumber(f);}
else if($Tel.IsTelObj(nr))
{f.Country.value=nr.DialCode;f.DialCode.value="+"+nr.DialCode;f.Number.value=nr.Number+nr.GetExtension();}}
if(replace)
{parent.innerHTML='';}
parent.appendChild(struct);return f;};this.GetCountry=function(dc)
{var l=[this.PreferredCountryList,this.List];for(var i=0;i<l.length;i++)
{for(var j=0,len=l[i].length;j<len;j++)
{if(dc==l[i][j].DialCode)
{return l[i][j];}}}
return null;};this.GetFields=function(o)
{return{Container:o,Country:o.firstChild.firstChild,DialCode:o.childNodes[1].firstChild,Number:o.childNodes[2].firstChild,Delete:o.childNodes[2].childNodes[2]};};this.GetTel=function(n,f)
{if($un==typeof(f)||!isObject(f))
{var c=el(this.prefix.Country+n);if(null!=c)
{f=c["_Controls"];}}
if(null!=f)
{if(f.Params)
{if(f.Params.isprivate)
{var p=$Tel.GetPrivateData(f.Params);if(null==p)
{return null;}
return new TelObj().CreatePrivate(p.hash,p.type,p.mask);}}
return $Tel.Create(null,f.Country.value.trim(),f.Number.value.trim());}
return null;};this.Updated=false;this.UpdateCountries=function()
{var clist=[];for(var i=0,len=this.List.length;i<len;i++)
{if(this.List[i].SortOrder>0)
{this.PreferredCountryList.push(this.List[i]);}
if(clist.hasKey('_'+this.List[i].DialCode))
{var c2=this.List[i],c1=clist['_'+c2.DialCode];this.SharedDialCodeCountryList['_'+c1.Id]=c1.Name+' & '+c2.Name;this.SharedDialCodeCountryList['_'+c2.Id]=c2.Name+' & '+c1.Name;}
else
{clist['_'+this.List[i].DialCode]=this.List[i];}}
this.PreferredCountryList.sort(this.SortPreferred);this.Updated=true;};this.SortPreferred=function(a,b)
{return b.SortOrder-a.SortOrder;};this.SortByDCLength=function(a,b)
{return String(b.DialCode).length-String(a.DialCode).length;};this.AddRange=function(arr)
{for(var i=0,len=arr.length;i<len;i++)
{var a=arr[i];if(a[2]>0)
{this.Add(a[0],a[1],a[2],a[3]);}}};this.Add=function(name,id,dc,sort)
{this.List.push({Name:name,Id:id,DialCode:dc,SortOrder:sort});};this.CreateDropDown=function(type,key,custom,grouping)
{var s=create("SELECT"),list=custom||this.List,valid=this.GetValidCountryList(type,list);if(list.length>1)
{s.options[0]=new Option($T('country.choose'),'');}
if(-1==type.indexOf('custom'))
{var pre=this.PreferredCountryList;for(var i=0,len=pre.length;i<len;i++)
{s.options[s.options.length]=new Option(grouping?this.GetFixedName(pre[i]):pre[i].Name,pre[i][key]);}
s.options[s.options.length]=new Option('------------------------------------------------------','');}
for(var i=0,len=valid.length;i<len;i++)
{s.options[s.options.length]=new Option(grouping?this.GetFixedName(valid[i]):valid[i].Name,valid[i][key]);}
return s;};this.FillDropDown=function(type,custom)
{this.DropDowns[type]=this.CreateDropDown(type,"DialCode",custom,true);};this.GetValidCountryList=function(type,list)
{if(!this.Updated)
{this.UpdateCountries();}
if($un==typeof(list))
{list=this.List;}
else if(type.indexOf('custom')>-1)
{return list;}
var res=[];for(var i=0,len=list.length;i<len;i++)
{if('all'==type||('source'==type&&!BlockedDialCodes.AsSource.contains(list[i].DialCode))||('destination'==type&&!BlockedDialCodes.AsDestination.contains(list[i].DialCode)))
{res.push(list[i]);}}
return res;};this.GetFixedName=function(c)
{return this.CountryHasSharedDialCode(c.Id)?this.SharedDialCodeCountryList['_'+c.Id]:c.Name;};this.CountryHasSharedDialCode=function(id)
{return this.SharedDialCodeCountryList.hasKey('_'+id);}}
function filterNumbers(s,ex)
{if(!ex)
{return s.replace(/[^+0-9]/gi,"");}
return s.replace(/[^+0-9x]/gi,"");}
function onCountryChanged(ctrl)
{var c=ctrl.Country,dc=ctrl.DialCode;$Tel.ClearPrivateData(ctrl);dc.value=(c.value!=""?"+":"")+c.value;if(""==c.value&&c.selectedIndex>0)
{c.selectedIndex=0;}}
function onDialCodeChanged(ctrl,r,clean)
{cleardctimer();var d=ctrl.DialCode,c=ctrl.Country,s=d.value.trim().replace(/\+/g,"").replace(/^00/g,"");$Tel.ClearPrivateData(ctrl);if(""!=s&&setCountry(c,s))
{if(clean)
{cleanDialCode(d);}
return;}
c.selectedIndex=0;c[0].text=(""==s||!r)?chooseC:unknownDC;}
function onDialCodeKeyDown(ctrl,ev)
{cleardctimer();dctimer=onDialCodeChanged.delay(100,this,ctrl,false,false);return onlyDigits(ev,ctrl.DialCode,true);}
function cleardctimer()
{if($un!=typeof dctimer&&null!=dctimer)
{window.clearTimeout(dctimer);}
dctimer=null;}
function cleanDialCode(d)
{d.value=""!=d.value.trim().replace(/\+/g,"").replace(/^00/g,"")?"+"+d.value.trim().replace(/\+/g,"").replace(/^00/g,""):"";}
function setCountry(o,code)
{o.value=code;return o.selectedIndex>-1&&o[o.selectedIndex].value==code;}
function splitNumber(ctrl)
{var c=ctrl.Country,d=ctrl.DialCode,n=ctrl.Number,p=ctrl.Params;$Tel.ClearPrivateData(ctrl);n.value=filterNumbers(n.value,true);if(n.value.substring(0,1)!="+"&&n.value.substring(0,2)!="00")
{return;}
var num=n.value.replace(/\+/,"").replace(/^00/,"");if(d.readOnly)
{if(c.value==num.substr(0,c.value.length))
{n.value=num.substr(c.value.length);d.value='+'+c.value;}
return;}
for(var i=num.length;i>0;i--)
{if(setCountry(c,num.substr(0,i)))
{n.value=num.substr(i);d.value="+"+c.value;return;}}
d.value="";c.selectedIndex=0;c[0].text=chooseC;}
function getNumber(d,n)
{d=el(d);n=el(n);if(null==d||null==n)
{return"";}
var dc=filterNumbers(d.value);var nr=filterNumbers(n.value);if(""==dc||""==nr)
{return"";}
return"+"+remTrailing0(d.value.replace(/\+/g,""),n.value);}
function remTrailing0(d,n)
{d=d.replace(/\+/g,"");if(needsTrailing0(d,n))
{return d+n;}
return d+n.replace(/^0/,"");}
function needsTrailing0(d,n)
{for(var i=0;i<specialDC.length;i++)
{if(specialDC[i]==d)
{return true;}}
if(d==7&&n.startsWith("095"))
{return true;}
return false}
function focusHandler(ev)
{if(this.pageFocusHandler)
this.pageFocusHandler(ev);}