
var oTicket = null;
var ticketCallback = null; // you must assign the ticket callback object in your ticket.js!

// this function is similar to GetTicket but it recieves its guid (having been initiated on the server)
// instead of initiating on the client
function DF_RecieveTicket(iTicketTimeout, ticketID)
{
//	alert("DF_RecieveTicket()");
	// simulate what is done in DF_GetTicket
	oTicket = new Object();
	// setup timeout handler (because we may timeout before getting our ticket)
	oTicket.TimeoutTimerID = window.setTimeout("DF_HandleTicketTimeout()", iTicketTimeout);
	oTicket.PollCount = 0;
	// simulate what is done in DF_HandleGetTicketResponse
	oTicket.TicketID = ticketID;
	var iFirstPollInterval = ticketCallback.fnHandleTicketIssued(oTicket.TicketID);
	oTicket.XmlHttp = null;
	//	setup polling timer (handleTicketPoll)
	oTicket.PollTimerID = window.setTimeout("DF_HandleTicketPoll()", iFirstPollInterval);
}

function DF_GetTicket(iTicketTimeout)
{
//	alert("DF_GetTicket()");
	oTicket = new Object();
	// setup timeout handler (because we may timeout before getting our ticket)
	oTicket.TimeoutTimerID = window.setTimeout("DF_HandleTicketTimeout()", iTicketTimeout);
	oTicket.PollCount = 0;
	oTicket.XmlHttp = DF_GetXmlHttpObject();
	if (oTicket.XmlHttp != null)
	{
		var sParams = ticketCallback.fnGetTicketParams();
		// http post (handleGetTicketResponse)
		oTicket.XmlHttp.open("POST", ticketCallback.sTicketPostUrl);
		oTicket.XmlHttp.onreadystatechange = DF_HandleGetTicketResponse;
		oTicket.XmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); 
		oTicket.XmlHttp.send("op=0&" + sParams);
	}
}

function DF_HandleGetTicketResponse()
{
//	alert("DF_HandleGetTicketResponse()");
	if (oTicket != null)
	{
		if (oTicket.XmlHttp.readyState == 4)
		{
			// obtain result
			if (oTicket.XmlHttp.status == 200)
			{
				// handle success: save ticket for async. work
				oTicket.TicketID = oTicket.XmlHttp.responseText;
				var iFirstPollInterval = ticketCallback.fnHandleTicketIssued(oTicket.TicketID);
				oTicket.XmlHttp = null;
				//	setup polling timer (handleTicketPoll)
				oTicket.PollTimerID = window.setTimeout("DF_HandleTicketPoll()", iFirstPollInterval);
			}
			else
			{
				var sHttpStatus = oTicket.XmlHttp.status;
				DF_ClearTicket();
				ticketCallback.fnHandleNoTicketIssued(sHttpStatus);
			}
		}
	}
}

function DF_HandleTicketPoll()
{
//	alert("DF_HandleTicketPoll()");
	if (oTicket != null)
	{
		DF_ClearPollTimer();
		oTicket.PollCount++;
		DF_GetTicketStatus();
		// dont setup our next poll yet, wait until we get back our ticket status response
	}
}

function DF_GetTicketStatus()
{
//	alert("DF_GetTicketStatus()");
	if (oTicket.XmlHttp != null && oTicket.XmlHttp.readyState != 4)
	{
		// we are still waiting for a response from our last poll,
		// we may never hear back from the server, so prepare for another poll...
//		alert("removing pending (" + oTicket.XmlHttp.readyState + ") XmlHttp request");
		oTicket.XmlHttp.abort();
		oTicket.XmlHttp = null;
	}
	oTicket.XmlHttp = DF_GetXmlHttpObject();
	if (oTicket.XmlHttp != null)
	{
		var sParams = "TicketID=" + oTicket.TicketID;
		oTicket.XmlHttp.onreadystatechange = DF_HandleGetTicketStatusResponse;
		oTicket.XmlHttp.open("POST", ticketCallback.sTicketPostUrl);
		oTicket.XmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); 
		oTicket.XmlHttp.send("op=1&" + sParams);
	}
}

function DF_HandleGetTicketStatusResponse()
{
//	alert("DF_HandleGetTicketStatusResponse()");
	if (oTicket == null)
	{
//		alert("ticket is null");	// do nothing, no more polling
	}
	else
	{
		if (oTicket.XmlHttp.readyState != 4)
		{
//			alert("not ready " + oTicket.XmlHttp.readyState);
		}
		else	// readyState 4
		{
//			alert("status = " + oTicket.XmlHttp.status);
			// obtain result
			if (oTicket.XmlHttp.status == 200)		// 200 indicates "Completed"
			{		
				// call back the user function with the raw XmlHttp
				var oXmlHttp = oTicket.XmlHttp;		// save what we need
				DF_ClearTicket();
				ticketCallback.fnHandleCompletedTicket(oXmlHttp);	// no more polling
				oXmlHttp = null;
			}
			else if (oTicket.XmlHttp.status == 202)	// 200 "Accepted", for us indicates continue polling
			{
//				alert("continue poll");
				var iNextPollInterval = ticketCallback.fnHandleContinuePolling(oTicket.PollCount, oTicket.TicketID);
				// do we need to setup another poll now?  yes, we dont want to have 
				// overlapping pollings so we use "one shot" timer, not an interval timer
				DF_ClearPollTimer();
				oTicket.PollTimerID = window.setTimeout("DF_HandleTicketPoll()", iNextPollInterval);
			}
			else	// any other status (likely 500) indicates there was a problem
			{	
				var sStatus = oTicket.XmlHttp.status;	// save what we need
				DF_ClearTicket();
				ticketCallback.fnHandlePollFailed(sStatus);	// no more polling
			}
		}
	}
}

function DF_ClearPollTimer()
{
//	alert("DF_ClearPollTimer()");
	if (oTicket != null)
	{
		if (oTicket.PollTimerID != null)
			window.clearTimeout(oTicket.PollTimerID);
		oTicket.PollTimerID = null;
	}
}

function DF_ClearTicketTimers()
{
//	alert("DF_ClearTicketTimers()");
	DF_ClearPollTimer();
	if (oTicket != null)
	{
		if (oTicket.TimeoutTimerID != null)
			window.clearTimeout(oTicket.TimeoutTimerID)				
		oTicket.TimeoutTimerID = null;
	}
}

// clears the ticket from the client only
function DF_ClearTicket()
{
//	alert("DF_ClearTicket");
	if (oTicket != null)
	{
		DF_ClearTicketTimers();
		oTicket = null;					
	}
}

function DF_HandleTicketTimeout()
{
	if (oTicket != null)
	{
		var sTicketID = oTicket.TicketID;
		DF_ClearTicket();
		ticketCallback.fnHandleTimedOutTicket();
	}	
}

function DF_GetXmlHttpObject() 
{
	try 
	{
		oXmlHttp = new XMLHttpRequest();
	} 
	catch(e) 
	{
		try 
		{
			oXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
		} 
		catch(e)
		{
		}
	}
	return oXmlHttp;
}