// JavaScript Document

function Ajax()
{ 
	this.req = null; 
 	this.url = null; 
 	this.method = 'GET'; 
 	this.async = true; 
 	this.status = null; 
 	this.statusText = ''; 
 	this.postData = null; 
 	this.readyState = null; 
 	this.responseText = null; 
 	this.responseXML = null; 
 	this.handleResp = null; 
 	this.responseFormat = 'text', // 'text', 'xml', or 'object' 
 	this.mimeType = null; 
 	this.init = function()
	{
		if (!this.req) 
		{ 
			try
			{ 
				// Try to create object for Firefox, Safari, IE7, etc. 
				this.req = new XMLHttpRequest(); 
			} 
			catch (e) 
			{ // catch 1
				try
				{ 
					// Try to create object for later versions of IE. 
					this.req = new ActiveXObject('MSXML2.XMLHTTP'); 
				}
				catch (e) 
				{ // catch 2
					try
					{ 
						// Try to create object for early versions of IE. 
						this.req = new ActiveXObject('Microsoft.XMLHTTP'); 
					} 
					catch (e)
					{
						// Could not create an XMLHttpRequest object. 
						return false; 	
					}
				}
			}
		} // end if !this.req
		return this.req; 
	} // end function init

	this.doReq = function()
	{ 
		if (!this.init() ) 
	   	{ 
	    	alert('Could not create XMLHttpRequest object.'); 
	    	return; 
	   	} // end this.init
		this.req.open(this.method, this.url, this.async); 
		if (this.method == "POST")
		{
			this.req.setRequestHeader ('Content-Type','application/x-www-form-urlencoded');
		}
		if (this.mimeType) 
		{ 
			try 
			{
				req.overrideMimeType(this.mimeType);
			} 
		 	catch (e)
			{ // couldn't override MIME type  --  IE6 or Opera? 
			
			} 
		} 
		var self = this; // Fix loss-of-scope in inner function 

		this.req.onreadystatechange = function()
		{ 
			var resp = null; 
			if (self.req.readyState == 4) 
		  	{
		    	// Do stuff to handle response 
				switch (self.responseFormat) 
			 	{ 
    		  		case 'text': resp = self.req.responseText; 
						break; 
		      		case 'xml':  resp = self.req.responseXML; 
					   	break; 
		     		case 'object': resp = req; 
					   	break; 
				} // end switch
				if (self.req.status >= 200 && self.req.status <= 299) 
				{
					self.handleResp(resp);
				}
				else
				{
					self.handleErr(resp);
				}
		  	} // end if readyState == 4
	  	}; // end this.req.onreadystatechange inner function (inner to this.doReq)
	
		this.req.send(this.postData);
	}; // end function doReq

  	this.setMimeType = function(mimeType) 
  	{ 
	 	this.mimeType = mimeType; 
	}; // end function setMimeType 

  	this.handleErr = function()
	{ 
	 	var errorWin;   
	 	try
		{ 
		  	errorWin = window.open('', 'errorWin'); 
		  	errorWin.document.body.innerHTML = this.responseText; 
		} 
	 	catch (e) 
		{  
			    alert('An error occurred, but the error message cannot be ' 
				 + 'displayed. This is probably because of your browser\'s ' 
				 + 'pop-up blocker.\n' 
				 + 'Please allow pop-ups from this web site if you want to ' 
				 + 'see the full error messages.\n' 
				 + '\n' 
				 + 'Status Code: ' + this.req.status + '\n' 
				 + 'Status Description: ' + this.req.statusText); 
		}
  	}; // end function handleErr

  	this.setHandlerBoth = function(funcRef)
	{ 
	 	this.handleResp = funcRef; 
	 	this.handleErr = funcRef; 
  	}; // end function setHandlerBoth
  
 	this.abort = function()
	{ 
	 	if (this.req) 
	 	{ 
	   	 	this.req.onreadystatechange = function() { }; 
		   	this.req.abort(); 
		   	this.req = null; 
		} 
  	}; // end abort function
  
  	this.doGet = function(url, hand, format)
	{ 
	 	this.url = url; 
	 	this.handleResp = hand; 
	 	this.responseFormat = format || 'text'; 
	 	this.doReq(); 
  	} // end function this.doGet;
  
  	this.doPost = function (url, postData, hand, format)
  	{
	 	this.url = url;
	 	this.handleResp = hand;
	 	this.responseFormat = format || 'text';
	 	this.method = 'POST';
	 	this.postData = postData;
	 	this.doReq();
  	}
} // end function Ajax