var ajax = {
	requests : new Array(),
	timeout : false,

	object: function() {
		try { return new XMLHttpRequest(); } catch(e) {}
		try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
		return null;
	},

	abort : function(xhReq,pos) {
		if(typeof xhReq=="object" && pos.length > 0) {
			xhReq.abort(xhReq);
			delete ajax.requests[pos];
			return true;
		}

		for(var i in ajax.requests) ajax.requests[i].abort();
		ajax.requests = new Array();
	},

	request : function(data,timeout,error,rstate_func) {
		if(typeof data=="undefined") return false;

		timeout = timeout || 5000;
		rstate_func = rstate_func || ajax.fetch;

		if(typeof rstate_func != "function") return false;
		if(navigator.userAgent.indexOf("Gecko")) ajax.abort();

		var xhReq = ajax.object();

		if(xhReq==null) {
			alert("XMLHttpRequest not supported");
			return false;
		}

		var pos = ajax.requests.length;

		try {
			xhReq.open("POST","ajax.php",true);

			ajax.requests[pos] = xhReq;

			xhReq.setRequestHeader("Method","POST /ajax.php HTTP/1.1");
			xhReq.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

			ajax.timeout = setTimeout(function() { ajax.abort(xhReq,pos); },timeout);

			xhReq.onreadystatechange = function() {
				if(xhReq.readyState != 4) return;
				try { rstate_func(xhReq,error); } catch(e) { ajax.abort(xhReq,pos); }
			}

			var send = new Array();
			for(var key in data) send[send.length] = key+"="+escape(data[key]);
			send[send.length] = "time="+new Date().getTime();

			xhReq.send(send.join("&"));
		} catch(e) {
			ajax.abort(xhReq,pos);
		} finally {
			delete xhReq;
			delete ajax.requests[pos];
		}
	},

	fetch : function(xhReq,error) {
		if(xhReq.status != 200) return false;
		clearTimeout(ajax.timeout);
		if(xhReq.responseText=="error" && error.length > 0) alert(error);
	}
}
