function ajaxRequest (url, callback, postData, timeout, timeoutCallback) {
	this.url = url;
	this.callback = callback;
	this.postData = postData;
	this.timeout = timeout;
	this.timeoutCallback = timeoutCallback;
}

function ajaxObject () {
	var req = null;
	var reqtimer;
	var ajaxqueue = new Array();
	var currentTimeoutCallback;
	var XMLHttpFactories = [
		function () {return new XMLHttpRequest()},
		function () {return new ActiveXObject("Msxml2.XMLHTTP")},
		function () {return new ActiveXObject("Msxml3.XMLHTTP")},
		function () {return new ActiveXObject("Microsoft.XMLHTTP")}
	];
	
	this.newRequest = function (url, callback, postData, timeout, timeoutCallback) {
		ajaxqueue.push(new ajaxRequest(url, callback, postData, timeout, timeoutCallback));
		if (ajaxqueue.length == 1) {
			sendRequest(url, callback, postData, timeout, timeoutCallback);	
		}		
	}

	function sendRequest (url, callback, postData, timeout, timeoutCallback) {
		//if (req == null) req = createXMLHTTPObject();
		req = createXMLHTTPObject();
		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 () {
			try {
				if (req.readyState != 4)
					return
				if (req.status != 200 && req.status != 304)
					return;
				window.clearInterval(reqtimer);
				callback(req);	
				// Remove top of queue
				ajaxqueue.shift();
				// Send next in queue
				if (ajaxqueue.length != 0) {
					var newRequest = ajaxqueue[0];
					sendRequest(newRequest.url,newRequest.callback,newRequest.postData,newRequest.timeout,newRequest.timeoutCallback);
				}	
			} catch (err) {
				return;
			}
		}
		if (req.readyState == 4) return;
		req.send(postData);
		// Set request timeout
		currentTimeoutCallback = timeoutCallback;
		reqtimer = window.setInterval(abortRequest,timeout);
	}
	
	function abortRequest() {
		req.abort();
		window.clearInterval(reqtimer);
		currentTimeoutCallback();
		// Resend last request
		var newRequest = ajaxqueue[0];
		sendRequest(newRequest.url,newRequest.callback,newRequest.postData,newRequest.timeout,newRequest.timeoutCallback);
	}
	
	function createXMLHTTPObject() {
		var xmlhttp = false;
		for (var i=0;i<XMLHttpFactories.length;i++) {
			try {
				xmlhttp = XMLHttpFactories[i]();
			}
			catch (e) {
				continue;
			}
			break;
		}
		return xmlhttp;
	}
}
ajaxOb = new ajaxObject();