var CacheCCOptions;
var CCDropDownFocused	= new Array();
var CCDropDownCode		= new String('');
var MinimumNumberLength	= 5;

var trapRequestTimeOut	= 500;
var trapRequestIterationLimit	= 10;

var messages	= new Array;

var CacheNames	= new Array;
var CacheRates	= new Array;
var CacheCountries	= new Array;

var EACacheUpdate	= new String();

var SessionExpired	= false;

var request_scheduled	= new Array();
request_scheduled[1]	= false;
request_scheduled[2]	= false;
request_scheduled[11]	= false;
request_scheduled[12]	= false;
request_scheduled[13]	= false;

var path_img		= '/webcall/img/';
var preload_imgs	= new Array('progress.gif','callbuttondisabled.gif');

var Contacts	= new Array();
var Numbers		= new Array();
var NumbersHash	= new Array(); // associative array key:number w/o dashes, value - id_contact


function cc_dropdown(selector,visible,manual){ // show/hide combo box for selecting country codes
	
	if (manual == null) manual = false;

	cc_value	= getValue('cc_'+selector);
	id_div		= 'div_cc_dropdown_'+selector;
	id_edit		= 'cc_'+selector;

	if (manual) setFocused(id_edit);

	if (visible){

		if (!isVisible(id_div)){

			setContent(id_div,getCCDropDown(selector));
			CCDropDownFocused[selector]	= false;
	
			//if (!CacheCCOptions){
				CacheCCOptions	= new Array;
				id_dropdown	= 'dropdown_cc_'+selector;
		
				if ((dropdown=findObject(id_dropdown))!=null){
					for(i=0;i<dropdown.options.length;i+=1){
						CacheCCOptions[dropdown.options[i].value]	= dropdown.options[i];
					}
				}
			//}

			toggleDisplay(id_div, visible);
		}


		cc_onChange(selector);

	} else {

		if (CCDropDownFocused[selector] != true){
			toggleDisplay(id_div, visible);
		}

	}


}

function cc_onChange(selector){ // onkeyup of input.cc

	id_div	= 'div_cc_dropdown_'+selector;
	id_dropdown	= 'dropdown_cc_'+selector;
	id_edit	= 'cc_'+selector;
	id_num_edit	= 'num_'+selector;

	if (isVisible(id_div)){

		cc_value	= removeNonDigits(getValue(id_edit));

		if (cc_value != ''){

			if ((dropdown=findObject(id_dropdown))!=null){

				if (CacheCCOptions[cc_value]){
					CacheCCOptions[cc_value].selected	= true;
				} else {
					cc_value_truncated	= cc_value.substring(0,cc_value.length-1);
					if (CacheCCOptions[cc_value_truncated]){
						CacheCCOptions[cc_value_truncated].selected	= true;
					} else {
						cc_value_truncated	= cc_value.substring(0,cc_value.length-2);
						if (CacheCCOptions[cc_value_truncated]){
							CacheCCOptions[cc_value_truncated].selected	= true;
						}
					}

				}

			}

		} else {
			if ((dropdown=findObject(id_dropdown))!=null){
				dropdown.options[0].selected=true;
			}

		}
		
	}

	num_onChange(selector,false);

}

function cc_dropdown_select(selector){

	id_dropdown	= 'dropdown_cc_'+selector;
	cc_value	= String(getValue(id_dropdown));

	cc_value	= cc_value.replace(/^\**/g,"");

	id_edit	= 'cc_'+selector;

	if (cc_value){
		setValue(id_edit,'+'+cc_value);
	}

	setFocused('num_'+selector);

}

function getCCDropDown(selector,include_observers){

	if (include_observers == null) include_observers	= true;

	var r	= "<select id=dropdown_cc_"+selector+" name=select_cc_"+selector+" class=country_code_selector ";
	if (include_observers) r	+= " onfocus='CCDropDownFocused["+selector+"]=true;' onblur='CCDropDownFocused["+selector+"]=false;cc_dropdown("+selector+",false);'  onChange='cc_dropdown_select("+selector+");'";
	
	r	+= ">";
	r	+= "<option value=''>Select a country...</option>";

	if (CCDropDownCode == ''){
		for (var i in CCode){
			code	= i.replace(/^\**/g,"");
			CCDropDownCode	= CCDropDownCode + "<option value="+i+"> "+CCode[i] +" (+"+code+")"+"</option>";
		}
	}

	r	= r + CCDropDownCode;
	r	= r + "</select>";
	
	return r;
}

function getPhoneNumber(selector){
	var k, cc,num;

	if (((cc=findObject('cc_'+selector))!=null) && ((num=findObject('num_'+selector))!=null)){
		return removeNonDigits(cc.value + num.value);
	} else return '';

}

function num_onChange(selector,immediate){
	// immediate: boolean

	if (immediate){ // this should be at the very beginning
		request_scheduled[selector]	= false;
	}

	if (selector ==  null) return;
	var immediate	= (immediate == null)?false:immediate;

	var delay_show_country	= 2000;

	if (immediate){

		LastRequest_FromPrefix	= '';
		LastRequest_FromDivID	= '';

		requestLocation(selector);
		requestContactName(selector);
		requestRate();

	} else {

		if (request_scheduled[selector] ==  false){
			setTimeout("num_onChange("+selector+",true)", delay_show_country);
			request_scheduled[selector]	= true;
		}
		
	}

}

function showContactList(){

	if (!objectExists('contact_list')) return;


	var Output	= '<table width=100% class=cl_list>';
		Output	+= '<tr><td class=header width=40% colspan=2 style="border-left:none;">Name</td><td class=header width=20%>Home Phone</td><td class=header width=20%>Work Phone</td><td class=header width=20% style="border-right:none;">Mobile Phone</td></tr>';

	var x;

	var num_home;
	var num_work;
	var num_mobile;

	var contacts_count	= 0;

	for (var i in Contacts){

		if (i == 1){
			continue;
		}

		contacts_count++;

		i	= String(i);

		num_home	= String(Numbers[i][0]);
		num_work	= String(Numbers[i][1]);
		num_mobile	= String(Numbers[i][2]);

		num_home_s		= formatNumberHuman(num_home);
		num_work_s		= formatNumberHuman(num_work);
		num_mobile_s	= formatNumberHuman(num_mobile);

		if (num_home)
			actionClickName	= 'setDestinationNumber(\''+num_home+'\');';
		else if (num_work)
			actionClickName	= 'setDestinationNumber(\''+num_work+'\');';
		else if (num_mobile)
			actionClickName	= 'setDestinationNumber(\''+num_mobile+'\');';
		else
			actionClickName	= 'editContact(\''+i+'\');';


		Output	+= '<tr><td class=name width=35% style="border-left:none;">'+(!cm?'<a href="#" onclick="'+actionClickName+'">':'')+Contacts[i]+(!cm?'</a>':'')+'</td>';

		Output	+= '<td class=editdelete width=5%><a href="#" onclick="'+'editContact(\''+i+'\');'+'">Edit</a>&nbsp;&nbsp;<a href="#" onclick=deleteContact("'+i+'")>Delete</a></td>';


		if (num_home)
			Output	+= '<td>'+(!cm?'<a href="#" onclick="setDestinationNumber(\''+num_home+'\')">':'')+num_home_s+(!cm?'</a>':'')+'</td>';
		else
			Output	+= '<td><a href="#" onclick=editContact("'+i+'") class=add_number>add</a></td>';

		if (num_work)
			Output	+= '<td>'+(!cm?'<a href="#" onclick=setDestinationNumber("'+num_work+'")>':'')+num_work_s+(!cm?'</a>':'')+'</td>';
		else
			Output	+= '<td><a href="#" onclick=editContact("'+i+'") class=add_number>add</a></td>';

		if (num_mobile)
			Output	+= '<td style="border-right:none;">'+(!cm?'<a href="#" onclick=setDestinationNumber("'+num_mobile+'")>':'')+num_mobile_s+(!cm?'</a>':'')+'</td>';
		else
			Output	+= '<td style="border-right:none;"><a href="#" onclick=editContact("'+i+'") class=add_number>add</a></td>';

	}

	if (contacts_count == 0){
		Output	+= '<tr><td colspan=5 style="padding:15px;text-align:center;">No contacts added yet<div style="height:5px"></div>';
		if (idPIN) Output	+= '<input type=button class=cl_button style="width: 120px" value="Add Contact" onclick="addContact()">';
		Output	+= '</td></tr>';
	}
	
	Output	+= '<table>';

	setContent('contact_list',Output);

	return false;

}

function showMyNumbers(){

	if (!objectExists('my_numbers_content')) return;


	Output	= '';
	Output	+=	 '<table class=form width=100%>';

	if (Numbers[1][0]) {
		number	= formatNumberHuman(Numbers[1][0]);
		Output	+= '<tr>';
		Output	+= '<td class=home_icon></td><td class=my_numer_caption>';
		Output	+= '<a href=# onclick=setOriginationNumber("'+Numbers[1][0]+'") class="nodecoration">'+showAsMy(0)+'</a></td></tr>';
	}

	if (Numbers[1][1]){
		number	= formatNumberHuman(Numbers[1][1]);
		Output	+= '<tr>';
		Output	+= '<td class=work_icon></td><td class=my_numer_caption>';
		Output	+= '<a href=# onclick=setOriginationNumber("'+Numbers[1][1]+'") class="nodecoration">'+showAsMy(1)+'</a></td></tr>';
	}

	if (Numbers[1][2]){
		number	= formatNumberHuman(Numbers[1][2]);
		Output	+= '<tr>';
		Output	+= '<td class=mobile_icon></td><td class=my_numer_caption>';
		Output	+= '<a href=# onclick=setOriginationNumber("'+Numbers[1][2]+'") class="nodecoration">'+showAsMy(2)+'</a></td></tr>';
	}

	Output	+= '<tr><td colspan=3><a href=# onclick=editContact(1) class=small>Edit my numbers</a></td></tr>';
	Output	+= '</table>';
		
	setContent('my_numbers_content',Output);

}

function showSaveNumber(number1,number2){

	number1	= removeNonDigits(number1);

	if (number1 == null) return;
	if (number2 == null) number2='';

	if (id_user	= NumbersHash[number1]){
		setTimeout("editContact("+id_user+");",100);
		return;
	}

	SelectContacts	= '<select id=saveNumberIDContact onchange="saveNumberSelectExisted()">';
	for (var i in Contacts){
		if (cm && i==1) continue;
		SelectContacts	+= '<option value='+i+'>'+Contacts[i];
	}

	output	 = '<center><table class=form >';
	output	+= '<tr><td class=header colspan=4>Save Number</td></tr>';
	output	+= '';

	output	+= '<tr><td colspan=4 height=15></td></tr>';
	output	+= '<tr><td class=caption_left>Number:</td><td></td><td colspan=3 class=number>'+formatNumberHuman(number1)+'<div class=hidden id=saveNumberNumber>'+number1+'</div></td>';
	output	+= '<tr><td colspan=4 height=15></td></tr>';
	output	+= '<tr><td class=caption_left>Contact:</td>';
	output	+= '<td><input type=radio name=newexisted id=saveNumberExisted checked onchange="saveNumberSelectExisted()"></td>';
	output	+= '<td colspan=2><div onclick="saveNumberSelectExisted()">Existed Contact</div></td></tr>';
	output	+= '<tr><td></td><td></td><td colspan=2>'+SelectContacts+'</td></tr>';
	output	+= '<tr><td></td><td><input type=radio name=newexisted id=saveNumberNew onchange="saveNumberSelectNew()"></td>';
	output	+= '<td colspan=2><div onclick="saveNumberSelectNew()">New Contact</div></td></tr>';
	output	+= '<tr><td></td><td></td><td colspan=2><input type=text class=name_contact id=saveNumberName style="width:200px;" onfocus="saveNumberSelectNew()"></td></tr>';
	output	+= '<tr><td colspan=2></td><td colspan=2 class=caption_bottom_small>(type contact'+"'"+'s name here)</td></tr>';
	output	+= '<tr><td colspan=4 height=15></td></tr>';
	output	+= '<tr><td class=caption_left>Save As:</td>';
	output	+= '<td><input type=radio name=num_type id=saveNumberAsHome value=0></td>';
	output	+= '<td class=home_icon></td><td><div id=saveNumberHome onclick="markChecked(\'saveNumberAsHome\')"></div></td></tr>';
	output	+= '<tr><td></td><td><input type=radio name=num_type id=saveNumberAsWork value=1></td><td class=work_icon></td><td><div id=saveNumberWork onclick="markChecked(\'saveNumberAsWork\')"></div></td></tr>';
	output	+= '<tr><td></td><td><input type=radio name=num_type id=saveNumberAsMobile value=2></td><td class=mobile_icon></td><td><div id=saveNumberMobile onclick="markChecked(\'saveNumberAsMobile\')"></div></td></tr>';

	output	+= '<tr><td colspan=5 class=buttons>';

	output	+= '<input type=button id=submit_edit_contact value="Save" onclick="doSaveNumber(\''+number2+'\')" class=button>&nbsp;';
	output	+= '<input type=button id=cancel_edit_contact value="Skip" onclick="doSkipNumber(\''+number2+'\')" class=button>';
	output	+= '</td></tr>';
	output	+= '</table></center>';


	showModalDialog();
	clearContent('form');
	setContent('form',output);
	saveNumberSelectExisted();

}

function doSaveNumber(onCompleteSaveNumber){
	if (!ValidateSaveNumber()) return;

	number		= getContent('saveNumberNumber');

	var params	= new Array();
	params['url']			= 'edit.php?cmd=edit&idu='+idUser;

	if (String(onCompleteSaveNumber).length > 0)
		params['onload']	= 'showSaveNumber('+quote(onCompleteSaveNumber)+');'; // we have one more number to save
	else 
		params['onload']	= 'closeModalDialog();requestContacts();'; // no numbers to save after saving this number, refresh screen after

	if (getChecked('saveNumberExisted')){ // Existed
		id_contact	= getValue('saveNumberIDContact');
		old_name	= Contacts[id_contact];
		params['url']	+= '&idc='+encodeURIComponent(id_contact)+'&oln='+encodeURIComponent(old_name);
	} else {
		new_name	= getValue('saveNumberName');
		params['url']	+= '&idc=-1&nwn='+encodeURIComponent(new_name);
	}

	if (getChecked('saveNumberAsHome')) params['url']	+= '&nhm='+encodeURIComponent(number);
	if (getChecked('saveNumberAsWork')) params['url']	+= '&nwk='+encodeURIComponent(number);
	if (getChecked('saveNumberAsMobile')) params['url']	+= '&nmb='+encodeURIComponent(number);

	params['url']	+= '&rnd='+String(Math.random());

	//prompt('',params['url']);
	params['cch']	= false;
	requestXML(params);
	displayMessage(msg_regular);

}

function doSkipNumber(onCompleteSaveNumber){
	requestRecentCalls();
	closeModalDialog();

	if (String(onCompleteSaveNumber).length > 0)
		setTimeout('showSaveNumber('+quote(onCompleteSaveNumber)+');',50);

	displayMessage(msg_regular);
}

function saveNumberSelectExisted(){
	markChecked('saveNumberExisted');

	id_contact	= getValue('saveNumberIDContact');

	if (!id_contact){
		saveNumberSelectNew();
	} else {

		setContent('saveNumberHome', (Numbers[id_contact][0])?formatNumberHuman(Numbers[id_contact][0]):'&laquo;&nbsp;empty&nbsp;&raquo;');
		setContent('saveNumberWork', (Numbers[id_contact][1])?formatNumberHuman(Numbers[id_contact][1]):'&laquo;&nbsp;empty&nbsp;&raquo;');
		setContent('saveNumberMobile', (Numbers[id_contact][2])?formatNumberHuman(Numbers[id_contact][2]):'&laquo;&nbsp;empty&nbsp;&raquo;');

		if (!Numbers[id_contact][0]) markChecked('saveNumberAsHome');
		else if (!Numbers[id_contact][1]) markChecked('saveNumberAsWork');
		else if (!Numbers[id_contact][2]) markChecked('saveNumberAsMobile');
		else markChecked('saveNumberAsHome');

	}

}

function saveNumberSelectNew(){

	markChecked('saveNumberNew');
	markChecked('saveNumberAsHome');

	setContent('saveNumberHome','Home');
	setContent('saveNumberWork','Work');
	setContent('saveNumberMobile','Mobile');

	setFocused('saveNumberName');
}

function setDestinationNumber(num){

	if (idUser) setCookie('callto',num,365);

	splitnum	= splitNumber(num);
	cc	= splitnum['c'];
	num	= splitnum['n'];

	if (cc.length > 0) cc='+'+cc;

	setValue('cc_2',cc);
	setValue('num_2',num);

	num_onChange(2,true);

	setColor('cc_2','blue');
	setColor('num_2','blue');
	setTimeout('setColor("cc_2","#333");setColor("num_2","#333");',1000);

}

function setOriginationNumber(num){

	if (idUser) setCookie('callfrom',num,365);

	splitnum	= splitNumber(num);
	cc	= splitnum['c'];
	num	= splitnum['n'];

	if (cc.length > 0) cc='+'+cc;

	setValue('cc_1',cc);
	setValue('num_1',num);

	num_onChange(1,true);

	setColor('cc_1','blue');
	setColor('num_1','blue');
	setTimeout('setColor("cc_1","#333");setColor("num_1","#333");',1000);

}

function editContact(id_contact){

	if (!idUser) return;

	ping();

	var values	= new Array();

	values['edit_form_caption']	= (id_contact == 1)?'My Numbers':'Edit Contact Numbers';

	values['id_contact']	= id_contact;
	values['name_contact']	= Contacts[id_contact];

	values['old_name']		= Contacts[id_contact];

	n	= splitNumber(Numbers[id_contact][0]);
	values['cc_home']		= n['c'];
	values['num_home']		= n['n'];

	n	= splitNumber(Numbers[id_contact][1]);
	values['cc_work']		= n['c'];
	values['num_work']		= n['n'];

	n	= splitNumber(Numbers[id_contact][2]);
	values['cc_mobile']		= n['c'];
	values['num_mobile']	= n['n'];


	form_content	= getContent('editContact');
	form_content	= globalReplace(form_content,'_phantom',''); // this should go before parsing
	//if (is_admin) alert(form_content);
	form_content	= parseTemplate(form_content,values);
	//if (is_admin) alert(form_content);

	showModalDialog();
	setContent('form',form_content);

	inputEnable('edit_contact_name',(id_contact==1)?false:true);
	setClassName('edit_contact_name',(id_contact==1)?'name_contact_disabled':'name_contact');

	setFocused((id_contact==1)?'cancel_edit_contact':'edit_contact_name');

}

function doEditContact(){

	if (!idUser) return;

	if (!ValidateEditContact()) return;

	enableFormButtons(false);

	var id_contact		= getValue('edit_contact_id');

	var old_name		= getValue('edit_contact_old_name');
	var new_name		= getValue('edit_contact_name');

	var new_num_home	= getValue('cc_11')+getValue('num_11');
	var new_num_work	= getValue('cc_12')+getValue('num_12');
	var new_num_mobile	= getValue('cc_13')+getValue('num_13');

	var params	= new Array();
	params['url']	= 'edit.php?cmd=edit&idu='+idUser+'&idc='+id_contact+'&oln='+encodeURIComponent(old_name)+'&nwn='+encodeURIComponent(new_name)+'&nhm='+encodeURIComponent(new_num_home)+'&nwk='+encodeURIComponent(new_num_work)+'&nmb='+encodeURIComponent(new_num_mobile)+'&rnd='+String(Math.random());
	// if (is_admin) prompt('',params['url']);
	params['cch']	= false;
	requestXML(params);

}

function deleteContact(id_contact){

	if (!idUser) return;

	ping();

	var values	= new Array();
	values['id_contact']	= id_contact;
	values['name_contact']	= Contacts[id_contact];

	form_content	= getContent('deleteContact');
	form_content	= globalReplace(form_content,'_phantom',''); // this should go before parsing
	form_content	= parseTemplate(form_content,values);

	showModalDialog();
	setContent('form',form_content);
	setFocused('delete_contact_button_no');

}

function doDeleteContact(){

	if (!idUser) return;

	var id_contact		= getValue('delete_contact_id');

	enableFormButtons(false);

	var params	= new Array();
	params['url']	= 'edit.php?cmd=delete&idu='+idUser+'&idc='+id_contact+'&rnd='+String(Math.random());
	//prompt('',params['url']);
	params['cch']	= false;
	requestXML(params);

}

function addContact(){

	if (!idUser) return;

	ping();

	var values	= new Array();

	values['edit_form_caption']	= 'Add Contact';
	values['id_contact']	= String(-1);
	values['name_contact']	= '';
	values['old_name']		= '';

	values['cc_home']		= '';
	values['num_home']		= '';

	values['cc_work']		= '';
	values['num_work']		= '';

	values['cc_mobile']		= '';
	values['num_mobile']	= '';

	form_content	= getContent('editContact');
	form_content	= globalReplace(form_content,'_phantom',''); // this should go before parsing
	form_content	= parseTemplate(form_content,values);

	showModalDialog();
	setContent('form',form_content);

	inputEnable('edit_contact_name',true);
	setFocused('edit_contact_name');

}

function showRefill(){

	form_content	= getContent('refill');
	showModalDialog();
	setContent('form',form_content);

}


function showDialingInstructions(){



	form_content	= getContent('dialingInstructions');
	showModalDialog();
	setContent('form',form_content);

}


function showModalDialog(){

	toggleDisplay('transparent_cover',true);
	toggleDisplay('formContainer',true);
	clearContent('form');

	enableFormButtons(true);
}

function closeModalDialog(){

	setContent('form','');
	toggleDisplay('formContainer',false);
	toggleDisplay('transparent_cover',false);

}

function enableFormButtons(enabled){
	if (enabled == null) enabled	= true;

	inputEnable('submit_edit_contact',enabled);
	inputEnable('cancel_edit_contact',enabled);

	inputEnable('delete_contact_button_yes',enabled);
	inputEnable('delete_contact_button_no',enabled);

}

// ********************************************************************************************
// REQUESTS


function report(message){
//	var params	= new Array();
//	//if (is_admin) alert(message);
//	nv	= navigator.userAgent.toLowerCase();
//	params['url']		= 'report.php?id_user='+idUser+'&id_pin='+idPIN+'&message='+encodeURIComponent(message)+'&nv='+encodeURIComponent(nv)+'&rnd='+String(Math.random());
//	// prompt('',params['url']);	
//	params['simple']	= true;
//	requestXML(params);
}

function requestContacts(onload){

	if (typeof(onload) == 'undefined') onload	= ''; // can specify additional onload process

	if (!idUser) return;

	params	= new Array();
	params['url']	= 'callinfo.php?cmd=contacts'+EACacheUpdate+'&rnd='+String(Math.random())+'&onload='+encodeURIComponent(onload);
	requestXML(params);

}

function requestRecentCalls(){

	if (!objectExists('recent_calls_content')) return;

	if (!idUser) return;
	if (!idPIN) return;

	params	= new Array();
	params['url']	= 'callinfo.php?cmd=recent'+EACacheUpdate+'&rnd='+String(Math.random());

	//if (is_admin) prompt('',params['url']);

	requestXML(params);
	
}

function requestLocation(selector){

	if (!idPIN) return;

	var number			= getPhoneNumber(selector);
	var id_div_output	= 'hint_country_'+selector;

	if (number.length < MinimumNumberLength) {
		clearContent(id_div_output);
		clearContent('rate');
		return;
	}

	if (CacheCountries[number] != null){
		setContent(id_div_output,CacheCountries[number]);
	} else {

		params	= new Array();
		params['url']	= 'callinfo.php?cmd=loc&p1='+number+'&p2='+id_div_output+EACacheUpdate+'&rnd='+String(Math.random()); 
		params['cch']	= true;
		requestXML(params);

	}

}

function requestRate(){

	if (!idPIN) return;

	var id_output	= 'hint_rate';
	if (!objectExists(id_output)) return;

	var num_1;
	var num_2;

	if ((num_1	= getPhoneNumber(1)) == '') return;
	if ((num_2	= getPhoneNumber(2)) == '') return;

	if (num_1.length < MinimumNumberLength) return;
	if (num_2.length < MinimumNumberLength) return;

	if (CacheRates[num_1+'_'+num_2] != null){
		setContent(id_output,CacheRates[num_1+'_'+num_2]);
		return;
	}

	params	= new Array();
	params['url']	= 'callinfo.php?cmd=rate&p1='+num_1+'&p2='+num_2+'&p3='+id_output+EACacheUpdate+'&rnd='+String(Math.random());
	//prompt('',params['url']);
	params['cch']	= true;
	requestXML(params);

}

function requestContactName(selector){
	var num;

	if (!idUser) return;

	var id_output	= 'cname_'+String(selector);
	if (!objectExists(id_output)) return;

	if ((num	= getPhoneNumber(selector)) == '') return;

	if (num.length < MinimumNumberLength) return;

	if ((typeof Numbers == 'undefined') || (!Numbers[1])) return; // Contacts data not loaded yet, requestContactName will automatically execute once onLoadContacts complete

	if (num == Numbers[1][0]){
		CacheNames[num]	= '<img src="img/num_home.gif" width=15 height=15 border=0 hspace=2>'+showAsMy(0);
	} else if (num == Numbers[1][1]){
		CacheNames[num]	= '<img src="img/num_work.gif" width=15 height=15 border=0 hspace=2>'+showAsMy(1);
	} else if (num == Numbers[1][2]){
		CacheNames[num]	= '<img src="img/num_mobile.gif" width=15 height=15 border=0 hspace=2>'+showAsMy(2);
	}

	if (CacheNames[num] != null){
		setContent(id_output,CacheNames[num]);
		return;
	}

	id_contact		= NumbersHash[num];
	type_number 	= -1;
	name_contact	= '';

	if (id_contact) {
		name_contact	= Contacts[id_contact];

		if (num == Numbers[id_contact][0])
			type_number = 0;
		else if (num == Numbers[id_contact][1])
			type_number = 1;
		else if (num == Numbers[id_contact][2])
			type_number = 2;
	}

	clearContent(id_output);

	output	= '';

	if (num){

		if (type_number == -1)		{ icon	= ''; descr	= ''; }
		else if (type_number == 0)	{ icon	= 'num_home'; descr		= '&nbsp;<small>(Home)</small>'; }
		else if (type_number == 1)	{ icon	= 'num_work'; descr		= '&nbsp;<small>(Work)</small>'; }
		else if (type_number == 2)	{ icon	= 'num_mobile'; descr	= '&nbsp;<small>(Mobile)</small>'; }

		if (id_contact==1) name_contact	= showAsMy(type_number);

		if (name_contact) {

			if (icon != '') output	+= '<img src=img/'+icon+'.gif width=15 height=15 border=0 hspace=2>';
			output	+= name_contact + descr;

			setContent(id_output,output);
		}

		CacheNames[num]	= output;
	}

}

function requestBalance(){

	if (!objectExists('my_numbers_content')) return;

	//if (is_admin) alert(idPIN);
	if (!idPIN) {
		onBalanceLoaded(false);
		return;
	}

	params	= new Array();
	params['url']	= '/common/export/pin-balance.php?id_pin='+idPIN+'&id_user='+idUser+'&xml=y'+EACacheUpdate+'&rnd='+String(Math.random());
	params['cch']	= false;
	//if (is_admin) prompt('',params['url']);
	requestXML(params);

}

function playProgress(){
	swapImage('img_progress','progress.gif');
}

function stopProgress(){
	swapImage('img_progress','connect.gif');
}

function placeCall(){

	if (!ValidateNumbers()) return;

	playProgress();

	var num_1	= getPhoneNumber(1);
	var num_2	= getPhoneNumber(2);

	setCookie("autocall", '', 0);// unsign autocall variable

	if (!idUser) {

		setCookie("callfrom_unsigned", num_1, 0);// set for current session
		setCookie("callto_unsigned", num_2, 0);// set for current session
		setCookie("autocall", 'y', 0);

		signIn(null,'/webcall/');
		return;

	} else {
		setCookie("callfrom", num_1, 365);// set for current session, have higher priority than callfrom
		setCookie("callto", num_2, 365);// set for current session, have higher priority than callfrom
	}

	if (!idPIN){
		showRefill();
		stopProgress();
		return;
	}

	displayMessage(msg_placing_call);

	params	= new Array();
	params['url']	= 'call.php?idp='+idPIN+'&idu='+idUser+'&orig='+num_1+'&dest='+num_2+'&rnd='+String(Math.random());

	// if (is_admin) prompt('',params['url']);

	params['cch']	= false;
	params['onfailed']	= 'alert("We are experiencing technical difficulties. Please try your call later.");report("Call request failed!");';
	requestXML(params);
	//if (is_admin) prompt('',params['url']);

	enableCallButton(false);
	setTimeout("enableCallButton(true);stopProgress();",20000);
	
}

function enableCallButton(state){
	inputEnable('button_call',state);
	b	= findObject('button_call');
	if (b && state)
		b.src	= "/webcall/img/callbutton.gif";
	else if (b && !state)
		b.src	= "/webcall/img/callbuttondisabled.gif";
}

function onContactsLoaded(PID){
	
	if (!idUser) return;

	Contacts	= new Array();
	Numbers		= new Array();
	NumbersHash	= new Array();

	Contacts[1]	= 'Myself';
	Numbers[1]	= ['','',''];

	//alert('on contacts start loading');

	if (xmlhttpXMLDocument[PID] == null){
		report('onContactsLoaded - xmlhttpXMLDocument[PID] does not exist, aborting');
		return;
	}

	responce	= xmlhttpXMLDocument[PID].documentElement;

	if (responce.getElementsByTagName('cnt').length != null){

		for (var key=0; key < responce.getElementsByTagName('cnt').length; key++){

			//Contact	= responce.getElementsByTagName('cnt')[key].childNodes[0].tagName;
			Contact	= responce.getElementsByTagName('cnt')[key];
			
			id_contact		= null;
			name_contact	= '';
	
			num_home		= '';
			num_work		= '';
			num_mobile		= '';
	
			for (var key_node=0; key_node < Contact.childNodes.length; key_node++){
				tag	= String(Contact.childNodes[key_node].tagName);
				if (tag == 'idc') id_contact	= (Contact.childNodes[key_node].firstChild != null)?Contact.childNodes[key_node].firstChild.data:null;
				if (tag == 'cnm') name_contact	= (Contact.childNodes[key_node].firstChild != null)?Contact.childNodes[key_node].firstChild.data:'';
				if (tag == 'nhm') num_home		= removeNonDigits((Contact.childNodes[key_node].firstChild != null)?Contact.childNodes[key_node].firstChild.data:'');
				if (tag == 'nwk') num_work		= removeNonDigits((Contact.childNodes[key_node].firstChild != null)?Contact.childNodes[key_node].firstChild.data:'');
				if (tag == 'nmb') num_mobile	= removeNonDigits((Contact.childNodes[key_node].firstChild != null)?Contact.childNodes[key_node].firstChild.data:'');
			}
	
			if (id_contact != null){
				id_contact	= String(id_contact);
				Contacts[id_contact]	= name_contact;// Name for my numbers already set
				Numbers[id_contact]		= new Array();
				Numbers[id_contact][0]	= num_home;
				Numbers[id_contact][1]	= num_work;
				Numbers[id_contact][2]	= num_mobile;

				if (num_home) NumbersHash[num_home]		= id_contact;
				if (num_work) NumbersHash[num_work]		= id_contact;
				if (num_mobile) NumbersHash[num_mobile]	= id_contact;
			}
		}
	}

	//if (is_admin) alert(Contacts[1]);

	showContactList();
	showMyNumbers();
	CacheNames	= new Array;

	requestContactName(1);
	requestContactName(2);

	setTimeout('requestRecentCalls();',1000);
	setTimeout('requestBalance();',30000);

}


function onRecentLoaded(PID){

	if (!objectExists('recent_calls_content')) return;

	if (!idUser) return;

	if (xmlhttpXMLDocument[PID] == null){
		report('onRecentLoaded - xmlhttpXMLDocument[PID] does not exist, aborting');
		return;
	}

	responce	= xmlhttpXMLDocument[PID].documentElement;

	output	= '<table class=form>';

	var calls_placed	= 0;

	if (responce.getElementsByTagName('call').length != null){

		for (var key=0; key < responce.getElementsByTagName('call').length; key++){

			num_dest		= removeNonDigits(String(responce.getElementsByTagName('call')[key].firstChild.data));
			id_contact		= NumbersHash[num_dest];

			type_number 	= -1;
			name_contact	= '';

			if (id_contact) {
				name_contact	= Contacts[id_contact];
	
				if (num_dest == Numbers[id_contact][0])
					type_number = 0;
				else if (num_dest == Numbers[id_contact][1])
					type_number = 1;
				else if (num_dest == Numbers[id_contact][2])
					type_number = 2;
			}
	
			if (num_dest){
	
				if (type_number == -1) 	icon_class='none_icon';
				else if (type_number == 1)	icon_class='work_icon';
				else if (type_number == 2)	icon_class='mobile_icon';
				else if (type_number == 0) icon_class='home_icon';


				if (id_contact==1) name_contact	= showAsMy(type_number);
				if (name_contact == '') name_contact	= formatNumberHuman(num_dest);

				output	+='<tr><td class='+icon_class+'></td><td><a href=# onclick=setDestinationNumber("'+num_dest+'") class=nodecoration>'+name_contact+'</a></td></tr>';
				calls_placed++;
			}
		}
	}

	if (calls_placed == 0){
		output	+= '<tr><td align=center valign=middle>No calls<br>have been placed yet</td></tr>';
	}

	output	+= '</table>';

	setContent('recent_calls_content',output);

}

function onBalanceLoaded(PID){

	if (!objectExists('my_balance_amount')) return;

	if (!idUser) return;

	if (idPIN){

		if (xmlhttpXMLDocument[PID] == null){
			report('onBalanceLoaded - xmlhttpXMLDocument[PID] does not exist, aborting');
			return;
		}
	
		responce	= xmlhttpXMLDocument[PID].documentElement;
	
		amount	= String(responce.getElementsByTagName('amount')[0].firstChild.data);

	} else {

		amount	= '0.00';

	}

	setContent('my_balance_amount','$'+amount);

	if (amount >= 10){
		amountClass	= 'my_balance_amount_green';
	} else if (amount >= 5){
		amountClass	= 'my_balance_amount_yellow';
	} else {
		amountClass	= 'my_balance_amount_red';
	}
	
	setClassName('my_balance_amount',amountClass);
	
}


function onCallComplete(PID){

	setTimeout("stopProgress()",2000);

	if (PID != null) {

		if (xmlhttpXMLDocument[PID] == null){
			report('onContactsLoaded - xmlhttpXMLDocument[PID] does not exist, aborting');
			return;
		}
	
		responce	= xmlhttpXMLDocument[PID].documentElement;

		errcode		= (responce.getElementsByTagName('errcode')[0].firstChild)?responce.getElementsByTagName('errcode')[0].firstChild.data:-1;
		errmessage	= (responce.getElementsByTagName('errmessage')[0].firstChild)?responce.getElementsByTagName('errmessage')[0].firstChild.data:'';

		if (errcode != 0){
 			displayMessage('Call failed!<br>'+errmessage,'error');
		} else {

			var message	= msg_call_placed;

			if (responce.getElementsByTagName('save_number').length > 0){ // Check if we need to save numbers
	
				number1	= (responce.getElementsByTagName('save_number')[0])?responce.getElementsByTagName('save_number')[0].firstChild.data:null;
				number2	= (responce.getElementsByTagName('save_number')[1])?responce.getElementsByTagName('save_number')[1].firstChild.data:null;

				if ((number1 != null) && (number2 != null))
					message	= message + "<br><a href=\"#\" onclick=\"showSaveNumber('"+number1+"','"+number2+"');\">Save Numbers</a>";
				else if ((number1 != null) && (number2 == null))
					message	= message + "<br><a href=\"#\" onclick=\"showSaveNumber('"+number1+"');\">Save Numbers</a>";
	
			} else {
				setTimeout("displayMessage(msg_regular)",30000);
			}


			displayMessage(message,'ok');
		}

	
	}

	requestContacts();

}

function displayMessage(message,mode){ // mode: neutral, ok, error

	if (mode == null) mode	= 'neutral';

	setContent('msg_board',message);
	setClassName('msg_board',mode);
}

function ping(){

	params	= new Array();
	params['url']	= 'callinfo.php?cmd=ping&rnd='+String(Math.random());
	params['cch']	= false;
	requestXML(params);

}

function sessionTimeOut(){
	if (!idUser) return;
	SessionExpired	= true;
	alert('Your session has expired! Please relogin.');
	signIn();
}

function signOut(){

	setCookie("callfrom_unsigned", '', -10);
	setCookie("callto_unsigned", '', -10);

	params	= new Array();
	params['url']	= 'signout.php';
	params['cch']	= false;
	requestXML(params);
}

function signIn(params,url){
	if (params == null) params	= '';
	if (url == null) url	= window.location.href;
	params	= String(params);
	window.location.href = "/reg/?l="+encodeURIComponent(url)+"&"+encodeURIComponent(params);
}

function showAsMy(n){
	if (n == 1) return 'My Work';
	if (n == 2) return 'My Mobile';
	return 'My Home';
}

function splitNumber(number){

	number	= String(number).replace(/[^\d]/g,"");

	for (var i=4; i>0; i--){
		cc	= number.substring(0,i);
		if (CCode[cc]){
			var r	= new Array();
			r['c']	= cc;
			r['n']	= number.substring(i);
			return r;
		}
	}

	var r	= new Array();
	r['c']	= number.substring(0,1);
	r['n']	= number.substring(1);
	return r;

}

function formatNumberHuman(number){
	var n	= splitNumber(number);
	if (n['c'] && n['n'])
		return '+'+n['c']+' '+n['n'];
	else return number;
}
