/***************************/
/*** AJAX Core Functions ***/
/***************************/


var sScriptElementQueue = new Array();
var xmlHttpRequests = new Array();
var xmlHttpRequestsScriptOnly = new Array();

var bShowLoadingScreen = false;
var sAJAXOutputDivName = "divAdminContent";
var sAJAXOutputDivDefaultName = "divAdminContent";
var sLoadingAnimation = "<img src='http://i34.tinypic.com/1pbfqc.gif' id='LoadingDiv' alt='' width = '20px' border='0' />";


function executeQueuedScripts()
{
	for (var i = 0; i < sScriptElementQueue.length; i++)
	{
		try
		{
			eval(sScriptElementQueue[i]);
		}
		catch (ex)
		{
			alert(ex.description + "\r\n\r\nAJAX Script Parse Failed!\r\n\r\n" + sScriptElementQueue[i]);
		}

		sScriptElementQueue.splice(i, 1);

		i--;
	}
}

function getXmlHttpObject()
{
	var xmlHttp = false;

	if (window.XMLHttpRequest)
	{
		// Firefox, Opera 8.0+, Safari
		xmlHttp = new XMLHttpRequest();

		if (xmlHttp.overrideMimeType)
		{
			xmlHttp.overrideMimeType("text/html");
		}
	}
	else
	{
		if (window.ActiveXObject)
		{
			// Internet Explorer
			try
			{
				xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (e)
			{
				try
				{
					xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (e)
				{
					// AJAX failed!
					alert("Error creating AJAX object!");
				}
			}
		}
	}

	return xmlHttp;
}

function loadRemoteScript(sURL)
{
	var xmlRequest = false;

	xmlRequest = getXmlHttpObject();

	if (!xmlRequest)
	{
		return false;
	}

	if (bShowLoadingScreen)
	{
		showLoadingScreen(sAJAXOutputDivName);
	}

	xmlRequest.onreadystatechange = scriptResponse;
	xmlRequest.open("GET", sURL + "?uid=" + Math.random(), true);
	xmlRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xmlRequest.setRequestHeader("Content-length", 0);
	xmlRequest.setRequestHeader("Connection", "close");
	xmlRequest.send(null);

	xmlHttpRequests.push(xmlRequest);

	return true;
}

function runRemoteScriptGet(sURL, sParams)
{
	var xmlRequest = false;

	xmlRequest = getXmlHttpObject();

	if (!xmlRequest)
	{
		return false;
	}

	if (bShowLoadingScreen)
	{
		showLoadingScreen(sAJAXOutputDivName);
	}

	sURL = sURL + "?uid=" + Math.random() + "&" + sParams;
	xmlRequest.onreadystatechange = scriptResponse;
	xmlRequest.open("GET", sURL, true);
	xmlRequest.send(null);

	xmlHttpRequests.push(xmlRequest);

	return true;
}

function runRemoteScriptPost(sURL, sDataIn)
{
	// USE: encodeURIComponent() around each field!!!

	var xmlRequest = false;

	xmlRequest = getXmlHttpObject();

	if (!xmlRequest)
	{
		return false;
	}

	if (bShowLoadingScreen)
	{
		showLoadingScreen(sAJAXOutputDivName);
	}

	xmlRequest.onreadystatechange = scriptResponse;
	xmlRequest.open("POST", sURL, true);
	xmlRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xmlRequest.setRequestHeader("Content-length", sDataIn.length);
	xmlRequest.setRequestHeader("Connection", "close");
	xmlRequest.send(sDataIn);

	xmlHttpRequests.push(xmlRequest);

	return true;
}

function runRemoteScriptPostNoResponse(sURL, sDataIn)
{
	var xmlRequest = false;

	xmlRequest = getXmlHttpObject();

	if (!xmlRequest)
	{
		return false;
	}

	xmlRequest.open("POST", sURL, true);
	xmlRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xmlRequest.setRequestHeader("Content-length", sDataIn.length);
	xmlRequest.setRequestHeader("Connection", "close");
	xmlRequest.send(sDataIn);

	return true;
}

function runRemoteScriptPostScriptResponseOnly(sURL, sDataIn)
{
	// USE: encodeURI() around each value!!!

	var xmlRequest = false;

	xmlRequest = getXmlHttpObject();

	if (!xmlRequest)
	{
		return false;
	}

	xmlRequest.onreadystatechange = scriptResponseScriptOnly;
	xmlRequest.open("POST", sURL, true);
	xmlRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xmlRequest.setRequestHeader("Content-length", sDataIn.length);
	xmlRequest.setRequestHeader("Connection", "close");
	xmlRequest.send(sDataIn);

	xmlHttpRequestsScriptOnly.push(xmlRequest);

	return true;
}

function scriptParseAndExecute(sResponse)
{
	var sScriptElements = new Array();

	while (sResponse.indexOf("<script") > -1 || sResponse.indexOf("</script") > -1)
	{
		var s = sResponse.indexOf("<script");
		var s_e = sResponse.indexOf(">", s);
		var e = sResponse.indexOf("</script", s);
		var e_e = sResponse.indexOf(">", e);

		sScriptElements.push(sResponse.substring(s_e + 1, e));

		sResponse = sResponse.substring(0, s) + sResponse.substring(e_e + 1);
	}

	for (var i = 0; i < sScriptElements.length; i++)
	{
		try
		{
			eval(sScriptElements[i]);
		}
		catch (ex)
		{
			alert(ex.description + "\r\n\r\nAJAX Script Parse Failed!\r\n\r\n" + sScriptElements[i]);
		}
	}

	if (sResponse.substring(0, 15) == "Database error:")
	{
		alert(sResponse.replace("<br />", "\r\n"));
	}

	// Return the cleaned source:
	return sResponse;
}

function scriptParseAndQueue(sResponse)
{
	while (sResponse.indexOf("<script") > -1 || sResponse.indexOf("</script") > -1)
	{
		var s = sResponse.indexOf("<script");
		var s_e = sResponse.indexOf(">", s);
		var e = sResponse.indexOf("</script", s);
		var e_e = sResponse.indexOf(">", e);

		sScriptElementQueue.push(sResponse.substring(s_e + 1, e));

		sResponse = sResponse.substring(0, s) + sResponse.substring(e_e + 1);
	}

	if (sResponse.substring(0, 15) == "Database error:")
	{
		alert(sResponse.replace("<br />", "\r\n"));
	}

	// Return the cleaned source:
	return sResponse;
}

function scriptResponse(str)
{
	for (var i = 0; i < xmlHttpRequests.length; i++)
	{
		if (xmlHttpRequests[i].readyState == 4)
		{
			if (xmlHttpRequests[i].status == 200)
			{
				sResponse = xmlHttpRequests[i].responseText;

				if (sResponse == "LOGON_ERROR")
				{
					self.location.replace("/Logon.aspx");
				}
				else
				{
					if (!document.getElementById(sAJAXOutputDivName))
					{
						sAJAXOutputDivName = sAJAXOutputDivDefaultName;
						return;
					}

					document.getElementById(sAJAXOutputDivName).innerHTML = sResponse;
					sResponse = scriptParseAndExecute(sResponse);

					//sResponse = scriptParseAndQueue(sResponse);
					//document.getElementById(sAJAXOutputDivName).innerHTML = sResponse;
				}

				sResponse = "";
			}
			else
			{
				try
				{
					sResponse = xmlHttpRequests[i].responseText;

					if (document.getElementById(sAJAXOutputDivName))
					{
						document.getElementById(sAJAXOutputDivName).innerHTML = sResponse;
					}
				}
				catch (ex)
				{
				}
			}

			sAJAXOutputDivName = sAJAXOutputDivDefaultName;

			xmlHttpRequests.splice(i, 1);

			i--;
		}
	}
}

function scriptResponseScriptOnly(str)
{
	for (var i = 0; i < xmlHttpRequestsScriptOnly.length; i++)
	{
		if (xmlHttpRequestsScriptOnly[i].readyState == 4)
		{
			if (xmlHttpRequestsScriptOnly[i].status == 200)
			{
				sResponse = xmlHttpRequestsScriptOnly[i].responseText;

				if (sResponse == "LOGON_ERROR")
				{
					self.location.replace("/Logon.aspx");
				}
				else
				{
					sResponse = scriptParseAndExecute(sResponse);
				}

				sResponse = "";
			}
			else
			{
				try
				{
					sResponse = xmlHttpRequestsScriptOnly[i].responseText;

					if (sResponse == "")
					{
						if (xmlHttpRequestsScriptOnly[i].status != 12029)
						{
							alert("Ajax error " + xmlHttpRequestsScriptOnly[i].status);
						}
					}
					else
					{
						alert(sResponse);

						if (document.getElementById(sAJAXOutputDivName))
						{
							document.getElementById(sAJAXOutputDivName).innerHTML = sResponse;
						}
					}
				}
				catch (ex)
				{
				}

				sResponse = "";
			}

			xmlHttpRequestsScriptOnly.splice(i, 1);

			i--;
		}
	}
}

function showLoadingScreen()
{
	if (document.getElementById(sAJAXOutputDivName))
	{
		document.getElementById(sAJAXOutputDivName).innerHTML = sLoadingAnimation;
	}
}
