/* AJAX Library (C) t.vorobyov */

// max number of requester objects to be used
var	maxRequesterObjects = 50;
	
// reusable requester objects are stored here
var arRequester = Array();

var XMLHttpFactories = [
	function () {return new XMLHttpRequest()},
	function () {return new ActiveXObject("Msxml2.XMLHTTP")},
	function () {return new ActiveXObject("Msxml3.XMLHTTP")},
	function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];

// creates a new XML HTTP requester, cross-browser support
function createXMLHTTPObject() {
	var xmlhttp = false;
	for (var i=0;i<XMLHttpFactories.length;i++) {
		try {
			xmlhttp = XMLHttpFactories[i]();
		}
		catch (e) {
			continue;
		}
		break;
	}
	return xmlhttp;
}

// !!!sends a request - this is the main function here!!!
function sendRequest(url,callback,postData) {
	var req = getXMLHTTPObject();
	if (!req) return;
	var method = (postData) ? "POST" : "GET";
	req.open(method,url,true);
	req.setRequestHeader('User-Agent','XMLHTTP/1.0');
	if (postData)
		req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
	req.onreadystatechange = function () {

		if (req.readyState != 4) return;
		/*if((req.status >= 301) && (req.status <= 303)) // redirection by server
		{
			console.log("Redirect");
			newUrl = req.getResponseHeader("Location");
			console.log("Subrequest: "+newUrl);
			sendRequest(newUrl, callback); // no postdata
			return;
		}*/
		if (req.status != 200 && req.status != 304) {
			throw("AJAX:HttpError"+req.status);
			return;
		}
	
		callback(req);
	}
	if (req.readyState == 4) return;
	req.send(postData);
}


// retrieve an available XMLHTTP requester object or create a new one
function getXMLHTTPObject()
{
	// assume failure
	requester = null;	
	for (i = 1; i < arRequester.length; i++)
	{

		if ((arRequester[i].readyState == 0) || (arRequester[i].readyState == 4))
		{
			// the object was never used or has finished working
			requester = arRequester[i];
			break;
		}
	}
	// requester is found or null
	if (requester == null)
	{
		// check if the limit has not yet been reached
		if (arRequester.length < maxRequesterObjects)
		{
			ln = arRequester.length;
			// create a new object
			requester = createXMLHTTPObject();
			if (requester != null)
			{
				arRequester[ln] = requester;
			}
		}
		else
			throw("AJAX:RequesterLimitExceeded")
		
	}
	return requester;
}