// Implements support for async callbacks (ajax)
//

// returns an XmlHttpRequest object, dependent on the browser support
function imhAsync_GetXMLHttpRequest() 
{
	// on non-IE browsers we return an XMLHttpRequest object, also works on IE7
	if (window.XMLHttpRequest) 
		return new XMLHttpRequest();
		
	// on IE we may have cached the ProgID to use ...
	if (window.imhAsync_XMLHttpRequestProgID) 
		return new ActiveXObject(window.imhAsync_XMLHttpRequestProgID);
	// ... else we search for it now - we would like to use the most capable XML object installed on the client
	var progIDs = ["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
	for (var i = 0; i < progIDs.length; ++i) 
	{
		var progID = progIDs[i];
		try 
		{
			var x = new ActiveXObject(progID);
			window.imhAsync_XMLHttpRequestProgID = progID;
			return x;
		} 
		catch (e) 
		{ // we silently eat the exception by design
		}
	}
	return null;
}

// decodes the result or errorstatus of the XMLHttpRequest object after a completed request
function imhAsync_DecodeResult(requestObject)
{
	var res = {"value":null, "error":null };
	if (requestObject.status != 200)
		res.error = requestObject.status + ' ' + requestObject.statusText;
	else
		res.value = requestObject.responseText;
	return res;
}

// initiates a server-side callback, and setups client callbacks, if needed
function imhAsync_Callback(url, args, clientCallBack) 
{
	var req = imhAsync_GetXMLHttpRequest();
	var result = null;

	if (!req) 
	{	// we cannot get XMLHTTP support on this browser
		result = {"value":null, "error": "600 No support for XMLHTTP in client"};
		if (clientCallBack) 
			clientCallBack(result);
		return result;
	}
	
	// set the request up
	req.open("POST", url, clientCallBack ? true : false);
	req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
	if (clientCallBack) 
	{
		req.onreadystatechange = function() 
		{
			if (req.readyState != 4) return;
			clientCallBack(imhAsync_DecodeResult(req));
		}
	}
	
	// encode arguments
	var d = new Date();
	var encodedData = ""; //"reqId=" + d.valueOf();
	if (args) 
	{
		for (var i = 0; i < args.length; ++i) 
		{
			argName = args[i++];
			argValue = encodeURIComponent(args[i]);
			if (encodedData != "") encodedData += "&"
			encodedData += argName + "=" + argValue;
		}
	}

	// actually send the request
	req.setRequestHeader("Content-length", encodedData.length);
    req.setRequestHeader("Content-Disposition", "form-data; name=Overvaagning");

    
    //PH: Nedenstående linie giver problemer med Skatteministeriets proxy
    //req.setRequestHeader("Connection", "close");
	req.send(encodedData);
	if (!clientCallBack) 
		// if we do not want to do it asynchronously, then return the result immediately
		result = imhAsync_DecodeResult(req);

	delete req;
	
	return result;
}

// decodes the result or errorstatus of the XMLHttpRequest object after a completed request
function imhAsync_DecodeResultAsXML(requestObject)
{
	var res = {"value":null, "error":null };
	if (requestObject.status != 200)
		res.error = requestObject.status + ' ' + requestObject.statusText;
	else
		res.value = requestObject.responseXML;
	return res;
}

// initiates a server-side callback, and setups client callbacks, if needed
function imhAsync_CallbackXML(url, args, clientCallBack) 
{
	var req = imhAsync_GetXMLHttpRequest();
	var result = null;
	
	if (!req) 
	{	// we cannot get XMLHTTP support on this browser
		result = {"value":null, "error": "600 No support for XMLHTTP in client"};
		if (clientCallBack) 
			clientCallBack(result);
		return result;
	}
	
	// set the request up
	req.open("POST", url, clientCallBack ? true : false);
	req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
	if (clientCallBack) 
	{
		req.onreadystatechange = function() 
		{
			if (req.readyState != 4) return;
			clientCallBack(imhAsync_DecodeResultAsXML(req));
		}
	}
	
	// encode arguments
	var d = new Date();
	var encodedData = ""; //"reqId=" + d.valueOf();
	if (args) 
	{
		for (var i = 0; i < args.length; ++i) 
		{
			argName = args[i++];
			argValue = encodeURIComponent(args[i]);
			encodedData += "&" + argName + "=" + argValue;
		}
	}

	// actually send the request	
	req.send(encodedData);
	if (!clientCallBack) 
		// if we do not want to do it asynchronously, then return the result immediately
		result = imhAsync_DecodeResultAsXML(req);

	delete req;
	
	return result;
}

// returns the URI encoded values for a given FORM in the current document
function imhAsync_GetFormValues(formIndex)
{
	var index = (formIndex) ? formIndex : 0;
	var encodedData = "";
	
	if (document.forms.length <= index) 
		return encodedData;
	
	var form = document.forms[index];
	for (var i = 0; i < form.length; ++i) 
	{
		var element = form.elements[i];
		if (element.name) 
		{
			var elementValue = null;
			if (element.nodeName == "INPUT") 
			{
				var inputType = element.getAttribute("TYPE").toUpperCase();
				if (inputType == "TEXT" || inputType == "PASSWORD" || inputType == "HIDDEN") 
				{
					elementValue = element.value;
				} 
				else 
					if (inputType == "CHECKBOX" || inputType == "RADIO") 
					{
						if (element.checked) 
						{
							elementValue = element.value;
						}
					}
			} 
			else 
				if (element.nodeName == "SELECT") 
				{
					elementValue = element.value;
				} 
				else 
					if (element.nodeName == "TEXTAREA") 
					{
						elementValue = element.value;
					}
			if (elementValue) 
			{
				encodedData += "&" + element.name + "=" + encodeURIComponent(elementValue);
			}
		}
	}
	return encodedData;
}

