var RequestQueue = function(){
	this.responders = {};
	this.requests = [];
	this.busy = false;
	this.xhr = null;
	
	this.getXHR = function(){
		var xhr;
		try {xhr = new XMLHttpRequest();}
		catch (e){
			var msXML = ['MSXML2.XMLHTTP.5.0','MSXML2.XMLHTTP.4.0','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP','Microsoft.XMLHTTP'];
			for (i=0;i<msXML.length;i++) try {xhr = new ActiveXObject(msXML[i]);break;}catch (e){}
		}
		return xhr;
	}
	
	this.next = function(){
		if (this.hasNext()&&!this.busy){
			this.xhr = this.getXHR();
			this.busy = true;
			var r = this.requests.shift(), x = this.xhr, q = this;
			x.onreadystatechange = function(){
				var ret = '';
				if (x.readyState == 4){
					var t = x.responseText, s = x.status;
					try{
						ret = r.responders[s](t);
					}catch (e){
						try{
							ret = q.responders[s](t);
						}catch (e){}
					}
					q.busy = false;
					q.next();
				}
				return ret;
			}
			this.exec(r);
		}
	}
	this.exec = function(r){
		if (r.data.length > 0){
			this.xhr.open('post', r.url, true);
			this.xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			this.xhr.send(r.data);
		}else{
			this.xhr.open('get', r.url, true);
			this.xhr.send(null);
		}
	}
	
	Request = function(u){
		this.url = u;
		this.responders = {};
		this.data = {};
	}
	Request.prototype = {
		setData: function(d){
			this.data = d;
		},
		setResponder: function(s,fn){
			this.responders[s] = fn;
		}
	}
}
RequestQueue.prototype = {
	abort: function(){
		this.xhr.onreadystatechange = function(){};
		if (this.xhr.abort){ // ie < 7 heeft dit niet
			this.xhr.abort();
		}
		this.busy = false;
		this.next();
	},
	hasNext: function(){
		return this.requests.length>0;
	},
	request: function(u){
		return new Request(u);
	},
	schedule: function(r){
		this.requests[this.requests.length] = r;
		this.next();
	},
	setResponder: function(s,fn){
		this.responders[s] = fn;
	}
}