///////////////////////////////////////////////
function utils_FormatRound(variable,precision){

	var strRet = new String("");

	//Get precision and make the multiplier
	var Prec = parseInt(precision);
	var Pow = Math.pow(10,Prec);

	// Round to correct precision
	var Num2 = parseFloat(variable);
	Num2 = Math.round(Num2 * Pow);
	Pow = Math.pow(10,-Prec);
	Num2 = Num2*Pow;
                        
	// Add or subtract digits to right of decimal point
	strRet = new String(Num2);
	var pnt = new RegExp("[.]","gi");
	var p = strRet.split(pnt);

	if(p.length == 2){
		var prec = new String(p[1]);		  
		while(prec.length < Prec){
			// add zeros
		    strRet += "0";
		    prec += "0";
		}
		if(prec.length > Prec){
			// discard js Garbage
			strRet = strRet.substring(0,strRet.length + Prec - prec.length);
		}
	}  
	else{
		// append precision
		strRet += ".";
		for(var i=0;i<Prec;i ++){strRet += "0";}
	}            
	return strRet;
}
///////////////////////////////////////////////
function utils_WriteServerName(htmlStr){
	document.write(utils_ReplaceServerName(htmlStr));
	return 0;
}
///////////////////////////////////////////////
function utils_RetrieveQryStrValue(QryStr,NameOfValue){

	QryStr = QryStr.replace(/ /g,"");

	var i = 0;
	var LenOfQryStr;
	var QryStrValue = "";
	var PositionOfValue = QryStr.indexOf(NameOfValue); 
		
	if (PositionOfValue != -1)
	{
		PositionOfValue += (NameOfValue.length+1);
		LenOfQryStr = QryStr.length;
		for(i=PositionOfValue;i<LenOfQryStr;i++){
			if(QryStr.charAt(i)!="&"){
				 QryStrValue+=QryStr.charAt(i);}
			else break;
		}
	}

	return QryStrValue;
}
///////////////////////////////////////////////
function utils_RetrieveCookieValue(CookiesStr,NameOfCollection,NameOfValue){

	//LOGIC:FUNCTION EXPECTS TO RECEIVE:
	//		[1]unescaped COOKIE STR
	//		[2]NO NAME-VALUE PAIRS WITH EMPTY STRING

	//DEFAULTS
	var counter = 0;
	var bHasEnd = false;
	var valCookie = "";
	var intPosValue = 0;

	//DATA
	var searchStr = CookiesStr;
	var lenSearchStr = searchStr.length;

	//IF COLLECTION REPLACE searchStr WITH COLLECTION SUBSTRING
	if(NameOfCollection != ""){
		searchStr = utils_RetrieveCollString(searchStr,NameOfCollection)
		lenSearchStr = searchStr.length;
	}

	//IF VALUE EXISTS
	if(searchStr.indexOf(NameOfValue) != -1){
		intPosValue = searchStr.indexOf(NameOfValue) + (NameOfValue.length+1);
		for(counter=intPosValue;counter<=lenSearchStr;counter++){
			bHasEnd = (counter>intPosValue) && ((searchStr.charAt(counter)=="&") || (searchStr.charAt(counter)==";"));
			if(bHasEnd){
				break;
			}
			else{
				valCookie=valCookie + searchStr.charAt(counter);
			}
		}
	}
	return valCookie;
}
///////////////////////////////////////////////
function utils_WriteTempCookie(strCollection,strName,strValue){

	//INIT
	var strCookies = document.cookie;
	var strColEquals = (strCollection != "") ? "=" : "";
	var strColStr = "";
	var intPosCol = 0;
	var strOldVal = "";	
	var strNew = "";

	//PARAM CHECK
	if(strName != "" && strValue != "" ){
		//COOKIES EXIST ?
		if(strCookies != ""){
			//WANT TO WRITE COLLECTION	
			if(strCollection != ""){
				//COLLECTION EXISTS
				if((strColStr=utils_RetrieveCollString(strCookies,strCollection)) != ""){
					//IF ALREADY HAS A VALUE FOR strName - REPLACE
					if((strOldVal=utils_RetrieveCookieValue(strCookies,strCollection,strName)) != ""){
						strNew = strColStr.replace(strName + "=" + strOldVal,strName + "=" + strValue);
						document.cookie = strNew; 
					}
					else{
						strNew = strColStr + "&" + strName + "=" + strValue;
						document.cookie = strNew; 
					}
				}
				//NEW COLLECTION
				else{
					document.cookie = strCollection + strColEquals + strName + "=" + strValue;
				}
			}
			//COOKIE OUTSIDE COLLECTION
			else{
				document.cookie = strName + "=" + strValue;
			}
		}
		//NEW COOKIE
		else{
			document.cookie = strCollection + strColEquals + strName + "=" + strValue;
		}
	}
}
///////////////////////////////////////////////
function utils_RetrieveCollString(strCookies,strNameOfCollection){

	var strRetVal = "";	
	var strTemp = "";
	var intNameLen = strNameOfCollection.length;
	var intPosCol;
	var intPosOfEndOfCol;

	//NAME IS IN STRING
	if((intPosCol = strCookies.indexOf(strNameOfCollection)) != -1){
		//NAME IS NOT MEMBER OF OTHER COLLECTION
		if((intPosCol!=0) && (strCookies.charAt(intPosCol-1) == "=" || strCookies.charAt(intPosCol-1) == "&")){
			strRetVal = "";
		}
		else{
			//GET FROM BEGINNING OF NAME TO END OF COOKIE
			strRetVal = strCookies.substr(intPosCol,strCookies.length - intPosCol);
			//IF END OF COOKIE ISN'T END OF COLLECTION
			if((intPosOfEndOfCol = strRetVal.indexOf(";")) != -1){
				strRetVal = strRetVal.substr(0,intPosOfEndOfCol);
			}
			//IF HAS NO MEMBERS THEN ISN'T COLLECTION
			strTemp = strRetVal.substr(intNameLen + 1,strRetVal.length);
			if(strTemp.indexOf("=") == -1){
				strRetVal = "";
			}
		}
	}
	return strRetVal;
}
///////////////////////////////////////////////
function utils_myUrlBase64Encode(str) {

	//	BASE64 URL ENCODING INTERFACE 
	//	According to URL encoding rules where every char is converted
	//	into %xx equivalent (similar to escape() except that encodes all
	//	chars not just special ones). eg."foo@example.com" becomes 
	//	"%66%6F%6F%40%65%78%61%6D%70%6C%65%2E%63%6F%6D".

	var i = 0;
	var octet = 0;
	var result = "";
	var sextet = 0;
	var leftovers = 0;

	for (i=0; i < str.length; i++) {
		octet = str.charCodeAt(i);
		switch( i % 3 ){
			case 0:{
				//0xFC = 11111100 ; 0x03 = 00000011
				sextet = ( octet & 0xFC ) >> 2 ;
				leftovers = octet & 0x03 ;

				// sextet = first char in quadruple
				break;
			}
			case 1:{
				//0xF0 = 11110000 ; 0x0F = 00001111
				sextet = ( leftovers << 4 ) | ( ( octet & 0xF0 ) >> 4 );
				leftovers = octet & 0x0F ;

				// sextet = 2nd char in quadruple
				break;
			}
			case 2:{
				//0xC0 = 11000000 ; 0x3F = 00111111
				sextet = ( leftovers << 2 ) | ( ( octet & 0xC0 ) >> 6 ) ;
				leftovers = ( octet & 0x3F ) ;

				// sextet = 3rd char in quadruple
				// leftovers = 4th char in quadruple
				break;
			}
		}

		result = result + utils_base64ToAscii(sextet);

		// 4th character if exists
		if( (i % 3) == 2 ){ result = result + utils_base64ToAscii(leftovers);}

	}

	// leftovers and padding
	switch( str.length % 3 ){
		case 0:	{
			// even multiple of 3
			break ;
		}
		case 1:	{
			// one 6-bit char plus 2 leftover bits
			leftovers =  leftovers << 4 ;
			result = result + utils_base64ToAscii(leftovers);
			result = result + "==";
			break ;
		}
		case 2:	{
			// two 6-bit chars plus 4 leftover bits
			leftovers = leftovers << 2 ;
			result = result + utils_base64ToAscii(leftovers);
			result = result + "=";
			break ;
		}
	}

	return result;
}
///////////////////////////////////////////////
function utils_base64ToAscii(c){

	var theChar = 0;
	if (0 <= c && c <= 25){
		theChar = String.fromCharCode(c + 65);
	}
	else if (26 <= c && c <= 51){
		theChar = String.fromCharCode(c - 26 + 97);
	}
	else if (52 <= c && c <= 61){
		theChar = String.fromCharCode(c - 52 + 48);
	}
	else if (c == 62){
		theChar = '+';
	}
	else if( c == 63){
		theChar = '/';
	}
	else{
		theChar = String.fromCharCode(0xFF);
	}

	return theChar;
}
///////////////////////////////////////////////
function utils_myUrlBase64Decode(str) {

	//BASE64 DECODING INTERFACE
	return utils_myBase64Decode(str,false);

}
///////////////////////////////////////////////
function utils_myBase64Decode(str,is_binary) {

	var x;
	var i = 0;
	var count = -1;
	var result = "";
	var shiftreg = 0;

	for (i=0; i < str.length; i++) {
		c = str.charAt(i);
		if ('A' <= c && c <= 'Z')
			x = str.charCodeAt(i) - 65;
		else if ('a' <= c && c <= 'z')
			x = str.charCodeAt(i) - 97 + 26;
		else if ('0' <= c && c <= '9')
			x = str.charCodeAt(i) - 48 + 52;
		else if (c == '+')
			x = 62;
		else if (c == '/')
			x = 63;
		else
			continue;

		count++;

		switch (count % 4){
		case 0:
			shiftreg = x;
			continue;
		case 1:
			v = (shiftreg<<2) | (x >> 4);
			shiftreg = x & 0x0F;
			break;
		case 2:
			v = (shiftreg<<4) | (x >> 2);
			shiftreg = x & 0x03;
			break;
		case 3:
			v = (shiftreg<<6) | (x >> 0);
			shiftreg = x & 0x00;
			break;
		}

		if (!is_binary && (v < 32 || v > 126) && (v != 0x0d) && (v != 0x0a)) {
			result = result + "<";
			result = result + "0123456789ABCDEF".charAt((v/16)&0x0F);
			result = result + "0123456789ABCDEF".charAt((v/1)&0x0F);
			result = result + ">";
		}
		else
			result = result + String.fromCharCode(v);

	}
	return result.toString();
}
///////////////////////////////////////////////
function utils_myUrlBinaryDecode(strx) {

	var str = utils_myBase64Decode(strx,true);
	return utils_hexdump(str,0,0);

}
///////////////////////////////////////////////
function utils_hexdump(str,i,max) {

	var result = "";
	var start = i;
	var ascii_dump = "";

	if (max <= 0)
		max = str.length;

	while (i < str.length && i < max) {
		var c = str.charCodeAt(i);
		result = result + utils_hexcode(c);
		if (c > 32 && c < 127)
			ascii_dump = ascii_dump + str.charAt(i);
		else
			ascii_dump = ascii_dump + '.';
		if (((i-start) % 8) == 7) 
			result = result + " ";
		if (((i-start) % 16) == 15) {
			result = result + " " + ascii_dump + "\n";
			ascii_dump = "";
		}
		i++;
	}

	while (((i-start) % 16) != 15) {
		result = result + "  ";
		if (((i-start) % 8) == 7) 
			result = result + " ";
		ascii_dump = ascii_dump + " ";
		i++;
	}
	result = result + "    " + ascii_dump + "\n";
	return result;
}
///////////////////////////////////////////////
function utils_hexcode(x) {

	var result = "";
	result = result + "0123456789ABCDEF".charAt((x/16)&0x0F);
	result = result + "0123456789ABCDEF".charAt((x/1)&0x0F);
	return result;
}
///////////////////////////////////////////////
function utils_ReplaceIllegals(str){

	str = str.replace("+","_");
	str = str.replace("/","-");
	str = str.replace(/=/g,"*");
	return str;

}
///////////////////////////////////////////////
function utils_RetrieveDialerDownload(strOS,intDialerID,strHost,strDirectory){

	var strRet = "";
	if(strOS=="95"){
		strRet = strHost + "/" + strDirectory + "/dialer5.1/ID" + intDialerID + "/production/PCPhoneSetup.exe";
	}
	else if(intDialerID==91 || intDialerID==3){
		strRet = strHost + "/" + strDirectory + "/iConnectHere/iConnectHere_SoftPhone_v8.exe";
	}
	else{
		strRet = strHost + "/" + strDirectory + "/dialer5.2.3.4/id" + intDialerID + "/PCPhone.exe";
	}
	return strRet;
}
///////////////////////////////////////////////
function utils_RetrieveDialerDownload_iCallHere(strOS,intDialerID,strHost,strDirectory){

	var strRet = "";
	if(strOS=="95"){
		strRet =  "/download/dialer5.1/ID" + intDialerID + "/production/PCPhoneSetup.exe";
	}
	else{
		strRet = "/download/icallhere/SoftPhone_Client_v8.exe";
	}
	return strRet;
}

///////////////////////////////////////////////
function utils_RetrieveDialerDownload_iCallHerebeta(strOS,intDialerID,strHost,strDirectory){

	var strRet = "";
	{
		strRet = "/Download/icallhere/SoftPhone_Client_v8.exe";
	}
	return strRet;
}

///////////////////////////////////////////////
function utils_RetrieveDialerDownload_iCallHere3_3(strOS,strHost,strDirectory){

	var strRet = "";

		strRet =  + strDirectory + "/dialer3.3/PC2PhoneSetup.exe";

	return strRet;
}
///////////////////////////////////////////////
