﻿var ajaxRequester = function(){};
ajaxRequester.prototype = {
	xmlRequest: null,
	requestQueue: new Array(),
	activeRequest: null,
	GetXmlRequestObject: function(){
		var obj = null;
		if(window.XMLHttpRequest){
			obj = new XMLHttpRequest();
		}
		else if(window.ActiveXObject){
			try{ obj = new ActiveXObject('Msxml2.XMLHTTP'); }
			catch(e){
				try{ obj = new ActiveXObject('Microsoft.XMLHTTP'); }
				catch(oc){ obj = null; }
			}
		}
		return obj;
	},
	DoRequest: function(url, callback, method, content){
		if(!this.xmlRequest){ this.xmlRequest = this.GetXmlRequestObject(); }
		if(this.xmlRequest && this.xmlRequest.readyState != 0)
			this.xmlRequest.abort();

		if(method == null){ method = 'GET'; }

		if(this.xmlRequest){
			this.xmlRequest.open(method, url, true);

       		if(method == 'POST'){
				this.xmlRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				this.xmlRequest.setRequestHeader("Content-length", content.length);
				if(!document.all){ this.xmlRequest.setRequestHeader("Connection", "close"); }
			}

			var requestMgr = this;
			var req = this.xmlRequest;
			this.xmlRequest.onreadystatechange = function(){
				if(req.readyState == 4){
					if(callback){ callback(req); }
					if(requestMgr){ requestMgr.NextRequest(); }
				}
			};
			this.xmlRequest.send(content);
		}
	},
	StartRequest: function(url, callback, method, content){
		this.activeRequest = url;
		if(method == null){ method = 'GET'; }
		if(method == 'GET' && content){ url += '?' + content; }
		this.DoRequest(url, callback, method, content);
	},
	Request: function(url, callback, method, content){
		this.QueueRequest(url, callback, method, content);
	},
	QueueRequest: function(url, callback, method, content){
		if(this.activeRequest == null){ this.StartRequest(url, callback, method, content); }
		else{ this.requestQueue.push({url:url, callback:callback, method:method, content:content}); }
	},
	NextRequest: function(){
		if(this.requestQueue && this.requestQueue.length > 0){
			var obj = this.requestQueue.pop();
			var mgr = this;
			setTimeout(function(){
				mgr.StartRequest(obj.url, obj.callback, obj.method, obj.content);
			}, 100);
		}
		else{ this.activeRequest = null; }
	}
};

var objectToString = function(obj){
	var val = '';
	for(var prop in obj){
		val += prop + '\n';
	}
	return val;
}

var jxRequest = new ajaxRequester();