
var Version = IPPORT_WEBPHONE_VERSION;
var Location = IPPORT_WEBPHONE_SETUP_URL;
var LocationFolder = IPPORT_WEBPHONE_SETUP_FOLDER_URL ;
var ipPortID = null;
var remainingTime = 0; 

var sip_host = '';
var tmpPassword = '';

var InstallPageLocation = "/setup-step-1";
var BackPageLocation = "/";
var needInst = true;
var Call = null;
var InCall = null;
var Phone = null;
var isHolded = false;
var tmrCheck;
var tmrCnt = 0;
var logonComplete = false;

var useSocialAuth = useSocialAuth || false;
var useTmpPassword = useTmpPassword || false;
var tmpPassword = '';
var phoneUserAgent = phoneUserAgent || 'ipPort Web';

function Init()
{

	if ( (needInstall(Version) == "no") || (window.ActiveXObject) ) {	
		if (window.ActiveXObject) {
			if (!$('#COMPhone').length) 
			{
				$('#a_call').append(generatePhoneObj());
			}			
		}
		else  {
			if (!$('#NPAPIPhone').length) $('#a_call').append(generatePhoneObj());
		}
		
	} else {
		needInst = true;
		setACallState('needinstall_state');
		return;
		
	}
	
    InitPhone();
	
	if (Phone){
		
		if ((!Phone.Version)||((Phone.Version)&&(Phone.CheckUpdate(Version)))){
			needInst = true;
			setACallState('needinstall_state');
			return;			
		};
		
		needInst = false;
		
	} else {
		
		//IE9 сразу не поднимает COMPhone.object поэтому надо проверить через new ActiveXObject("ipPort.WebClient.Phone")
		// и попробовать еще раз 
		if ($.browser.msie) 
		{
			var  p = null;
			try
			{
				p = new ActiveXObject("ipPort.WebClient.Phone");
			} 
			catch (e) {}
			
			if (p) 
			{
				setTimeout(Init, 500);
				return;
			}
		}
		
		needInst = true;
		setACallState('needinstall_state');
		return;
	}
		
	setACallState('input_state');
	setACallState('waiting_state');
	if (useTmpPassword) getTmpPassword()
	else getipPortID(Phone.HardwareId, true);
	
}


function InitPhone()
{
    if(!Phone)
    {
        try {
			if (window.ActiveXObject) {
				Phone = COMPhone.object;//Phone = new ActiveXObject("ipPort.WebClient.Phone");
				//debugger;
			}
			else 
				Phone = document.getElementById("NPAPIPhone");
		} 
		catch (e) {
		}
     }

}


function tryInit(){
	
	if (needInst) Init()
	else if (!logonComplete) {
			setACallState('waiting_state');
			if (useTmpPassword) getTmpPassword()
			else getipPortID(Phone.HardwareId, true);
		} else {
			aCall.nodes.$aCall.unbind('click', tryInit);
		};

}


function getipPortID(hardwareId, logOn){
	
	
	$.ajax({
		type: 'GET',
		url: IPPORT_SERVISE_URL + '/index/promo',
		data: { fmt: 'jsonp', hwid: hardwareId },
		dataType: "jsonp",
		success: function(data){
			if (data.error_code) {
				setACallState('input_state');
				setACallStatusText(data.error_message);
//				alert(data.error_message);
			}
			else {

				ipPortID = data.id;
				sip_host = data.sip_host
				remainingTime = secondToMinute(data.minutes_left) || 0;
				$('.temp_uid').html('Ваш временный номер <span id="temp_uid">' + ipPortID + '</span>.');
				aCall.nodes.$aCall.addClass('promo');
				
				phoneUserAgent = "ipPort Promo";

				if (logOn) LogOn()
				else setACallStatusText("Бесплатных звонков осталось на: " + remainingTime);
				
				
			};
			
		},
		error: function(XMLHttpRequest, textStatus, errorThrown){
			setACallStatusText("Ошибка соединения");
			setACallState('input_state');
		}
	});
}


function getTmpPassword()
{
	$.ajax({
		type: 'GET',
		url: IPPORT_SERVISE_URL + '/social/temp-passwd',
		data: {type: 'IPPORT'},
		dataType: "jsonp",
		success: function(data){
			if (data.error_code)
			{
				setACallState('input_state');
				setACallStatusText(data.error_message);
			}
			else
			{
				ipPortID = data.data.id;
				sip_host = data.data.sip_host;
				tmpPassword = data.data.tmp_passwd;
				$('.temp_uid').html('Ваш номер <span id="temp_uid">' + ipPortID + '</span>.');
//				setACallStatusText("На вашем счете: " + data.data.balance + ' ' + ((data.data.curr_shortname == "RUR") ?  'р.' : 'USD'));

				LogOn();
			};
			
		},
		error: function(XMLHttpRequest, textStatus, errorThrown){
			setACallStatusText("Ошибка соединения");
			setACallState('input_state');
		}
	});
	
}


function setUsetInfo(){
	
	if (phoneUserAgent == "ipPort Promo") getipPortID(Phone.HardwareId)
	else getBalance();
	
}


function LogOff()
{
    if(Phone) Phone.LogOff();
    // отписываемся от событий (...уже отписалить)
    //Phone.OnIncomingCall = null;
    //Phone.OnLogonComplete = null;
    //Phone.OnLogonFail = null;
	//Phone.OnLogoff = null;
	//Phone.OnDisconnected = null;
    Phone = null;
}

    
function LogOn()
{   
    InitPhone();
	if(!Phone) return;

    Phone.Domain = sip_host;
    Phone.Proxy = sip_host;
    Phone.Registrar = sip_host;
	
//    Phone.Domain = "sip.n1.test.ipport.net";
//    Phone.Proxy = "sip.n1.test.ipport.net";
//    Phone.Registrar = "sip.n1.test.ipport.net";
	
	Phone.License = ""
		+ "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
		+ "<License xmlns=\"http://web.ipPort.org/licenses/server\">"
		+ "	<Expires>2042-09-30T00:00:00</Expires>"
		+ "	<Id>ipPort_development_license</Id>"
		+ "	<Domains>"
		+ "		<Domain Name=\"sip.n1.ipport.net\">"
		+ "			<Servers>"
		+ "				<Server Role=\"Both\">sip.n1.ipport.net</Server>"
		+ "			</Servers>"
		+ "		</Domain>"
		+ "		<Domain Name=\"sip.n1.test.ipport.net\">"
		+ "			<Servers>"
		+ "				<Server Role=\"Both\">sip.n1.test.ipport.net</Server>"
		+ "			</Servers>"
		+ "		</Domain>"
		+ "		<Domain Name=\"ipport.net\">"
		+ "			<Servers>"
		+ "				<Server Role=\"Both\">ipport.net</Server>"
		+ "			</Servers>"
		+ "		</Domain>"
		+ "		<Domain Name=\"social.ipport.net\">"
		+ "			<Servers>"
		+ "				<Server Role=\"Both\">social.ipport.net</Server>"
		+ "			</Servers>"
		+ "		</Domain>"
		+ "		<Domain Name=\"social.test.ipport.net\">"
		+ "			<Servers>"
		+ "				<Server Role=\"Both\">social.test.ipport.net</Server>"
		+ "			</Servers>"
		+ "		</Domain>"
		+ "	</Domains>"
		+ "	<Signature>E81A4794C347A6BE19E58933A76D9CE3B6F3DF8FE99973AE060F63EDF2FAD3A072EC791C663D06E57F7347B4A97CED68C899E133EC861FC190B579FDFFD5349D</Signature></License>"
		"";
	
	
	Phone.Language = "ru-ru";
    
    // привязка к событиям
    Phone.OnIncomingCall = Phone_OnIncomingCall;
    //if(Phone.OperationState.IsError)
    Phone.OnLogonComplete = Phone_OnLogonComplete;
    Phone.OnLogonFail = Phone_OnLogonFail;
    Phone.OnLogoff = Phone_OnLogoff;
    Phone.OnDisconnected = Phone_OnDisconnected;
    //Phone.OnLocalVideoState = Phone_OnLocalVideoState;
    
    //Phone.Login = $('#a_call_login').val();
    //Phone.Password = $('#a_call_passwd').val();
	
    Phone.Login = ipPortID;
//	Phone.Password = Phone.HardwareIdPassword;

    if (useTmpPassword)
    {
    	Phone.UseSocialAuth = true;
    	Phone.Password = tmpPassword;
    }
    else
    {
	    Phone.UseHardwareIdPwd = true;
    }

	try 
	{
		Phone.UserAgent = phoneUserAgent + "/" + IPPORT_WEBPHONE_VERSION + "/" + Phone.HardwareIdUnsafe + "/";
	}
	catch(err){};
		
    try
    {
    	Phone.LogOn(); 
    }
    catch(err)
    {
//        alert(err.description);
//		if (Phone) alert(Phone.OperationState.Description);
		setACallStatusText("Ошибка соединения");
		setACallState('input_state');
        return;
    }
	
    try 
	{
		Phone.LocalVideo.Enabled = false;
		Phone.RemoteVideo.Enabled = false;
	} 
	catch(err){}
	   
}
   

function StartCall()
{
    if(!Call) return;
	
    // Здесь привязка на события.
    Call.OnSetupInProgress       = Call_OnSetupInProgress;
    Call.OnCallSetuped           = Call_OnCallSetuped;
    Call.OnNormalCallClearing    = Call_OnNormalCallClearing;
    //Call.OnForwarding            = Call_OnForwarding;
    Call.OnAbnormalTermination   = Call_OnAbnormalTermination;
    //Call.OnHolded                = Call_OnHolded; 
    //Call.OnUnholded              = Call_OnUnholded;
    Call.OnTerminated            = Call_OnTerminated;
    Call.OnVolumeChanged         = Call_OnVolumeChanged;
    Call.OnMicLevelChanged       = Call_OnMicLevelChanged;
    //Call.OnNetworkQualityChanged = Call_OnNetworkQualityChanged;
    Call.OnMicIntensityChanged   = Call_OnMicIntensityChanged;
    Call.OnVolIntensityChanged   = Call_OnVolIntensityChanged;
    //Call.OnRemoteVideoState      = Call_OnRemoteVideoState;
    
    // Соединить звонок.
    try
    {
      Call.Connect();   
    }
    catch(err)
    {
//        alert(err.description);
		setACallStatusText("Ошибка соединения");
    }
}
   
    
function MakeCall(phoneNumber)
{
//  phoneNumber = phoneNumber.replace(/\*9/, "+79"); //Тестовая хрень для звонков на мобильные. Потом надо убрать!!!!!!
//	console.log(phoneNumber);
	Call = Phone.MakeCall(phoneNumber);
    Phone.PlaySound("OUTGOING",true);
    StartCall();
}


function TerminateCall()
{
    if(Call)
    {
        Call.Disconnect();

	    //Call.OnSetupInProgress       = null;
	    //Call.OnCallSetuped           = null;
	    //Call.OnNormalCallClearing    = null;
	    //Call.OnForwarding            = null;
	    //Call.OnAbnormalTermination   = null;
	    //Call.OnHolded                = null; 
	    //Call.OnUnholded              = null;
	    //Call.OnTerminated            = null;
	    //Call.OnVolumeChanged         = null;
	    //Call.OnMicLevelChanged       = null;
	    //Call.OnNetworkQualityChanged = null;
	    //Call.OnMicIntensityChanged   = null;
	    //Call.OnVolIntensityChanged   = null;

    }
	
	callClearing();
}

function callClearing(){
	
	if(Call) Call = null;

	if (aCall.Call) {
	
		aCall.Call.timestamp = null;
		
		if (aCall.Call.callSetupedTimerId) {
			clearTimeout(aCall.Call.callSetupedTimerId);
			aCall.Call.callSetupedTimerId = null;
		}
		
		if (aCall.Call.durationTimerId) {
			clearInterval(aCall.Call.durationTimerId);
			aCall.Call.durationTimerId = null;
		}
		
	}
	
}

function IncomingDone() {
	//alert('IncomingDone');
    aCall.nodes.$aCall.removeClass('incomingcall_state');
    InCall = null;
}

    
function onRejectBtnClick() {
    InCall.Reject();
    IncomingDone();
}


function onAnswerBtnClick() {
    try {
    	Call = InCall.Answer();        
    	StartCall();
    }
    catch(err){
//        alert(err);
//        alert(err.description);
		setACallStatusText("Ошибка соединения");
    }
     
	IncomingDone();

}


function btnFixFrw_onclick() 
{
    InitPhone();
    Phone.FixWindowsFirewallProblem();
}


function callTimerInit(){
	
	var d = new Date();
	aCall.Call.timestamp = d.getTime();
	
	aCall.Call.callSetupedTimerId = setTimeout(function(){ aCall.Call.durationTimerId = setInterval(setCallDuration, 300); }, 1000);
	
}


function setCallDuration(){

	var d = new Date();
	var callDuration = d.getTime() - aCall.Call.timestamp;
	callDuration = secondToMinute(Math.floor(callDuration / 1000));
	setACallStatusText('Продолжительность соединения ' + callDuration);
	
}


function secondToMinute(number) {
	
	if (!number) return '0';
	
	var minute = Math.floor(number/60);
	var second = number - minute*60;

	var hours = Math.floor(minute/60);
	var minute = minute - hours*60;
	
	//var minuteSec = number - hours*60;

	
	var s = '';
	s += (hours)  ? ( (hours>9)  ? hours  + ':' : '0' + hours  + ':') : '00:';
	s += (minute) ? ( (minute>9) ? minute + ':' : '0' + minute + ':') : '00:';
	s += (second) ? ( (second>9) ? second + '.' : '0' + second + '.') : '00.';
	
	//if (minute) s += minute + ' мин. ';
	//if (second) s += second + ' сек.';
	
	return s;
	
}


/////////////////////////////////////////////////////////////////
// Phone Events
/////////////////////////////////////////////////////////////////

function Phone_OnIncomingCall(call)
{
    //debugger;
	InCall = call;
	call.PlaySound("INCOMING", true);
	$('.incomingphone', aCall.nodes.$aCall).html(call.Number);
	aCall.nodes.$aCall.addClass('incomingcall_state');

	//alert("Phone_OnIncomingCall - " + call.Name + " : " + call.Number);
	//alert(call.CallId);

}
	

// дисконнект входящего звонка (если таймаут или юзер отказался и т.п.)
function Phone_OnDisconnected(call)
{
    //alert(call.CallId);
	//setACallState('incomingcall_state');
    IncomingDone();
//	alert('OnDisconnected');
	setACallState('input_state');
	callClearing();
    
}

	
function Phone_OnLogonComplete()
{
	//alert("Phone_OnLogonComplete");		
	setACallState('input_state');
	setUsetInfo();
	aCallSoundControlStatusInit();
	logonComplete = true;
	$.cookies.set( 'isLogonComplete', '1' ); 

}
	
	
function Phone_OnLogonFail(status)
{
//    alert('Phone_OnLogonFail');

	var code = status.SIPCode;

	if(!code) code = status.Code;   
                
	setACallStatusText(code+" : "+status.Text);
	setACallState('input_state');

} 
   
     
function Phone_OnLogoff()
{
    try {
		//setACallStatusText("Разрегистрирован.");
		logonComplete = false;
		callClearing();
	}catch(e){}
	
}          
	
	    
/////////////////////////////////////////////////////////////////
// Call setup events
/////////////////////////////////////////////////////////////////   

function Forward_OnCancel()
{
//    alert("Forward_OnCancel");
}        


function Call_OnForwarding(forwardControl)
{
    setACallStatusText("Соединение переадресуется.");	    
}


function Call_OnSetupInProgress()
{
    setACallStatusText("Устанавливается соединение...");
}


function Call_OnCallSetuped()
{
	//if (console) console.log('Call_OnCallSetuped');
	callTimerInit();
	setACallStatusText("Соединение установлено.");
	setACallState('call_state');	    
}


function Call_OnNormalCallClearing(reason)
{
    switch(reason)
    {
        case 0:
        setACallStatusText("Соединение отклонёно.");	    
        break;
        case 1:
        setACallStatusText("Пользователь занят.");	    
        break;
    }
	
	//setACallState('readytocall_state');
	setACallState('input_state');
	callClearing();
	aCall.linedraw.resetAll();
    //ResetHoldBtn();
}


function Call_OnAbnormalTermination(status)
{
    setACallStatusText("Ошибка установки соединение.");	
    Call = null;
    //ResetHoldBtn();
    
    var code = status.SIPCode;
    if(!code) code = status.Code;   

//    alert("Code: "+code+"\n"+status.Text);    
	setACallStatusText("Ошибка соединения");
    status = null;
	
	//setACallState('readytocall_state');
	setACallState('input_state');
	callClearing();
	aCall.linedraw.resetAll();

}


/////////////////////////////////////////////////////////////////
// Call in progress events
/////////////////////////////////////////////////////////////////

function Call_OnHolded(byRemote)
{
    setACallStatusText("Звонок удержан" + (byRemote? " удалённым пользователем.":"."));	    
    isHolded = true;
    //btnHold.value = "Снять с удерж.";
}


function Call_OnUnholded(byRemote)
{
    setACallStatusText("Звонок cнят с удержания" + (byRemote? " удалённым пользователем.":"."));	    
    //ResetHoldBtn();
}


function Call_OnTerminated(byRemote)
{
    Call = null;
	setACallStatusText("Звонок завершён" + (byRemote? " удалённым пользователем.":"."));	 
	//setACallState('readytocall_state');
	setACallState('input_state');
	callClearing();
	aCall.linedraw.resetAll();
    //ResetHoldBtn();
}


/////////////////////////////////////////////////////////////////
// Media events
/////////////////////////////////////////////////////////////////

function Call_OnVolumeChanged(value)
{
    //setACallStatusText("Уровень громкости изменился: " + value);
	//return;
	var sc = aCall.soundControl;
	if (!sc.sliding){
		sc.intensityVolObj.slider( 'value' , Math.round( (value*100)/0xffff ) );
	}	    
}

function Call_OnMicLevelChanged(value)
{
    //setACallStatusText("Уровень микрофона изменился: " + value);
	
	var sc = aCall.soundControl;
	if (!sc.sliding){
		sc.intensityMicObj.slider( 'value' , Math.round( (value*100)/0xffff ) );
	}			    
}

function Call_OnNetworkQualityChanged(value)
{
    //netQualityText.innerHTML = "NetQuality: " + value + "%";	    
}

function Call_OnMicIntensityChanged(value)
{
	
	//if(console) console.log('Mic' + value);
	
	if (aCall.tmrMicIntensity) {
		clearTimeout(aCall.tmrMicIntensity);
		aCall.tmrMicIntensity = null;
	}
	
	aCall.linedraw.redrawMic(value);	
	aCall.tmrMicIntensity = setTimeout(function(){aCall.linedraw.resetMic()}, 1500);

}

function Call_OnVolIntensityChanged(value)
{
 	//if(console) console.log('Vol' + value);
	
	if (aCall.tmrVolIntensity) {
		clearTimeout(aCall.tmrVolIntensity);
		aCall.tmrVolIntensity = null;
	}
	
    aCall.linedraw.redrawVol(value);
	aCall.tmrVolIntensity = setTimeout(function(){aCall.linedraw.resetVol()}, 1500);
   
}
	

/////////////////////////////////////////////////////////////////
// Install component
/////////////////////////////////////////////////////////////////

function needInstall(requiredVersion)
{//debugger;
    var plg = navigator.plugins["ipPort Web Phone"];
    if(plg == null) return "install";
    try
    {   
        if(requiredVersion == null)
            return "update";
             
        var re = /(\d+\.){3}\d+/;
        var plgver = re.exec(plg.description);
        
        if(plgver == null)
            return "update";
        plgver = plgver[0];
        
        plgver = plgver.split(".");
        var reqver = requiredVersion.split(".");
        if(reqver.length == 0)
            return "update";
            
        var n = Math.min(reqver.length, plgver.length);

        for(var i = 0; i<n; i++)
        {
            if(parseInt(reqver[i]) > parseInt(plgver[i]))
                return "update";
        }
        return "no";
    }
    catch(e)
    {
        return "update";
    }
}


function checkVersion() {
    //debugger;
	
	if (window.ActiveXObject) {
		try {
			try {
				Phone = new ActiveXObject("ipPort.WebClient.Phone");
			} 
			catch (e) {
			//alert(e.description);
			}
			//if (Phone) alert('Phone');
			//if (Phone) alert(Phone && (Phone.Version) && (!Phone.CheckUpdate(Version)));
			
			if (Phone && (Phone.Version) && (!Phone.CheckUpdate(Version))) {
			
				if (tmrCheck) clearInterval(tmrCheck);
//				alert('Компонент установлен');
				document.location.href = BackPageLocation;
				return true;
				
			}
		} 
		catch (e) {
			Phone = null;
			//alert(e.description);
		}
		
		return false;
	}
	
	navigator.plugins.refresh(false);
    var res = needInstall(Version);
	if(res == "no")
    {
        if(tmrCnt == 1)
        {
			$('body').append(generatePhoneObj());
	
			try {
				Phone = document.getElementById("NPAPIPhone");
			} 
			catch (e) {
			}
			
			if (Phone) {
				if(tmrCheck)clearInterval(tmrCheck);
				//alert('Компонент установлен');
				document.location.href = BackPageLocation;
				return true;
			}

        }
        else
            tmrCnt++;
    }
	return false;
}


function tryInstall()
{

	if(window.ActiveXObject)
	{
		tmrCnt = 0;
	    tmrCheck = setInterval(checkVersion, 1000); 
		
	} 
	else 
	{
		if ($.browser.mozilla) //для FF временно переключили на установку через setup.exe 
//		if (false) 
		{
			InstallTrigger.install({
				ipPort: IPPORT_WEBPHONE_SETUP_FOLDER_URL + '/ff/npipport.xpi'
			});
		}
		else 
		{
			if (navigator.userAgent.match(/Chrome/)) 
			{
				window.open(IPPORT_WEBPHONE_SETUP_FOLDER_URL + '/chrome/npipport.crx', "_self");
			}
			else 
			{
				window.open(Location, "_self");
			}
		}
		tmrCnt = 0;
		tmrCheck = setInterval(checkVersion, 1000);
	}
	
}


function generatePhoneObj(codebase){
	
	if ($.browser.msie && !$.browser.opera) 
	{
		var r = '' +
		'<object id = "COMPhone" visible="false" ' +
		'style="visibility: hidden; display:none;"' +
//		'onreadystatechange="COMPhone_OnReadyStateChange(this)"' +		//в IE9 использовать нельзя: readyState == 4 (complete), а в доме объекта еще нет    
		'classid = "clsid:87C49AAA-3465-4630-8EF6-5252EB5A71C2"';
		
		//codebase='codebase'; 
		if (codebase == 'codebase') 
			r += 'codebase="' + Location + '#Version=' + Version.replace(/\./gi, ',') + '">';
		
		r += '</object>';
	}
	else
	{
		var pluginspage = "http://" + document.location.host + InstallPageLocation;
//		var r = ''
//    	+ '<embed id = "NPAPIPhone"' 
//        + 'style="visibility: hidden;"'
//        + 'type="application/ipport-webclient-phone"'  
//        + 'hidden="true"'
//        + 'height="1" width="1"'
//        + 'display:"none" '
//        + 'pluginspage="' + pluginspage + '"/>';
//	}

		var r = ''
    	+ '<embed id = "NPAPIPhone"' 
        + 'style="position:absolute; width:1px; height:1px; background:transparent;"'
        + 'type="application/ipport-webclient-phone"'  
        + 'pluginspage="' + pluginspage + '"/>';
	}





	   
	//document.write(r);
	return r;


/*
		var r = ''
		+ '<embed id="NPAPIPhone" style="visibility: hidden;" type="application/ipport-webclient-phone"'
		+ 'hidden="true" height="1" width="1"' 
		+ 'pluginspage="http://update.ipport.net/webphone/ff/npipport.xpi"' 
//		+ 'codebase="' + LocationFolder + 'ff/npipport.xpi" />'	
		+ 'pluginurl="https://update.ipport.net/webphone/ff/npipport.xpi"'		
	
		+ 'codebase="http://update.ipport.net/webphone/ff/npipport.xpi" />'		
//		+ 'src="http://update.ipport.net/webphone/ff/npipport.xpi" />'
*/


}






/////////////////////////////////////////////////////////////////
// btnTuneWizard_onclick
/////////////////////////////////////////////////////////////////


function btnTuneWizard_onclick()
{
    InitPhone();               
    try
    {
        Phone.InvokeTuningWizard();
    } 
    catch(err)
    {
        alert(err.description);
    }
}




	/////////////////////////////////////////////////////////////////

    function getElementPosition(elemId)
    {
        var elem = document.getElementById(elemId);
         
        var w = elem.offsetWidth;
        var h = elem.offsetHeight;
         
        var l = 0;
        var t = 0;
         
        while (elem)
        {
            l += elem.offsetLeft;
            t += elem.offsetTop;
            elem = elem.offsetParent;
        }
        l -= document.body.scrollLeft;
        t -= document.body.scrollTop;
        return {"left":l, "top":t, "width": w, "height":h};
    }
    /////////////////////////////////////////////////////////////////
    // ПРи resize окна браузера пересчитывать rect для окон видео
    /////////////////////////////////////////////////////////////////
    
	//window.onscroll = function () { Phone_UpdateVideoPosition(); }
    
    function Phone_UpdateVideoPosition()
    {
    
        if(Call)
        {
            var localVideo = Call.LocalVideo;
            if(localVideo.Enabled)
            {
                 var pos = getElementPosition("localVideo");
                 localVideo.SetVideoRect(pos.left+4, pos.top+4, pos.width-4, pos.height-4);   // rect мониторинга исходящего видео
            }
            
            var remoteVideo = Call.RemoteVideo;
            if(remoteVideo.Enabled)
            {
                 var pos = getElementPosition("remoteVideo");
                 remoteVideo.SetVideoRect(pos.left+4, pos.top+4, pos.width-4, pos.height-4);   // rect мониторинга исходящего видео
            }
        }  
    }   
    /////////////////////////////////////////////////////////////////
    function Call_OnRemoteVideoState(videoControl)
    {
         if(videoControl.Enabled)
         {
             var pos = getElementPosition("remoteVideo");
            
             videoControl.SetVideoRect(pos.left+4, pos.top+4, pos.width-4, pos.height-4);   // rect мониторинга исходящего видео
         }
    }
    

    function Phone_OnLocalVideoState(videoControl)
    {
         if(videoControl.Enabled)
         {
         var pos = getElementPosition("localVideo");
         
         videoControl.SetVideoRect(pos.left+4, pos.top+4, pos.width-4, pos.height-4);   // rect мониторинга исходящего видео

         }
    }
	


function ResetHoldBtn()
{
    isHolded = false;
    btnHold.value = "Удержать";
}


    function btnCall_onclick() 
    {
        edtNumber.disabled = !edtNumber.disabled;
        if(!edtNumber.disabled)
        {
            TerminateCall();
            btnCall.value = "Позвонить";
        }
        else
        {
            MakeCall();
            btnCall.value = "Разорвать";
        }
    }

    function btnKey_onclick(val) 
    {
        if(Call)
        {
            try
            {
                Call.PlayDTMF(val, /* playback = true, проигрывать тон DTMF*/ true); 
            }
            catch(err)
            {
//             alert(err.description);
            }
        }
        else if(Phone)
        {
          
           Phone.PlaySound("TONE_"+val,false);
        }
        
        //edtNumber.value += val;
     
        //edtNumber.focus();
    }

    function btnHold_onclick()
    {
     try
     {
        if(isHolded)
        {
         Call.Unhold();
        }
        else
        {
         Call.Hold();
        }
       } 
       catch(err)
       {
//        alert(err.description);
       }
    }
    
