/*
 AJAX_Class
by Christian Sappington
Written:	December 18th, 2006
Updated:	June 14th, 2007
Updated:	January 22nd, 2008 - IE cache issue
*/

var AJAX_Queue = new Array();
var AJAX_History = new Array();
var AJAX_HTTP;

function AJAX_Class()
{
	function AJAX_receive()
	{
		if(AJAX_HTTP.readyState == 4)
		{
			var queueFront = AJAX_Queue.shift();
			
			AJAX_History.unshift(queueFront);
			
			if(queueFront.type == "callback")
			{
				eval(queueFront.callback + "(AJAX_HTTP.responseText, '"+queueFront.passthrough+"');");
			}
			else if(queueFront.type == "send_to_div")
			{
				document.getElementById(queueFront.div_id).innerHTML = AJAX_HTTP.responseText;
				document.getElementById(queueFront.div_id).style.display = "inline";
			}
			else if(queueFront.type == "refresh")
			{
				document.location.href = document.location.href;
			}
			else if(queueFront.type == "no_action")
			{
				// Do nothing
			}
			if(AJAX_Queue.length > 0)
			{
				AJAX.send();
			}
		}
	}

	function AJAX_send()
	{	
		var queueFront = AJAX_Queue.shift();
		
		AJAX_Queue.unshift(queueFront);
		
		if(typeof window.ActiveXObject != 'undefined')
		{
			AJAX_HTTP = new ActiveXObject("Microsoft.XMLHTTP");
			AJAX_HTTP.onreadystatechange = this.receive;
		}
		else
		{
			AJAX_HTTP = new XMLHttpRequest();
			AJAX_HTTP.onload = this.receive;
		}
		
		if(queueFront.method == "GET")
		{
			var args = queueFront.args;
			
			if(args == "")
			{
				args = "IEnocache=" + Math.random();
			}
			else
			{
				args += "&IEnocache=" + Math.random();
			}
			
			AJAX_HTTP.open("GET", queueFront.url + "?" + args, true);
			AJAX_HTTP.send("");
		}
		else
		{
			AJAX_HTTP.open("POST", queueFront.url, true);
			AJAX_HTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
			AJAX_HTTP.send(queueFront.args);
		}
	}
	
	function AJAX_enqueueForm(action_type, history_hop, div_id, load_msg, callback, callback_passthrough, form)
	{
		var url = form.action;
		var method = form.method;
		var args = "";
		
		for(var i=0;i<form.elements.length;i++)
		{
			var type = form.elements[i].type;
			
			if(type == "text" || type == "hidden" || type == "password" || type == "file" || type == "textarea" || type == "button" || type == "submit")
			{
				args += form.elements[i].name + "=" + escape(form.elements[i].value) + "&";
			}
			else if(type == "select-one")
			{
				args += form.elements[i].name + "=" + escape(form.elements[i].options[form.elements[i].selectedIndex].value) + "&";
			}
			else if(type == "checkbox")
			{
				if(form.elements[i].checked)
				{
					args += form.elements[i].name + "=on&";
				}
			}
			else if(type == "radio")
			{
				if(form.elements[i].checked)
				{
					args += form.elements[i].name + "=" + escape(form.elements[i].value) + "&";
				}
			}
		}
		
		args = args.substr(0, (args.length - 1));
		
		this.EnqueueRequest(action_type, history_hop, div_id, load_msg, callback, callback_passthrough, url, args, method);
	}
	
	function AJAX_enqueueRequest(action_type, history_hop, div_id, load_msg, callback, callback_passthrough, url, args, method)
	{
		//action_type = send_to_div | refresh | no_action | callback
		
		var newQueueItem = new AJAXQueueItem(method, url, args);
		
		if(history_hop != null)
		{
			newQueueItem.type = "no_action";
		}
		else
		{
			newQueueItem.type = action_type;
		}
		
		newQueueItem.method = method;
		
		if(action_type == "callback")
		{
			newQueueItem.callback = callback;
			newQueueItem.passthrough = callback_passthrough;
		}
		else if(action_type == "send_to_div")
		{
			newQueueItem.div_id = div_id;
			
			if(load_msg != "")
			{
				if(load_msg == "default")
				{
					document.getElementById(div_id).innerHTML = "<table border=\"0\" height=\"100%\" width=\"100%\"><tr><td align=\"center\" valign=\"center\">Loading...</td></tr></table>";
				}
				else
				{
					document.getElementById(div_id).innerHTML = load_msg;
				}
			}
		}
		
		AJAX_Queue.push(newQueueItem);
		
		if(AJAX_Queue.length == 1)
		{
			this.send();
		}
		
		if(history_hop != null)
		{
			for(i=0;i<history_hop;i++)
			{
				AJAX_History.unshift();
			}
			
			AJAX_Queue.push(AJAX_History[history_hop]);
		}
	}
	
	function AJAX_goBack(hop)
	{
		var queueItem;
		
		for(i=0;i<=hop;i++)
		{
			queueItem = AJAX_History.shift();
		}
		
		AJAX_Queue.push(queueItem);
		
		if(AJAX_Queue.length == 1)
		{
			this.send();
		}
	}

	function AJAXQueueItem(method, url, args)
	{
		this.method = method;
		this.url = url;
		this.args = args;
		this.div_id = "";
	}

	this.send = AJAX_send;
	this.receive = AJAX_receive;
	this.EnqueueRequest = AJAX_enqueueRequest;
	this.EnqueueForm = AJAX_enqueueForm;
	this.GoBack = AJAX_goBack;
}

var AJAX = new AJAX_Class();