function createRequest()
{
	var aXmlHttp = null;

	if(window.XMLHttpRequest) //Mozilla, Safari,...
	{
		aXmlHttp = new XMLHttpRequest();

		if(aXmlHttp.overrideMimeType)
			aXmlHttp.overrideMimeType('text/xml'); //https://bugzilla.mozilla.org/show_bug.cgi?id=311724
	}
	else if(window.ActiveXObject) //IE
	{
		var aXmlObjects = null;
		aXmlObjects = new Array();

		aXmlObjects[0] = "Msxml2.XMLHTTP";
		aXmlObjects[1] = "Microsoft.XMLHTTP";

		var i = null;

		for(i = 0; i < aXmlObjects.length; i++)
		{
			try
			{
				aXmlHttp = new ActiveXObject(aXmlObjects[i]);
				break;
			}
			catch(e)
			{
			}
		}
	}

	if(!aXmlHttp)
	{
		throw "This navigator does not support asynchronous calls"; 
	}
	else
	{
		return aXmlHttp;
	}
}

function sendRequest(aXmlHttp, sURL, aHandler, bNoCached, bSynchronous)
{
	if(!aXmlHttp)
		return;

	if(!(aXmlHttp.readyState === 4 || aXmlHttp.readyState === 0))
		aXmlHttp.abort();

	if(bNoCached == null)
		bNoCached = false;

	if(bSynchronous == null)
		bSynchronous = false;

	if(bNoCached)
		sURL = getNoCachedURL(sURL);

	aXmlHttp.open('GET', sURL, !bSynchronous);

	if(aHandler)
		aXmlHttp.onreadystatechange = function() { aHandler(aXmlHttp); };
	aXmlHttp.send(null);
}

function makeRequest(sURL, aHandler, bNoCached, bSynchronous)
{
	sendRequest(createRequest(), sURL, aHandler, bNoCached, bSynchronous);
}

function getNoCachedURL(sURL)
{
	return sURL + (sURL.indexOf("?") != -1 ? "&" : "?") + "__=" + encodeURIComponent(getUniqueValue());
}

function getUniqueValue()
{
	return new Date().getTime() + parseInt(Math.random() * 100);
}

function isCompleted(aXmlHttp)
{
	return aXmlHttp.readyState == 4 || aXmlHttp.readyState == "complete";
}

function getResponse(aXmlHttp)
{
	if(aXmlHttp.status == 200)
		return unescape(aXmlHttp.responseText);
	else
		return '';
}

