function AJAXClient() {}

AJAXClient.SendGetRequest = function ( url, async, callback, async_data )
{
	if ( async )
		return	AJAXClient._sendRequest ( url, "GET", null, async, callback, async_data );
	else
		return	AJAXClient._sendRequest ( url, "GET", null, async, callback );
}

AJAXClient.SendPostRequest = function ( url, params, async, callback, async_data )
{
	if ( async )
		return	AJAXClient._sendRequest ( url, "POST", params, async, callback, async_data );
	else
		return	AJAXClient._sendRequest ( url, "POST", params, async, callback );
}

AJAXClient._sendRequest = function ( url, method, params, async, callback, async_data )
{
	var xmlHttp = AJAXClient._getXmlHttp ();
	xmlHttp.open ( method, url, async );

	if ( async )
	{
		xmlHttp.onreadystatechange = function () 
		{
			if ( xmlHttp.readyState == 4 ) {
				AJAXClient._onLoadFile ( url, async, callback, xmlHttp, async_data );
			}
		}
	}
	
	if ( method == "POST" ) {
		xmlHttp.setRequestHeader ( 'Content-Type', 'application/x-www-form-urlencoded' );
		
		if ( params != null )
			xmlHttp.setRequestHeader ( 'Content-Length', params.length.toString () );
	}
	
	xmlHttp.send ( params );
	
	if ( async )
		return	xmlHttp;
	else
		return	AJAXClient._onLoadFile ( url, async, callback, xmlHttp );
}

AJAXClient._onLoadFile = function ( url, async, callback, req, async_data )
{
	if ( callback != undefined )
		callback ( req.responseText, req.responseXML, async_data );
	if ( !async )
		return	req.responseXML;
}

// private: xmlhttp factory
AJAXClient._getXmlHttp = function() 
{
	try
	{
		if(window.XMLHttpRequest)
		{
			var req = new XMLHttpRequest();
			// some versions of Moz do not support the readyState property and the onreadystate event so we patch it!
			if(req.readyState == null) 
			{
				req.readyState = 1;
				req.addEventListener("load", 
									function() 
									{
										req.readyState = 4;
										if(typeof req.onreadystatechange == "function")
											req.onreadystatechange();
									},
									false);
			}
			return req;
		}
		if(window.ActiveXObject) 
			return new ActiveXObject(AJAXClient._getXmlHttpProgID());
	}
	catch (ex) {}
	throw new Error("Your browser does not support XmlHttp objects");
}

AJAXClient._getXmlHttpProgID = function()
{
	if(AJAXClient._getXmlHttpProgID.progid)
		return AJAXClient._getXmlHttpProgID.progid;
	var progids = ["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
	var o;
	for(var i = 0; i < progids.length; i++)
	{
		try
		{
			o = new ActiveXObject(progids[i]);
			return AJAXClient._getXmlHttpProgID.progid = progids[i];
		}
		catch (ex) {};
	}
	throw new Error("Could not find an installed XML parser");
}