var g_eventsProcessingEnabled = false;
var g_lastEventId = null;

function getLastEvent()
{
	if (g_lastEventId == null)
	{
		// g_lastEventId still not initialized on this page, read it from cookie, and initialize
		if ((g_params[ "lasteventid" ] == null) || (g_params[ "lasteventid" ] == ""))
		{
			return "-1";
		}
		
		return g_lastEventId = g_params[ "lasteventid" ];
	}
	else
	{
		return g_lastEventId;
	}
}

function setLastEvent(value)
{
	g_lastEventId = escape( value );
	document.cookie = "lasteventid=" + g_lastEventId + ";";
}

function stopEventsProcessing()
{
	g_eventsProcessingEnabled = false;
	clearTimeout( g_getNewEventsTimer );
	g_getNewEventsTimer = null;
}

function parseXml(xml)
{
	var dom = null;
	if (window.ActiveXObject)
	{
		try
		{
			dom = new ActiveXObject('Microsoft.XMLDOM');
			dom.async = false;
			dom.loadXML( xml );
			
			return dom;
		} 
		catch (e)
		{
			window.status = "Couldn't parse xml using Microsoft.XMLDOM: " + e;			
			dom = null;
		}
	}
	
	if (window.DOMParser)
	{
		try
		{ 
			dom = (new DOMParser()).parseFromString(xml, "text/xml"); 
		} 
		catch (e)
		{
			dom = null;
		}
	}
	else 
	{
		window.status = "Cannot parse xml string!";
	}
	
	return dom;
}

function getNewEvents()
{
	var xmlHttp = new XMLHttpRequest();
	var returnValue = false;
	xmlHttp.open( "POST", getMethodUrl( "Game/Events", "GetEvents" ), true);
	xmlHttp.onreadystatechange = function()
	{
		if (xmlHttp.readyState == 4)
		{
			try {
				if (xmlHttp.status == 200)
				{
					var xml = null;
					var returnValue = xmlHttp.responseXML.getElementsByTagName( "string" );
					if (returnValue != null)
					{
						if ((returnValue[ 0 ] == null) && (returnValue.context != null) && (returnValue.context.text != null))
						{
							xml = parseXml( returnValue.context.text );
						}
						else if ((returnValue[ 0 ].textContent != null) && (returnValue[ 0 ].textContent != ""))
						{
							xml = parseXml( returnValue[ 0 ].textContent );
						}
						else if (returnValue[ 0 ].firstChild != null)
						{
							xml = parseXml( returnValue[ 0 ].firstChild.data );
						}
					}

					if (xml != null)
					{
						x = xml;
						var json = xml2json( xml, "" );
						eval( "var events = " + json);
						if (events.ArrayOfEvent.Event.length == null)
						{
							try
							{
								if (!g_eventsProcessingEnabled)
								{
									return;
								}
								
								setLastEvent( events.ArrayOfEvent.Event[ "@EventId" ]);
								eval( "on" + events.ArrayOfEvent.Event["@xsi:type"] + "(events.ArrayOfEvent.Event)" );
							}
							catch (e)
							{				
								try
								{
									onEvent( events.ArrayOfEvent.Event["@xsi:type"], events.ArrayOfEvent.Event );
								}
								catch (e) {}
							}
						}
						else
						{
							for (var i=0; i<events.ArrayOfEvent.Event.length; i++)
							{
								try
								{
									if (!g_eventsProcessingEnabled)
									{
										return;
									}
									
									setLastEvent( events.ArrayOfEvent.Event[ i ][ "@EventId" ]);
									eval( "on" + events.ArrayOfEvent.Event[ i ]["@xsi:type"] + "(events.ArrayOfEvent.Event[ i ])" );
								}
								catch (e)
								{
									try
									{
										onEvent( events.ArrayOfEvent.Event[ i ]["@xsi:type"], events.ArrayOfEvent.Event[ i ] );
									}
									catch (e) {}
								}
							}
						}
					}
				}
				else
				{
					alert( getMethodUrl( service, method ) + "(" + parameters + ")\rError code: " + xmlHttp.status + "\rResponse:\r\r" + xmlHttp.responseText );
				}
			}
			catch (e)
			{			
				window.status = "getNewEvents error: " + e;
			}
			
			if (g_eventsProcessingEnabled)
			{
				setTimeout( "getNewEvents()", 1, "javascript" );
			}
		}
	}
	
	var lastEventId = getLastEvent();
	xmlHttp.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
	xmlHttp.send( "sessionId=" + getSessionId() + "&lastReceivedEvent=" + lastEventId );
}

var g_getNewEventsTimer = null;
function startEventsProcessing()
{
	if (!g_eventsProcessingEnabled)
	{
		g_eventsProcessingEnabled = true;
		g_getNewEventsTimer = setTimeout( "getNewEvents()", 1, "javascript" );
	}
}