/* Copyright 2012 Virtual Interconnect Software, LLC.  All rights reserved. */
var ajaxRequests = new Array();

function AJAXRequestHandler(requestNum)
{
	var xmlDoc = false;
	
	function XMLDownloadDone()
	{
		window.status = "Processing...";
		if(ajaxRequests[requestNum].request && ajaxRequests[requestNum].request.readyState == 4)
		{
			//done with the request
			//see if it succeeded
			if(!ajaxRequests[requestNum].aborting && ajaxRequests[requestNum].request.status && ajaxRequests[requestNum].request.status == 200)
			{
				//download succeeeded
				//figure out which procedure needs to be called
				//and call it with the xml document node
				if(ajaxRequests[requestNum].callbackName != "" || ajaxRequests[requestNum].callbackFunc)
				{
					if(!ajaxRequests[requestNum].textMode)
					{
						//alert("Checking for XML");
						//alert(ajaxRequests[requestNum].request.responseXML);
						if(ajaxRequests[requestNum].request.responseXML && ajaxRequests[requestNum].request.responseXML.documentElement)
						{
							//alert("Getting xmlDoc");
							xmlDoc = ajaxRequests[requestNum].request.responseXML.documentElement;
						}
					}
					else
					{
						xmlDoc = ajaxRequests[requestNum].request.responseText;
					}
					//alert(xmlDoc);
					if(ajaxRequests[requestNum].callbackName)
					{
						eval(ajaxRequests[requestNum].callbackName + "(xmlDoc);");
					}
					else
					{
						if(typeof ajaxRequests[requestNum].callbackFunc == "object" && typeof ajaxRequests[requestNum].callbackFunc.oncomplete != "undefined")
						{
							ajaxRequests[requestNum].callbackFunc.oncomplete(xmlDoc);
						}
						else
						{
							ajaxRequests[requestNum].callbackFunc(xmlDoc);
						}
					}
				}
			}
			else
			{
				//download failed
				if(ajaxRequests[requestNum].callbackName != "")
				{
					eval(ajaxRequests[requestNum].callbackName + "(false);");
				}
				else if(ajaxRequests[requestNum].callbackFunc)
				{
					if(typeof ajaxRequests[requestNum].callbackFunc == "object" && typeof ajaxRequests[requestNum].callbackFunc.onerror != "undefined")
					{
						ajaxRequests[requestNum].callbackFunc.onerror(xmlDoc);
					}
					else
					{
						ajaxRequests[requestNum].callbackFunc(false);
					}
				}
			}
			ajaxRequests[requestNum].request.onreadystatechange = null;
			ajaxRequests[requestNum].request = null;
		}
		window.status = "Done";
	}
	return XMLDownloadDone;
}

function AJAXStripUnicode(inStr)
{
	var uint8 = new Uint8Array(inStr.length);
	for(var i = 0; i < inStr.length; ++i)
	{
		uint8[i] = inStr.charCodeAt(i) & 0xff;
	}
	return uint8.buffer;
}

function AJAXFormFilePostRequest(url, requestNum, postVars, postFiles, boundary, contentSoFar)
{
	if(postFiles.length > 0 && (typeof ajaxRequests[requestNum].fileNum == "undefined" || ajaxRequests[requestNum].fileNum < postFiles.length))
	{
		if(typeof ajaxRequests[requestNum].fileNum == "undefined")
		{
			ajaxRequests[requestNum].fileNum = 0;
		}
		var reader = new FileReader();
		reader.onload = function(e) {
					contentSoFar += "\r\n--" + boundary + "\r\n";
					contentSoFar += "Content-Disposition: form-data, name=\"File" + ajaxRequests[requestNum].fileNum + "\"; filename=\"" + postFiles[ajaxRequests[requestNum].fileNum].name + "\"\r\n";
					contentSoFar += "Content-Length: " + postFiles[ajaxRequests[requestNum].fileNum].size + "\r\n";
					contentSoFar += "Content-Type: application/octet-stream\r\n";
					contentSoFar += "\r\n"
					contentSoFar += e.target.result;
					++ajaxRequests[requestNum].fileNum;
					AJAXFormFilePostRequest(url, requestNum, postVars, postFiles, boundary, contentSoFar);
				};
		reader.readAsBinaryString(postFiles[ajaxRequests[requestNum].fileNum]);
	}
	else
	{
		//done collecting file data
		//submit it to the server
		for(var key in postVars)
		{
			contentSoFar = "\r\n--" + boundary + "\r\n" + "Content-Disposition: form-data, name=\"" + key + "\"\r\n\r\n" + postVars[key] + "\r\n" + contentSoFar;
		}
		contentSoFar += "\r\n--" + boundary + "--";
		
		ajaxRequests[requestNum].request.open("POST", url, true);
		ajaxRequests[requestNum].request.onreadystatechange = AJAXRequestHandler(requestNum);
		ajaxRequests[requestNum].request.setRequestHeader("Content-Type", "multipart/form-data;boundary=" + boundary);
		//ajaxRequests[requestNum].request.setRequestHeader("Content-Length", contentSoFar.length);
		ajaxRequests[requestNum].request.send(AJAXStripUnicode(contentSoFar));
	}
}

function AJAXRequestCore(url, newCallbackName, textMode, postVars, postFiles)
{
	var tempFunction;
	
	window.status = "Loading...";
	ajaxRequests[ajaxRequests.length] = new Object();
	if(typeof(XMLHttpRequest) == 'undefined')
	{
		ajaxRequests[ajaxRequests.length-1].request = new ActiveXObject("Microsoft.XMLHTTP");
	}
	else
	{
		ajaxRequests[ajaxRequests.length-1].request = new XMLHttpRequest();
	}
	
	if(ajaxRequests[ajaxRequests.length-1].request)
	{
		if(typeof(newCallbackName) == "string")
		{
			ajaxRequests[ajaxRequests.length-1].callbackName = newCallbackName;
		}
		else
		{
			ajaxRequests[ajaxRequests.length-1].callbackFunc = newCallbackName;
			if(typeof ajaxRequests[ajaxRequests.length-1].callbackFunc == "object" && typeof ajaxRequests[ajaxRequests.length-1].callbackFunc.onprogress != "undefined")
			{
				ajaxRequests[ajaxRequests.length-1].request.onprogress = ajaxRequests[ajaxRequests.length-1].callbackFunc.onprogress;
			}
			if(typeof ajaxRequests[ajaxRequests.length-1].callbackFunc == "object" && typeof ajaxRequests[ajaxRequests.length-1].callbackFunc.onuploadprogress != "undefined")
			{
				(ajaxRequests[ajaxRequests.length-1].request.upload ? ajaxRequests[ajaxRequests.length-1].request.upload : ajaxRequests[ajaxRequests.length-1].request).onprogress = ajaxRequests[ajaxRequests.length-1].callbackFunc.onuploadprogress;
			}
		}
		ajaxRequests[ajaxRequests.length-1].textMode = textMode;
		if(typeof postVars == "undefined" && typeof postFiles == "undefined")
		{
			ajaxRequests[ajaxRequests.length-1].request.open("GET", url + "&Rand=" + Math.random() * 9999, true);
			ajaxRequests[ajaxRequests.length-1].request.onreadystatechange = AJAXRequestHandler(ajaxRequests.length-1);
			ajaxRequests[ajaxRequests.length-1].request.send(" ");
		}
		else
		{
			if(typeof postFiles == "undefined" || postFiles.length < 1)
			{
				//no files - transmit as urlencoded
				var postStr = "";
				for(var key in postVars)
				{
					postStr += (postStr != "" ? "&" : "") + key + "=" + encodeURIComponent(postVars[key]);
				}
				ajaxRequests[ajaxRequests.length-1].request.open("POST", url, true);
				ajaxRequests[ajaxRequests.length-1].request.onreadystatechange = AJAXRequestHandler(ajaxRequests.length-1);
				ajaxRequests[ajaxRequests.length-1].request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				ajaxRequests[ajaxRequests.length-1].request.send(postStr);
			}
			else
			{
				//we have files to transmit
				var boundary = "--------MULTIPARTREQUESTBOUNDARY" + Math.floor(Math.random(0, 9999999)) + (new Date()).getTime();
				AJAXFormFilePostRequest(url, ajaxRequests.length - 1, postVars, postFiles, boundary, "");
			}
		}
	}
}

function RequestXML(url, newCallbackName, postVars, postFiles)
{
	AJAXRequestCore(url, newCallbackName, false, postVars, postFiles);
}

function RequestText(url, newCallbackName, postVars, postFiles)
{
	AJAXRequestCore(url, newCallbackName, true, postVars, postFiles);
}

function AJAXCancelAll()
{
	for(var i=0; i<ajaxRequests.length; ++i)
	{
		if(ajaxRequests[i].request && ajaxRequests[i].request.abort)
		{
			ajaxRequests[i].aborting = true;
			ajaxRequests[i].request.abort();
		}
	}
}


