var UaState=99;
var usNone=0;
var usAlerting=1;
var usBusy=10;
var usCancelling=11;
var usConnected=12;
var usDialing=13;
var usDisconnected=14;
var usEnter=18;
var usExit=19;
var usHeld=20;
var usInfoRequest=21;
var usInfoResponse=22;
var usNeedAuth=23;
var usProceeding=24;
var usReceivedText=25;
var usRegDone=26;
var usRegFail=27;
var usRegTimeout=28;
var usReject=30;
var usRingback=32;
var usTimeOut=35;
var usWaiting=38;

var DialNumber;
var BusyID;
var PrevState=99;
var isConnect=0;
var ErrDrop=0;

function OnStateChanged()
{
   try{
	if(Softphone.Status != UaState)
	{
		PrevState=UaState;
		UaState=Softphone.Status;
		if(!isConnect) return;

		ErrDrop=0;
		switch(UaState)
		{
			case usRegDone: UpdateState(MsgRegDone,0); DoMakeCallStep2(); break;
			case usDialing: UpdateState(MsgDial,0); break;
			case usProceeding: UpdateState(MsgProceed,0); break;
			case usRingback: UpdateState(MsgRing,0); PlaySound(sLOOP,"ringback.wav"); break;
			case usConnected: UpdateState(MsgConnect,0); PlaySound(sSTOP,""); break;
			case usHeld: UpdateState(MsgOnHold,0); PlaySound(sLOOP,"hold.wav"); break;
			case usRegTimeout: UpdateState(MsgTimeout,0); setFlag(0,1); break;
			case usRegFail: UpdateState(MsgRegFail,0); setFlag(0,1); break;
			case usDisconnected:
				PlaySound(sSTOP,"");
				setFlag(0,1);
				switch(PrevState)
				{
					case usNone:
					case usNeedAuth:
					case usRegDone: UpdateState(MsgSvrBusy,2); break;
					case usDialing: UpdateState(MsgOffline,2); break;
					case usProceeding: UpdateState(MsgBusy,2); break;
					case usRingback: UpdateState(MsgReject,2); break;
					case usHeld:
					case usConnected: UpdateState(MsgDropped,2); break;
				}
				break;
		}
		if(ErrDrop) setErrDrop("DoHangUp()",4000);
	} }catch(e){}
}

function setFlag(x,y)
{
	isConnect=(y)? 0 : x;
	ErrDrop=(x)? 0 : y;
}

function clrErrDrop()
{
	PlaySound(sSTOP,"");
	window.clearTimeout(BusyID);
}

function setErrDrop(funct,ms)
{
	PlaySound(sLOOP,"busy.wav");
	BusyID=window.setTimeout(funct,ms);
}

function SignOut()
{
	if(isConnect)
	{
		DoHangUp();
		event.returnValue="Closing the window when a call is still connected can cause your browser " +
		  "to become unstable.\nWe regarded your action as a desire to drop the call and has cancelled it.";
	}
}

function DoMakeCall()
{
	if(DialNumber=="0") return;
	if(ErrDrop) clrErrDrop();
	if(isConnect) return;

	setFlag(1,0);
	UpdateState(MsgReg,1);
	DoLogin();
}

function DoLogin()
{
   try{ Softphone.Login(); }catch(e){}
}

function DoUnlogin()
{
   try{ Softphone.UnLogin(); }catch(e){}
   delay(800);
}

function DoMakeCallStep2()
{
   try{ Softphone.MakeCall(DialNumber); }catch(e){}
}

function DoHangUp()
{
	if(ErrDrop||isConnect)
	{
		if(ErrDrop)
		{
			clrErrDrop();
			setFlag(0,0);
			DoUnlogin();
			UpdateState(MsgReady,1);
		}
		else
		{
			PlaySound(sSTOP,"");
			DoDropCall();
			setFlag(0,0);
			UpdateState(MsgCancel,1);
			DoUnlogin();
			setErrDrop("UpdateState(MsgReady,1)",2000);
		}
	}
}

function DoDropCall()
{
	try{ Softphone.DropCall(); }catch(e){}
	delay(1500);
}

// Display Status Routines
var Ps=0;
function UpdateState(txt,byp)
{
	var Ds=1,Sc=0;
	switch(byp)
	{
		case 0:
			switch(UaState)
			{
				case usRegDone:
				case usRegFail:
				case usRegTimeout: Ds=2; break;
				case usDialing: Ds=3; break;
				//case usProceeding: Ds=4; break;
				case usRingback: Ds=4; break;
				case usHeld: Ds=4; Sc=1; break;
				case usConnected: Ds=5; break;
				case usDisconnected: Ds=6; break;
				default: Ds=0;
			}
			break;
		case 1: clrErrDrop(); Ps=0; break;
		case 2: Sc=1;
	}
	if(Ds==(Ps+1)||Sc)
	{
		document.getElementById("StateTxt").value=txt;
		Ps=Ds;
	}
}

// Sound/DMTF Routines
var sLOOP=-1;
var sPLAY=0;
var sSTOP=2;
function PlaySound(w,z)
{
	if(w==sSTOP){ w=0; z="silence.mid"; }
   Sound.loop=w;
   Sound.src="sound/"+z;
}

function DoSendTone(x)
{
	try{
		if(UaState==usConnected)
		{
			Softphone.SendDTMFTone(x);
			PlaySound(sPLAY,(x+".wav"));
		}
	}catch(e){}
}

document.onkeydown = function keyPress(evt)
{
	if(!isConnect) return;
	var KeyID=(window.event)? window.event.keyCode : evt.which;
	if(KeyID>=48 && KeyID<=57)
		DoSendTone(KeyID-48); // 0-9
	else if(KeyID==35)
		DoSendTone(101); // #
	else if(KeyID==42)
		DoSendTone(100); // *
}

// General Routines
function delay(g)
{
   var x=new Date().getTime();
   var now=x;
   while((now-x)<g){ now=new Date().getTime(); }
}

function Init_E800(dest)
{
	DialNumber=dest;
	window.setInterval("OnStateChanged()", 200);
	UpdateState(MsgReady,1);
}
