/**************************************************************************
*  Copyright (c) 2005 Cogent Software Solutions, Inc.
*  All Rights Reserved.
*
*  File Name:  Ajax.js
*
*  File Description:
*
*  Revision History:
*
*  Author          Date        Description
*  M. Warble       10/24/05    Initial Release.
*
**************************************************************************/
var xmlRequest;
var currentAjaxRequest;
var requestQueue = new Array();
var requestInProgress = false;


//***************************************************
//**  Request Management Layer
//***************************************************
function sendAjaxGetRequest(action, callback, clientData)
{
	var request = new Object();
	
	request.type = "GET";
	request.action = action;
	request.callback = callback;
	request.clientData = clientData;

	if (requestInProgress == false)
	{
		return sendXmlHttpGetRequest(request);
	}	
	else
	{
		queueAjaxRequest(request);
	}
}


function sendAjaxPostRequest(action, parameters, callback, clientData)
{
	var request = new Object();
	
	request.type = "POST";
	request.action = action;
	request.parameters = parameters;
	request.callback = callback;
	request.clientData = clientData;

	if (requestInProgress == false)
	{
		return sendXmlHttpPostRequest(request);			
	}	
	else
	{
		queueAjaxRequest(request);
	}
}


function queueAjaxRequest(request)
{
	requestQueue.push(request);
}

function processAjaxResponse(ajaxResponse)
{
	currentAjaxRequest.callback(ajaxResponse);
	
	processNextAjaxRequest();
}

function processNextAjaxRequest()
{
	if (requestQueue.length > 0)
	{
		var request = requestQueue.shift();
		
		if (request.type == "GET")
		{
			return sendXmlHttpGetRequest(request);
		}
		else if (request.type == "POST")
		{
			return sendXmlHttpPostRequest(request);
		}
		else
		{
			// error
		}
	}
}	


//***************************************************
//**  Transport Layer
//***************************************************
function sendXmlHttpGetRequest(ajaxRequest)
{
	currentAjaxRequest = ajaxRequest;

	xmlRequest = getXmlHttpRequestObject();
	
	if (ajaxRequest.callback == null || ajaxRequest.clientData == null)
	{
		xmlRequest.open("GET", ajaxRequest.action, false);
		xmlRequest.send(null);
	
	    var ajaxResponse = new Object();

		ajaxResponse.text = xmlRequest.responseText;
		ajaxResponse.xml  = xmlRequest.responseXML;

		return ajaxResponse;
	}
	else
	{	
		requestInProgress = true;
	
		xmlRequest.open("GET", ajaxRequest.action, true);
	
		xmlRequest.onreadystatechange = onXmlHttpResponse;
		
		xmlRequest.send(null);
	}
	
}

function sendXmlHttpPostRequest(ajaxRequest)
{
	currentAjaxRequest = ajaxRequest;

	xmlRequest = getXmlHttpRequestObject();
	
	if (ajaxRequest.callback == null || ajaxRequest.clientData == null)
	{
		xmlRequest.open("POST", ajaxRequest.action, false);
		xmlRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		xmlRequest.send(ajaxRequest.parameters);
	
	    var ajaxResponse = new Object();

		ajaxResponse.text = xmlRequest.responseText;
		ajaxResponse.xml  = xmlRequest.responseXML;

		return ajaxResponse;
	}
	else
	{
		requestInProgress = true;
			
		xmlRequest.open("POST", ajaxRequest.action, true);
			
		xmlRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			
		xmlRequest.onreadystatechange = onXmlHttpResponse;
			
		xmlRequest.send(ajaxRequest.parameters);
	}
}


function onXmlHttpResponse()
{
	if (xmlRequest.readyState == 4 && xmlRequest.status == 200)
	{
		requestInProgress = false;
	
	    var ajaxResponse = new Object();

		ajaxResponse.text = xmlRequest.responseText;
		ajaxResponse.xml  = xmlRequest.responseXML;
		ajaxResponse.clientData = currentAjaxRequest.clientData;

		processAjaxResponse(ajaxResponse);
	}
}


function getXmlHttpRequestObject() 
{
	var xmlHttpRequestObject = null;

	/*@cc_on
	@if (@_jscript_version >= 5)
	{
		try 
		{
			xmlHttpRequestObject = new ActiveXObject("Msxml2.XMLHTTP");
		} 
		catch (e) 
		{
			try 
			{
				xmlHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
			} 
			catch (e) 
			{
				xmlHttpRequestObject = null;
			}
		}
	}

	@end @*/

	if (!xmlHttpRequestObject && typeof XMLHttpRequest != 'undefined') 
	{
		try 
		{
			xmlHttpRequestObject = new XMLHttpRequest();
		} 
		catch (e) 
		{
			xmlHttpRequestObject = null;
		}
	}
	
	return xmlHttpRequestObject;
}