//**************************************************************************************************
//**************************************************************************************************
//****************************** SURF AND CALL FUNCTIONS AND VARIABLES *****************************
//**************************************************************************************************
//**************************************************************************************************



//***********************************************************************************************
//	Enumerator values used in Surf&Call events:
//***********************************************************************************************


/////////////////////////////	Session states:
//
//	Used in		- OnCallStatus( X, *)	- First param:
var CES_RESOLVING				= 1;
var CES_INVITE      			= 2;
var CES_REMOTE_ACCEPT			= 3;
var CES_REMOTE_ALERT			= 4;
var CES_CONNECT					= 5;
var CES_DISCONNECTING			= 6;
var CES_DISCONNECTED			= 7;


/////////////////////////////	Local Disconnect Reasons:
//
//	Used in		- OnCallStatus( CES_DISCONNECTING, X) - Second param:
var LDR_USER_HANGUP				= 1;
var LDR_GENERAL_ERR				= 2;
var LDR_INVALID_PARAMS			= 3;
var LDR_GET_SELF_IP_ERR			= 4;
var LDR_GK_LRJ_UNDEFINED		= 5;
var LDR_GK_LRJ_NOT_FOUND		= 6;
var LDR_GK_LRJ_AUTH_FAIL		= 7;
var LDR_GK_LRJ_AUTHZ_FAIL		= 8;
var LDR_GK_LRJ_NOT_REGISTERED	= 9;
var LDR_GK_TIMEOUT				= 10;
var LDR_GK_DNS_ERR				= 11;
var LDR_GK_NETWORK				= 12;
var LDR_EP_SETUP_TIMER			= 13;
var LDR_EP_ESTABLISHMENT_TIMER	= 14;
var LDR_AUDIO_IN_DEVICE_ERR		= 15;
var LDR_AUDIO_OUT_DEVICE_ERR	= 16;
var LDR_AUDIO_IN_ERR			= 17;
var LDR_AUDIO_OUT_ERR			= 18;
var LDR_RTP_TIMEOUT				= 19;
var LDR_RTCP_TIMEOUT			= 20;
var LDR_BAD_QUALITY				= 21;


/////////////////////////////	Remote Disconnect Reasons:
//						
//	Used in		- OnCallStatus( CES_DISCONNECTED, X) - Second param:
var RDR_INVALID				= 0; 
var RDR_BUSY				= 1; 
var RDR_NOANSWER		    = 5; 
var RDR_NOTONLINE		   	= 6; 
var RDR_DENIED				= 7; 
var RDR_OURHANGUP		   	= 8; 
var RDR_HANGUP				= 9;  
var RDR_CPUSLOW				= 13; 
var RDR_LOST				= 16;
var RDR_GTWCALLERROR		= 26;

/////////////////////////////	Audio states:
//						
//	Used in		- OnAudioStatus( X, *) - First param:							    
var AES_PLAY_RUN			= 1;
var AES_PLAY				= 2;
var AES_PLAY_IDLE			= 3;
var AES_PLAY_STOP			= 4;
var AES_RECORD_RUN			= 5;
var AES_RECORD				= 6;
var AES_RECORD_IDLE			= 7;
var AES_RECORD_STOP			= 8;



/////////////////////////////	General status:
//						
//	Used in		- OnGeneralStatus( X, y, z) - First param:
var GES_FIREWALL				= 0;
var GES_REMOTEECHO				= 1;
var GES_BADCALLQUALITY			= 2;
var GES_HALFDUPLEXSTATE			= 3;
var GES_INVISIBLEHALFDUPLEX		= 4;
var GES_SHAREDCONTROL			= 5;
var GES_NOSOUNDCARD				= 6;

/////////////////////////////	Firewall Detection:
//	OnGeneralStatus( GES_FIREWALL, y, z)
//
//		Values for 'y':
//
//			RDR_NOTONLINE	    - No answer from Gateway	('z'==0)
//
//			RDR_OURHANGUP	    - Values for 'z':
//				
//				LDR_GK_TIMEOUT		- Gatekeeper failed to answer within timeout
//				
//				LDR_EP_SETUP_TIMER	- Gateway failed to answer within timeout
//				
//				LDR_RTP_TIMEOUT		- No RTP packets where received within timeout
//				
//				LDR_RTCP_TIMEOUT	- No RTCP packets where received within timeout



/////////////////////////////	Duplexity detection:
//	OnGeneralStatus( GES_HALFDUPLEXSTATE, y, 0)
//
//		Values for 'y':		Boolean
//			
//			1 (TRUE)	-	State is HalfDuplex
//			
//			0 (FALSE)	-	State is FullDuplex



//////////////////////////////////////////// Network statistics :
//
//
var NS_CURRENT_LOCAL_PACKETLOST		= 0;
var NS_CURRENT_REMOTE_PACKETLOST	= 1; 
var NS_AVERAGE_LOCAL_PACKETLOST		= 2;
var NS_AVERAGE_REMOTE_PACKETLOST	= 3;
var NS_DELAY						= 4;

//////////////////////////////////////////// Button parameters :
//
//
var ButtonX;
var ButtonY; 
var ButtonBGColor;
var ButtonName;
var ButtonIP;
var ButtonDest;


//***********************************************************************************************
//  Function Name : SncNotSupported 
//  description   : called if no support for SnC is found.
//  return(Void)  : None. 
//***********************************************************************************************
function SncNotSupported(){
    // Insert your error code here..
	alert("Surf&Call not supported");
}
//***********************************************************************************************


//***********************************************************************************************
//  Function Name : AddButton 
//  description   : add a SnC button to the page.
//  return(Void)  : None. 
//***********************************************************************************************
function AddButton()
{
	Browser = GetBrowser();
	if (Browser == "MSIE")
		AddExplorerButton();
	else if (Browser == "NETSCAPE") 
		AddNetscapeTag();
	else
		SncNotSupported();
}



//***********************************************************************************************
//  Function Name : ExplorerButton 
//  description   : Show/Update/Install the Surf&Call object for Internet explorer.
//  return(Void)  : None. 
//***********************************************************************************************
function AddExplorerButton()
{
	document.write("<OBJECT id='" + ButtonName +"'");
	document.write(" CLASSID    ='CLSID:AEFD32B6-4815-11D2-98E4-00C04FCEFE77'");
	document.write(" standby    ='Loading Surf&CallŪ Components...'");
	document.write(" type       ='application/x-oleobject'");
	document.write(" WIDTH      =" +ButtonX);
	document.write(" HEIGHT     =" +ButtonY+ ">");
	document.write("<PARAM NAME='GatekeeperIP'  VALUE='" +ButtonIP+ "'>");
	document.write("<PARAM NAME='DestID' VALUE='" +ButtonDest+"'>");
	document.write("<PARAM NAME='BackgroundColor' VALUE='" +ButtonBGColor+"'>");
	document.write("</OBJECT>");


	// Handle events:
	document.write("<SC"+"RIPT LANGUAGE='JavaScript' FOR=" +ButtonName+ " EVENT='OnStatusString(msg)' >");
	document.write("OnStatusString( msg);");
	document.write("</SC"+"RIPT>");

	document.write("<SC"+"RIPT LANGUAGE='JavaScript' FOR=" +ButtonName+ " EVENT='OnCallStatus( siCode, siReason)'>");
	document.write("OnCallStatus( siCode, siReason);");
	document.write("</SC"+"RIPT>");

	document.write("<SC"+"RIPT LANGUAGE='JavaScript' FOR=" +ButtonName+ " EVENT='OnAudioStatus( siCode, siReason)' >");
	document.write("OnAudioStatus( siCode, siReason);");
	document.write("</SC"+"RIPT>");

	document.write("<SC"+"RIPT LANGUAGE='JavaScript' FOR=" +ButtonName+ " EVENT='OnDTMFRecieved( sDTMFs)' >");
	document.write("OnDTMFRecieved( sDTMFs);");
	document.write("</SC"+"RIPT>");

	document.write("<SC"+"RIPT LANGUAGE='JavaScript' FOR=" +ButtonName+ " EVENT='OnDTMFSent( sDTMFs)' >");
	document.write("OnDTMFSent( sDTMFs);");
	document.write("</SC"+"RIPT>");

	document.write("<SC"+"RIPT LANGUAGE='JavaScript' FOR=" +ButtonName+ " EVENT='OnPreCall()' >");
	document.write("OnPreCall();");
	document.write("</SC"+"RIPT>");    
}

//***********************************************************************************************



//***********************************************************************************************
//  Function Name : AddNetscapeTag
//  description   : Insert a Netscape-EMBED tag for the plugin.
//  return(Void)  : None. 
//***********************************************************************************************
function AddNetscapeTag()
{
    document.write("<EMBED "); 
    document.write(" NAME ='" +ButtonName+ "' "); 
    document.write(" WIDTH ='" +ButtonX+    "' "); 
    document.write(" HEIGHT ='" +ButtonY+    "' ");
    document.write(" TYPE ='application/x-VocalTec-Surf&Call'");
    document.write(" GatekeeperIP ='" +ButtonIP+ "'");
    document.write(" DestID ='" +ButtonDest+       "'");
    document.write(" BackgroundColor ='" +ButtonBGColor+      "'");
	document.write(" SrcName = xxx");
	document.write(" AudioSettingsRunOnce =1");
	document.write(" Visible ="+ButtonShown);
    document.write(">");
}
//***********************************************************************************************


//***********************************************************************************************
//  Function Name : InsertSnCBtn
//  description   : Initializes parameters for button insertion, and calls the AddButton function
//  return(Void)  : None. 
//***********************************************************************************************

function InsertSnCBtn(name,IP,Dest,bgColor,invisible)
{
	//if (ns) navigator.plugins.refresh(false);
	Platform = GetPlatform();
	
    if(Platform == "Win32")
    {
		if (checkVersion())
		{
			if (ie)
				file2download = MSIE_SncFile;
			else
				file2download = Netscape_SncFile;
			document.write("Plug-In is not installed in your system. You may either <a href=\""+file2download+"\">download and install it yourself</a> or <a href=# onClick=\"javascript:window.open(\'DownloadWin.html\',\'Download\',\'resizable=no,status=yes,scrollbars=no,menubar=no,width=400,height=150,top=100,left=200\')\">launch its automatic installation</a>.");
//			downloadWin = window.open("DownloadWin.html","Download","resizable=no,status=yes,scrollbars=no,menubar=no,width=400,height=150,top=100,left=200");
//			downloadWin.focus();
		}
		else insertButton(name,IP,Dest,bgColor,invisible);
	}
	else SncNotSupported();
}

//***********************************************************************************************


function insertButton(name,IP,Dest,bgColor,invisible)
{
	var x= 33;
	var y= 33;
	ButtonShown="true";
	if (invisible)
	{
		x=0;
		y=0;
		ButtonShown="false";
	}	
	ButtonX = x;
	ButtonY = y;
	ButtonBGColor = bgColor;
	ButtonName = name;
	ButtonIP = IP;
	ButtonDest = Dest;
	AddButton();
}



//***********************************************************************************************
//  Surf&Call Event Handlers:
//***********************************************************************************************
function OnStatusString( str)
{
    window.status = str;
}

// Call status had changed:
function OnCallStatus( siCode, siReason)
{
    // Insert your handler code here..
}

// General event had occured:
function OnGeneralStatus( siCode, siReason, siMore)
{
	if( GES_HALFDUPLEXSTATE == siCode)
	{
		//	if( 1 == siReason)
		//		alert( 'HalfDuplex');
		//  else
		//		alert( 'FullDuplex');
	}

	if(siCode == GES_NOSOUNDCARD)
	{
		alert('This machine has no sound card !!');
	}

	
	if( siCode ==  GES_FIREWALL )
	{
		if(siReason == 0 )  // no answer from the Gateway
			alert( 'Gateway is not answering' );
		else //if( siReason == RDR_OURHANGUP )  // SnC hanged-up the call
		{
			switch (siMore)
			{
				case LDR_GK_TIMEOUT:
					confirm( 'you maybe behind firewall - GK timeout');
					break;

				case LDR_EP_SETUP_TIMER:
					confirm( 'you maybe behind firewall - GW did not answer' );
					break;

				case LDR_RTP_TIMEOUT:
					confirm( 'you maybe behind firewall - No RTP packets received' );
					break;

				case LDR_RTCP_TIMEOUT:
					confirm( 'you maybe behind firewall - No RTCP packets received' );
					break;

				default:				
					break;
			};
		}
	}
}

// Audio event had occured:
function OnAudioStatus( siCode, siReason)
{
    // Insert your handler code here..
}

// Recieved DTMFs:
function OnDTMFRecieved( sDTMFs)
{
    // Insert your handler code here..
}

// DTMF had been sent (not through the API):
function OnDTMFSent( sDTMFs)
{
     // Insert your handler code here..
}

// Called before the call is initiated:
function OnPreCall()
{
     // Insert your handler code here..
}

//****************************************************************************
//***		A P I    C a l s											   ***
//****************************************************************************

function NewStringTable(sStringPath)
{
	if(GetBrowser() == "MSIE")
		document.SnC_01.StringTable = sStringPath;
	else
		document.SnC_01.PutStringTable(sStringPath);
}



function NetworkStatistics(Stat)
{
	switch (Stat)
	{
		case NS_CURRENT_LOCAL_PACKETLOST:
			if(GetBrowser() == "MSIE")
				val = document.SnC_01.NSCurrentLocalPacketLoss;
			else
				val = document.SnC_01.GetNSCurrentLocalPacketLoss();
			break;


		case NS_CURRENT_REMOTE_PACKETLOST:
			if(GetBrowser() == "MSIE")
				val = document.SnC_01.NSCurrentRemotePacketLoss;
			else
				val = document.SnC_01.GetNSCurrentRemotePacketLoss();
			break;

		case NS_AVERAGE_LOCAL_PACKETLOST:
			if(GetBrowser() == "MSIE")
				val = document.SnC_01.NSAverageLocalPacketLoss;
			else
				val = document.SnC_01.GetNSAverageLocalPacketLoss();
			break;


		case NS_AVERAGE_REMOTE_PACKETLOST:
			if(GetBrowser() == "MSIE")
				val = document.SnC_01.NSAverageRemotePacketLoss;
			else
				val = document.SnC_01.GetNSAverageRemotePacketLoss();
			break;


		case NS_DELAY:
			if(GetBrowser() == "MSIE")
				val = document.SnC_01.NSDelay;
			else
				val = document.SnC_01.GetNSDelay();
			break;


		default:				
			break;
	};

	return val;
}