/*****
References:
http://www.sitepoint.com/article/build-your-own-ajax-web-apps
http://www.w3schools.com/dom/dom_http.asp
*****/

function Ajax()
{
	this.Request = null;
	this.Method = "GET";			// "GET" or "POST"
	this.Url = null;
	this.Asynchronous = true;		// For best results, set to true.
	this.PostData = null;			// This should be used only if Method is "POST".
	this.ResponseFormat = "Text";	// "Text", "Xml", or "Object"

	this.ClientCallback = null;
	this.OnError = null;
	
	this.SendRequest = function()
	{
		if(!(this.Request = CreateRequest()))
		{
			if(this.OnError)
				this.OnError("Could not connect to server.");

			return;
		}

		// Reference:  http://developer.mozilla.org/en/docs/AJAX:Getting_Started
		if(this.Method == "POST")
			this.Request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		
		var self = this;
		
		this.Request.onreadystatechange = function()
		{
			var REQUEST_COMPLETE = 4;
			var response = null;
			
			if(self.Request.readyState == REQUEST_COMPLETE)
			{
				switch(self.ResponseFormat)
				{
					case "Xml":
						response = self.Request.responseXML;
						break;
					case "Object":
						response = self.Request;
						break;
					default:
						response = self.Request.responseText;
						break;
				}
				
				if(self.Request.status >= 200 && self.Request.status <= 299)
				{
					if(self.ClientCallback)
						self.ClientCallback(response);
				}
				else
				{
					if(self.OnError)
						self.OnError(response);
				}
			}
		}

		this.Request.open(this.Method, this.Url, this.Asynchronous);
		this.Request.send(this.PostData);
	}
	
	this.AbortRequest = function()
	{
		if(this.Request)
		{
			this.Request.onreadystatechange = function() {}
			this.Request.abort();
			this.Request = null;
		}
	}
	
	// helper function
	function CreateRequest()
	{
		var request = null;

		if(window.XMLHttpRequest)
			request = new XMLHttpRequest();
		else if(window.ActiveXObject)
		{
			try { request = new ActiveXObject("MSXML2.XMLHTTP"); }
			catch(e)
			{
				try { request = new ActiveXObject("Microsoft.XMLHTTP"); }
				catch(e) {}
			}
		}

		return request;
	}
}

// retrieves an XML document using the Ajax class
// url is the location of the XML document, which will be passed to the clientCallback function.
function GetXmlDocument(url, clientCallback)
{
	var ajax = new Ajax();
	
	ajax.Url = url;
	ajax.ResponseFormat = "Xml";
	ajax.ClientCallback = clientCallback;
	ajax.SendRequest();
}