/* to make an asynchronous call to the server, execute the call() function
 * with the URL to the script to be executed.  The second and third
 * parameters to call() define object and method to call when the server
 * returns its response ... if the second parameter is null, third is
 * just a function.  If second is an object, then the third is a method
 * of that instance.
 *
 * There is an optional fourth parameter to issue the request as a POST
 * to the server.  This is important in some browsers due to limited
 * URL length.
 *
 * The callback function is called when the request completes.  There is
 * currently no callback for errors so they just silently fail if the
 * server side script dies.  The callback function is passed a single
 * parameter, the text output of the server side script.  In ka-Map, this
 * text is typically some javascript to eval().
 */
var aXmlHttp = new Array();
var aXmlResponse = new Array();
function xmlResult()
{
	for(var i=0;i<aXmlHttp.length;i++)
	{
		if(aXmlHttp[i] && aXmlHttp[i][0] && aXmlHttp[i][0].readyState==4&&aXmlHttp[i][0].responseText)
		{
			//must null out record before calling function in case
			//function invokes another xmlHttpRequest.
			if(aXmlHttp[i][0].status == 200)
			{
				var f = aXmlHttp[i][2];
				var o = aXmlHttp[i][1];
				var s = aXmlHttp[i][0].responseText;
				aXmlHttp[i][0] = null;
				aXmlHttp[i][1] = null;
				aXmlHttp[i] = null;
				f.apply(o,new Array(s));
			}
			else
			{
				var f = aXmlHttp[i][2];
				var o = aXmlHttp[i][1];
				var s = "Error : " + aXmlHttp[i][0].status + " " + aXmlHttp[i][0].statusText;
				aXmlHttp[i][0] = null;
				aXmlHttp[i][1] = null;
				aXmlHttp[i] = null;
				f.apply(o,new Array(s));
			}
		}
	/*	else if((aXmlHttp[i][0].readyState==4) && (aXmlHttp[i][0].responseText.length == 0)) 
		{
			var f = aXmlHttp[i][2];
                        var o = aXmlHttp[i][1];
			var s = null;

			if(aXmlHttp[i][0].status == 0)
				s = "Error : Request Uninitialized";
			else
				s = (aXmlHttp[i][0].status).toString();

			aXmlHttp[i][0] = null;
			aXmlHttp[i][1] = null;
			aXmlHttp[i] = null;
			f.apply(o,new Array(s));
		}*/
	}
}

// u -> url
// o -> object (can be null) to invoke function on
// f -> callback function
// p -> optional argument to specify POST
function call(u,o,f)
{
	var method = "GET";
	var dat;

	if (arguments.length==4)
	{
		method = "POST";
		tmp = u.split(/\?/);
		u = tmp[0];
		dat = tmp[1];
	}

	var idx = aXmlHttp.length;
	for(var i=0; i<idx;i++)
	if (aXmlHttp[i] == null)
	{
		idx = i;
		break;
	}

	aXmlHttp[idx]=new Array(2);
	aXmlHttp[idx][0] = getXMLHTTP();
	aXmlHttp[idx][1] = o;
	aXmlHttp[idx][2] = f;

	if(aXmlHttp[idx])
	{
		try
		{
			aXmlHttp[idx][0].open(method,u,true);
		}
		catch(err1)
		{
			var s = "Error : Failed To Open Connection To The Server";
			var f = aXmlHttp[i][2];
			var o = aXmlHttp[i][1];
			aXmlHttp[idx][0] = null;
			aXmlHttp[idx][1] = null;
			aXmlHttp[idx] = null;
			f.apply(o,new Array(s));
			return false;
		}

		if(method == "POST")
		{
			aXmlHttp[idx][0].setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			aXmlHttp[idx][0].send(dat);
		}

		aXmlHttp[idx][0].onreadystatechange=xmlResult;

		if(method =="GET")
		{
			aXmlHttp[idx][0].send(null);
		}
	}
}


function getXMLHTTP()
{
	var A=null;

	if(!A && typeof XMLHttpRequest != "undefined")
	{
		A=new XMLHttpRequest();
	}

	if (!A)
	{
		try
		{
			A=new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch(e)
		{
			try
			{
				A=new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch(oc)
			{
				A=null;
			}
		}
	}

	return A;
}

/**
 * Defines the DOMParser object for IE
 */
if (typeof DOMParser == "undefined")
{
	DOMParser = function () {}

	DOMParser.prototype.parseFromString = function (str, contentType)
	{
		if (typeof ActiveXObject != "undefined")
		{
			var d = new ActiveXObject("MSXML.DomDocument");
			d.loadXML(str);
			return d;
		}
		else if (typeof XMLHttpRequest != "undefined")
		{
			var req = new XMLHttpRequest;
			req.open("GET", "data:" + (contentType || "application/xml") +
			";charset=utf-8," + encodeURIComponent(str), false);

			if (req.overrideMimeType)
			{
				req.overrideMimeType(contentType);
			}

			req.send(null);
			return req.responseXML;
		}
	}
}

