//Central variables for AjaxFunctions
var oCallObjects		=	new Array();

/**
 * This functions add a new Ajax Call Request to the collection and executes it immediately
 *
 * @param string sUrl
 * @param string sParams
 * @param string sMethod
 * @param string sSender
 * @param string sFunction
 * @return void
 */
function AddCallRequest(sUrl, sParams, sMethod, sSender, sFunction)
{
	sUrl									+=	(sMethod == "POST")	? "" : "?" + sParams;
	var sSend								=	(sMethod == "POST")	? sParams : null;
	var oCall								=	CreateCallObject();
	oCall.onreadystatechange				=	CatchCallRequestResult;
	oCall.open(sMethod, sUrl, true);
	if (sMethod == "POST")
	{
		oCall.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		oCall.setRequestHeader("Content-length", sParams.length);
		oCall.setRequestHeader("Connection", "close");
	}
	oCall.send(sSend);
	oCallObjects[oCallObjects.length]		=	new Array(oCall, sSender, sFunction, false);
}

/**
 * This is the centralized function to handle the readyState changes of all ajax call requests. It does not function for a specific call request. Rather, it is executed when one of several call requests
 * experiences a readyState change. It then loops through the array of call requests, looking for unfinished call requests. Upon finding a call request that has not been finished yet, it locks it and 
 * eval's the handling function that has been defined for the call request.
 *
 */
function CatchCallRequestResult()
{
	for (var iObj = 0; iObj < oCallObjects.length; iObj++)
	{
		var oCall							=	oCallObjects[iObj][0];
		if (oCall == null)					{	continue;	}
		if (oCallObjects[iObj][3] == true)	{	continue;	}
		oCallObjects[iObj][3]				=	true;
		if (oCall.readyState == 4)
		{
			var sCode						=	(String(oCallObjects[iObj][1]).length > 0)	?	oCallObjects[iObj][1]+"."+oCallObjects[iObj][2]	:	oCallObjects[iObj][2];
			if (String(sCode).length > 4)	{	eval(sCode);	}
			oCallObjects[iObj][0]			=	null;
		}
		oCallObjects[iObj][3]				=	false;
	}
}

/**
 * The place where all call requests are born.........
 * 
 */
function CreateCallObject()
{
	var CallObject							=	null;
	if (window.XMLHttpRequest)
	{
		try									{	CallObject		=	new XMLHttpRequest();						}
		catch(e)							{																	}
	}
	else if (window.ActiveXObject)
	{
		try									{	CallObject		=	new ActiveXObject("Msxml2.XMLHTTP");		}
		catch(e)
		{
			try								{	CallObject		=	new ActiveXObject("Microsoft.XMLHTTP");		}
			catch(e)						{																	}
		}
	}
	return CallObject;
}

/**
 * This function serializes a JavaScript XML object into a string and returns it.
 * 
 */
function Xml2String(oXml)
{
	if (window.XMLHttpRequest)
	{
		var oSerializer	=	new XMLSerializer();
		return escapeSpecialEntities(oSerializer.serializeToString(oXml));
	}
	else
	{
		return escapeSpecialEntities(oXml.xml);
	}
}

function string2Xml(sXml)
{
	if (window.ActiveXObject)								// code for IE
	{
		var oXml	=	new ActiveXObject("Microsoft.XMLDOM");
		oXml.async	=	"false";
		oXml.loadXML(sXml);
	}
	else													// code for Mozilla, Firefox, Opera, etc.
	{
		var	oParser	=	new DOMParser();
		var	oXml	=	oParser.parseFromString(sXml, "text/xml");
	}

	return oXml;
}

function XMLSerializer() {/* empty constructor */};
XMLSerializer.prototype =
{
	toString: function() {return "[object XMLSerializer]"},
	serializeToString: function($root)	{ return $root.xml || $root.outerHTML; },
	serializeToStream: new Function		// not supported
};

function escapeSpecialEntities(sXml)
{
	var aEscapes				= new Array();
	aEscapes[aEscapes.length]	= new Array("*amp;",	/&amp;/g);
	aEscapes[aEscapes.length]	= new Array("*quot;",	/&quot;/g);
	aEscapes[aEscapes.length]	= new Array("*apos;",	/&apos;/g);
	aEscapes[aEscapes.length]	= new Array("*lt;",		/&lt;/g);
	aEscapes[aEscapes.length]	= new Array("*gt;",		/&gt;/g);

	for (var r = 0; r < aEscapes.length; r++)
	{
 		sXml = sXml.replace(aEscapes[r][1], aEscapes[r][0]);
	}

	return sXml;
}


function doSessionStorage(sKey, sVal)
{
	var sUrl			=	"/ajax/storeValue.php";
	var sMethod			=	"POST";
	var sFunction		=	"doReportSessionStorage(oCall.responseXML);";
	var sParams			=	sKey+"="+sVal;
	
	AddCallRequest(sUrl, sParams, sMethod, "", sFunction);
}

function doFullSessionStorage()
{
	if (bIsSubmit == true)
	{
		return;
	}
	
	var sUrl			=	"/ajax/store.php";
	var sMethod			=	"POST";
	var sFunction		=	"doReportSessionStorage(oCall.responseXML);";
	var sParams			=	"cmd=store&fc_id="+iCycleId;
	
	var aElements		=	document.forms[0].elements;
	for (var iElement = 0; iElement < aElements.length; iElement++)
	{
		var oObj		=	aElements[iElement];
		sParams		+=	"&"+oObj.name+"="+getValueById(oObj.id);
	}
	AddCallRequest(sUrl, sParams, sMethod, "", sFunction);
}

function doReportSessionStorage(oXml)
{
	var oXmlData		=	oXml.getElementsByTagName('SessionResult')[0].getElementsByTagName('Stored');
}
