//drjs.ajax.js//Ajax Functions


//drjs.ajax.js
//Ajax Functions

var HTTP = {
	Methods: {
		POST: "POST",
		GET: "GET"
	},
	State: {
		Unitialized: 0,
		Loading: 1,
		Loaded: 2,
		Interactive: 3,
		Complete: 4
	}
}

var AjaxForm = {
	SendForm: function(formID, action, callback) {
		var f = $(formID);
		if(action==null) {
			var action = f.action;
		}
		var req = new AjaxRequest(action, callback);
		for(var i=0; i<f.elements.length; i++) {
			if((f.elements[i].name!="" && f.elements[i].name!=null)) {
				req.AddParam(f.elements[i].name, f.elements[i].value);
			}
		}
		req.DoRequest();
		return req;
	}
};

var AjaxRequest = Class.Create();
AjaxRequest.AddMethods({
	Asynchronous: true,
	Callback: null,
	Method: HTTP.Methods.GET,
	parameters: "",
	Pos: -1,
	Reference: null,
	Request: null,
	ResponseText: null,
	URI: null,
	UseQueueEvents: true,
	_constructor: function(uri, callback) {
		if(uri!=null) {
			this.URI = uri;
		}
		if(callback!=null) {
			this.Callback = callback;
		}
	},
	AddParam: function(name, value) {
		this.Method = HTTP.Methods.POST;
		if(value!=null) {
			this.parameters = (this.parameters==null) ? name + "=" + escape(value) : this.parameters + "&" + name + "=" + escape(value);
		}
	},
	AddParams: function(array) {
		for(var i=0; i<array.length; i++) {
			this.AddParam(array[i][0], array[i][1]);
		}
	},
	DoRequest: function(queue) {
		this.prepareRequest(this.URI, this.Callback, queue);
	},
	execRequest: function() {
		__debugger__addMsg("Requesting: " + this.URI, this.parameters);
		if(window.ActiveXObject) {
			this.Request = new ActiveXObject("Msxml2.XMLHTTP");
		} else if(window.XMLHttpRequest) {
			this.Request = new XMLHttpRequest();
		}
		this.Request.onreadystatechange = this.Callback;
		this.Request.open(this.Method, this.URI, this.Asynchronous);
		if(this.Method==HTTP.Methods.POST) {
			this.Request.setRequestHeader("Content-type", "application/x-www-form-urlencoded;");
			this.Request.setRequestHeader("Content-length", this.parameters.length);
			this.Request.send(this.parameters);
		} else {
			this.Request.send(null);
		}
	},
	GetRequest: function(uri, callback, queue) {
		this.Method = HTTP.Methods.GET;
		this.prepareRequest(uri, callback, queue);
	},
	PostRequest: function(uri, callback, queue) {
		this.Method = HTTP.Methods.POST;
		this.prepareRequest(uri, callback, queue);
	},
	prepareRequest: function(uri, callback, queue) {		
		this.URI = uri;
		this.Callback = callback;
		if(queue==true || (queue!=false && AjaxRequestQueue.Enabled==true)) {
			AjaxRequestQueue.AddRequest(this.Copy());
		} else {
			this.execRequest();
		}
	}
});

var IntervalAjaxRequest = Class.Extends(AjaxRequest);
IntervalAjaxRequest.AddMethods({
	Delay: null,
	pos: null,
	timeout:0,
	_constructor: function() {
	},	
	Pause: function() {
		AjaxRequestQueue.RemoveIntervalRequest(this.pos);
	},
	Resume: function(delay) {
		this.Delay = (delay!=null) ? delay : this.Delay;
		this.pos = AjaxRequestQueue.AddIntervalRequest(this);
	},
	Start: function(uri, callback, delay, method) {
		this.URI = uri;
		this.Callback = callback;
		this.Method = (method==null) ? this.Method : method;
		this.Delay = (delay!=null) ? delay*1000 : 2000;
		this.timeout = this.Delay;
		this.pos = AjaxRequestQueue.AddIntervalRequest(this);
	}
});

var AjaxRequestQueue = {
	activeRequest: null,
	currentRequest: null,
	Enabled: true,
	intervalRequests:[],
	intervalID: null,
	PosLast: 0,
	PosCurrent: 1,
	requests: [],
	OnRequestLoading: null,
	OnRequestLoad: null,
	AddRequest: function(request) {
		this.PosLast++;
		this.requests.push(request);
		setTimeout("AjaxRequestQueue.checkQueue();", 10);
		return this.PosLast;
	},
	AddIntervalRequest: function(request) {
		this.intervalRequests.push(request);
		var pos = this.intervalRequests.length;
		if(this.intervalRequests.length==1) {
			this.startIntervalRequests();
		}
		return pos;
	},
	callback: function() {
		var request = AjaxRequestQueue.activeRequest;
		if(request.readyState==HTTP.State.Complete) {
			__debugger__addMsg("Response for: " + AjaxRequestQueue.currentRequest.URI, request.responseText);
			AjaxRequestQueue.currentRequest.ResponseText = request.responseText;
			AjaxRequestQueue.currentRequest.Pos = AjaxRequestQueue.PosCurrent;
			if(typeof(AjaxRequestQueue.currentRequest.Callback)=="string") {
				setTimeout(AjaxRequestQueue.currentRequest.Callback.substr(0, AjaxRequestQueue.currentRequest.Callback.length-1) + ", '" + escape(request.responseText) + "')", 1);
			} else if(AjaxRequestQueue.currentRequest.Callback!=null) {
				AjaxRequestQueue.currentRequest.Callback(AjaxRequestQueue.currentRequest.Copy(), AjaxRequestQueue.PosCurrent);
			}
			var temp = AjaxRequestQueue.currentRequest;
			AjaxRequestQueue.currentRequest = null;
			AjaxRequestQueue.activeRequest = null;
			AjaxRequestQueue.PosCurrent++;
			setTimeout("AjaxRequestQueue.checkQueue();", 10);
			if((typeof(AjaxRequestQueue.OnRequestLoad)=="function" || typeof(AjaxRequestQueue.OnRequestLoad)=="object") && temp.UseQueueEvents==true && AjaxRequestQueue.OnRequestLoad!=null) {
				//setTimeout("AjaxRequestQueue.OnRequestLoad();", 1);
				AjaxRequestQueue.OnRequestLoad(temp);
			}
			temp = null;
		}
	},
	checkIntervalRequests: function() {
		if(this.intervalRequests.length==0) {
			clearInterval(this.intervalID);
		}
		for(var i=0; i<this.intervalRequests.length; i++) {
			if(this.intervalRequests[i]!=null) {
				this.intervalRequests[i].timeout -= 1000;
				if(this.intervalRequests[i].timeout<=0) {
					this.intervalRequests[i].timeout = this.intervalRequests[i].Delay;
					this.intervalRequests[i].execRequest();
				}
			}
		}
	},
	checkQueue: function() {
		if(this.currentRequest==null) {
			this.nextRequest();
		}
	},
	execRequest: function() {
		if(typeof(this.OnRequestLoading)=="function" && this.currentRequest.UseQueueEvents==true) {
			setTimeout("AjaxRequestQueue.OnRequestLoading();", 1);
		}
		__debugger__addMsg("Requesting: " + this.currentRequest.URI, this.currentRequest.parameters);
		if(window.XMLHttpRequest) {
			this.activeRequest = new XMLHttpRequest();
		} else if(window.ActiveXObject) {
			this.activeRequest = new ActiveXObject("Msxml2.XMLHTTP");
		}
		this.activeRequest.onreadystatechange = this.callback;
		this.activeRequest.open(this.currentRequest.Method, this.currentRequest.URI, this.currentRequest.Asynchronous);
		if(this.currentRequest.Method==HTTP.Methods.POST) {
			this.activeRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded;");
			this.activeRequest.setRequestHeader("Content-length", this.currentRequest.parameters.length);
			this.activeRequest.send(this.currentRequest.parameters);
		} else {
			this.activeRequest.send(null);
		}
		//setTimeout("AjaxRequestQueue.checkQueue();", 5);
	},
	nextRequest: function() {
		if(this.requests.length>0) {
			this.currentRequest = this.requests[0];
			this.requests = this.requests.removePos(0);
			this.execRequest();
		}
	},
	RemoveIntervalRequest: function(pos) {
		this.intervalRequests[pos] = null;
	},
	startIntervalRequests: function() {
		this.intervalID = setInterval("AjaxRequestQueue.checkIntervalRequests()", 1000);
	}	
}

drjs.loadComplete(drjs.files.ajax);