var _FirstTime = true;
var _msg = '';
var ws;
var _Waiting = false;
var _TimeoutID = 0;
var _Closing = false;
var _Presence = 'normal';

function HandleError(e)
{
	if(e.statusText == undefined)
	{
		alert(e.message);
	}
	else
	{
		alert(e.statusText);
	}
	messageWait();
}

function OnMessageWait(sessionID, data, xml, error) 
{	
	try
	{
		_Waiting = false;
		
		var re = new RegExp("<body>(.*)<\/body>");

		var m = re.exec(data);
		if (m != null) 
		{
			if (m[1] != '') 
			{
				AppendToMessageWindow(m[1], 'blue', true);
			}
		}
	}
	catch(e)
	{
		HandleError(e);
	}
}

function messageWait() 
{	
	try
	{		
		if(_Waiting == true)
			return;
			
		var hParams={};
		var bParams={};

		if (_SessionID != '') 
		{
			hParams['SessionID']=_SessionID;
			bParams['waitMilliseconds']='15000';			
			bParams['bGetWebChatMsgs'] = true;
			bParams['bGetWebChatCmds'] = false;
			
			ws['MessageWaitForIncoming'](hParams,bParams);	
			_Waiting = true;	
			
			clearTimeout(_TimeoutID);
			_TimeoutID = setTimeout('WatchTimeout()', 20000);
		}
	}
	catch(e)
	{
		HandleError(e);
	}
}

function SendPresence()
{
    var hParams={};
	var bParams={};

	hParams['SessionID']=_SessionID;
	bParams['showValue']=_Presence;
	bParams['longText']='';
	
    ws['PresenceSendAvailable'](hParams,bParams);  
}

function Unwrap(msg)
{
	msg = replaceAll(msg, "&lt;Message", "<Message");
	msg = replaceAll(msg, "&lt;/Message&gt;", "</Message>");
	msg = replaceAll(msg, "&gt;&lt;Body&gt;", "><Body>");
	msg = replaceAll(msg, "&lt;/Body&gt;", "</Body>");
	
	var xml = GetXMLObject(msg);		
	var msgnode = xml.getElementsByTagName('Message')[0];
	if(msgnode != null)
	{
		var lo = msgnode.getAttribute("From");
		if(lo != _LO)	
			return;

		var bodynode = msgnode.getElementsByTagName('Body')[0];
		if(bodynode != null)
		{			
			var txt;
			if(isIE)
				txt = bodynode.text;
			else
				txt = bodynode.textContent;
				
			txt = replaceAll(txt, "&lt;", "<");
			txt = replaceAll(txt, "&gt;", ">");
			txt = replaceAll(txt, "&amp;", "&");
				
			if(txt == '_GetContact_')
				return 'contact';
			else if(txt.indexOf('Name::', txt) != -1)
			{
				_Name = txt.substring(6, txt.length);
				document.getElementById('CurrentSessionID').innerText = _Name;
				
				return 'name';
			}
			
			return txt;	
		} 
	}		
}

function Wrap(msg)
{
	var xml = '<Message><Body>' + msg + '</Body></Message>';
	xml = escape(xml);
	
	return xml;
}

function GetXMLObject(xmlstring)
{
    var xmlobject;
    
    // code for IE
	if (window.ActiveXObject)
	{
        xmlobject=new ActiveXObject("Microsoft.XMLDOM");
        xmlobject.async="false";
        xmlobject.loadXML(xmlstring);
	}
	// code for Mozilla, Firefox, Opera, etc.
	else
	{
        var parser=new DOMParser();
        xmlobject=parser.parseFromString(xmlstring,"text/xml");
	}
	
	return xmlobject;
}

function replaceAll(str, look, replace)
{
    while(str.indexOf(look) != -1)
        str = str.replace(look, replace);
        
    return str;
}

function SendIfEnter(evt) 
{
    var charCode = (evt.which) ? evt.which : event.keyCode
	
    if (charCode == 13) 
    {
    	if(_LO.length > 0)
    		DoSendMessage();    		
    	return false;
    }
    
    return true;
}

function DoSendMessage()
{
	try
	{
		if(null == _SessionID || _SessionID.length == 0)
			return;
			
		var txt = document.getElementById('txtMessage').value;
		if(txt.length == 0)
			return;
			
		AppendToMessageWindow(txt, 'green', false);
		
		var hParams={};
		var bParams={};
		
		hParams['SessionID']=_SessionID;
		bParams['text']=Wrap(document.getElementById('txtMessage').value);  
		
		document.getElementById('txtMessage').value = ''; 

		bParams['toUser']=_LO;
		bParams['thread']='XMPP';		
		
		ws['MessageSend'](hParams,bParams);		
	}
	catch(e)
	{
		HandleError(e);
	}
}

function DoSendContact()
{
	try
	{
		var wsContact = new WebService(OnWebserviceCallback, window.location.protocol + '//' + window.location.host + '/mercury/webservices/XSitesDesktop.asmx');
		var hParams={};
		var bParams={};
		
		bParams['nPassportID']=_LO.split("@")[0];
		bParams['nAWSAccountsID']=_AWSAccountsID;
		bParams['strFirst']=document.getElementById('txtFirst').value;	
		bParams['strLast']=document.getElementById('txtLast').value;	
		bParams['strAddress']=document.getElementById('txtAddress').value;	
		bParams['strCity']=document.getElementById('txtCity').value;	
		bParams['strState']=document.getElementById('txtState').value;	
		bParams['strZip']=document.getElementById('txtZip').value;	
		bParams['strPhone']=document.getElementById('txtPhone').value;	
		bParams['strEmail']=document.getElementById('txtEmail').value;	
		
		wsContact['InsertContact'](hParams,bParams);	
		
		var msg = '<Message>';
		msg += '<System>New contact has been added:\r\n';
		msg += bParams['strFirst'] + ' ' + bParams['strLast'] + '\r\n';
		msg += bParams['strAddress'] + '\r\n';
		msg += bParams['strCity'] + ', ' + bParams['strState'] + ' ' + bParams['strZip'] + '\r\n';
		msg += bParams['strPhone'] + '\r\n';
		msg += bParams['strEmail'];
		msg += '</System>';		
		msg += '</Message>';
		msg = escape(msg);
	
		hParams['SessionID']=_SessionID;
		bParams['text']=msg;
		bParams['toUser']=_LO;
		bParams['thread']='XMPP';		
		
		ws['MessageSend'](hParams,bParams);		
		
		msg = '<Message>';
		msg += '<Name>';
		msg += bParams['strFirst'] + ' ' + bParams['strLast'];
		msg += '</Name>';
		msg += '</Message>';
		msg = escape(msg);
		
		bParams['text']=msg;		
		
		ws['MessageSend'](hParams,bParams);
	}
	catch(e)
	{
		HandleError(e);
	}
}

function AppendToMessageWindow(msg, color, unwrap) 
{	
	if(unwrap == true)
		msg = Unwrap(msg);
	
	if(msg != 'contact' && msg != 'name')
	{
		if (document.getElementById('outMessage').innerHTML.length > 0) 
			document.getElementById('outMessage').innerHTML=document.getElementById('outMessage').innerHTML + "<br>";
			
		var pref;
		if(unwrap)
			pref = "<b>" + _Name + " said:</b><br>";
		else
			pref = "<b>You said:</b><br>";
		
		document.getElementById('outMessage').innerHTML=document.getElementById('outMessage').innerHTML + "<font color='" + color + "'>" + pref + msg + "</font>";
		document.getElementById('outMessage').scrollTop = document.getElementById('outMessage').scrollHeight;
	}
	else if(msg == 'contact')
	{
		GetContactInfo();
	}	
}	

function DoLogin()
{
	try
	{		
		ws = new WebService(OnWebserviceCallback, window.location.protocol + '//' + window.location.host + '/chat/ws/SoapBoxWebService.asmx');
		
		var hParams={};
		var bParams={};

		hParams['SessionID']='';
		bParams['username']=_UID;
		bParams['password']='alamode';
		bParams['autocreate']=true;
		bParams['hostname']=_Server;    	

		ws['SessionLogin'](hParams,bParams);
	}
	catch(e)
	{
		HandleError(e);
	}
}

function WatchTimeout()
{
	if(true == _Waiting)
	{
		_Waiting = false;
		messageWait();	
	}
}

function DoLogout()
{
}

function OnWebserviceCallback(sessionID, data, xml, error)
{
	try
	{
		if(true == _Closing)
			return;
			
		if(data == null)
		{
			messageWait();
			return;
		}
			
		if(sessionID != null && _SessionID.length == 0)
			_SessionID = sessionID;
			
		var webService = GetResponseType(data);
	
		switch (webService)
		{
			case 'SessionLoginResponse':
				SendPresence();
				break;			
			case 'MessageWaitForIncomingResponse':				
				OnMessageWait(sessionID, data, xml, error);
				SendPresence();
				break;		
			case 'MessageSendResponse':
				messageWait();
				break;	
			case 'CancelMessageWaitForIncomingResponse':
				DoSendMessageEx();
				break;
			case 'PresenceSendAvailableResponse':			
				messageWait();
				break;
			case 'soap:Fault':
				alert(data);
				break;
			default:			
				break;
		}
	}
	catch(e)
	{
		HandleError(e);		
		messageWait();
	}
}

function GetResponseType(data)
{
	// code for IE
	if (window.ActiveXObject)
    {
        var xmlobject=new ActiveXObject("Microsoft.XMLDOM");
        xmlobject.async="false";
        xmlobject.loadXML(data);
    }
	// code for Mozilla, Firefox, Opera, etc.
	else
    {
        var parser=new DOMParser();
        var xmlobject=parser.parseFromString(data,"text/xml");
    }

	// get the XML root item
	var root = xmlobject.getElementsByTagName('Body');
	if(root[0] == null)
		root = xmlobject.getElementsByTagName('soap:Body');
		
	if(root[0] != null)
	{
		var responseType = root[0].firstChild;
		if (responseType)
			return responseType.nodeName;
		else
			return "";
	}
	else
		return "";
}

var isIE = (window.navigator.userAgent.indexOf("MSIE") > 0);
if (! isIE) 
	{
	HTMLElement.prototype.__defineGetter__("innerText", function () { return(this.textContent); });
	HTMLElement.prototype.__defineSetter__("innerText", function (txt) { this.textContent = txt; });
	}