/*
 * AjaxInterface class
 */

/**
 * AjaxInterface constructor
 */
function AjaxInterface() {
	this.requester = null;
	this.scriptNameAndArguments = "";
	this.data = "";
	this.serviceUnavailableTries = 0;
	this.useXML = false;
	
	//used for timing debugging
	this.constructed = new Date().getTime();
	this.received = null;
	this.processing = null;
}

/**
 * Send asynchronous request to a server-side CGI script
 * 
 * @return {Boolean} success
 */
AjaxInterface.prototype.send = function() {
	/*if (this.requester != null && this.requester.readyState != 0 && this.requester.readyState != 4)
	{
		this.requester.abort();
	}*/

	try
	{
		this.requester = new XMLHttpRequest();
	}
	catch (error)
	{
		try
		{
			this.requester = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch (error)
		{
			this.requester = null;

			return false;
		}
	}

	if(this.scriptNameAndArguments.length <= 0)
	{
		return false;
	}

	var thisObj = this;
	this.requester.onreadystatechange = function(){thisObj.onreadystatechangeHandler()}; //why I needed to declare thisObj, instead of just referencing this, is beyond me. but it works.
	this.requester.open("POST", this.scriptNameAndArguments, true); // + "?" + this.data
	this.requester.setRequestHeader("Method", "POST "+this.scriptNameAndArguments+" HTTP/1.1");
	this.requester.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	this.requester.setRequestHeader("Content-length", this.data.length);
	this.requester.setRequestHeader("Connection", "close");
	this.requester.setRequestHeader('If-Modified-Since','Wed, 15 Nov 1995 00:00:00 GMT');
	this.requester.setRequestHeader("Cache-Control","no-store, no-cache, must-revalidate");
	this.requester.send(this.data); //null);
	
	return true;
}

/**
 * Handle return of asynchronous request from server-side CGI script
 * 
 * @return {Boolean} success
 */
AjaxInterface.prototype.onreadystatechangeHandler = function() {
	//alert("in handler " + this.requester.readyState + " " + this.requester.status);
	var diff = new Date().getTime() - this.constructed;
	diff = diff/1000;
	if(this.requester.readyState == 2)
		this.received = diff;
	if(this.requester.readyState == 3)
		this.processing = diff;
	
	// If XMLHR object has finished retrieving the data
	if (this.requester.readyState == 4)
	{
		// If the data was retrieved successfully
		try
		{
			if (this.requester.status == 200)
			{
				if(this.useXML == true)
				{
					this.actOnResponse(this.requester.responseXML);
				}
				else
				{
					this.actOnResponse(this.requester.responseText);
				}
			}
			/*else if (this.requester.status == 503 && this.serviceUnavailableTries < 5)
			{
				this.serviceUnavailableTries++;
				alert(this.serviceUnavailableTries);
				this.send();
			}*/
			// IE returns a status code of 0 on some occasions, so ignore this case
			else if (this.requester.status != 0)
			{
				alert("There was an error while retrieving the URL: " + this.requester.status + " " + this.requester.statusText);
			}
		}
		catch (error)
		{
		}
	}

	return true;
}

/**
 * Potentially change something in the DOM based on reponseText.  Example:
 *
 * 	 var rowlist = document.getElementById("rowlist");
 * 	 rowlist.value = responseText
 *
 * This method body is left blank here, intended to be overriden in a subclass 
 */
AjaxInterface.prototype.actOnResponse = function(responseText) {
}