/*
Camjax
Cameron's Ajax implementation
Current Version: 2.81 (11/08/2009)

TO DO: Create camjax validator
(Support for easy server-side validation)


Previous Releases:
	v2.8, 03/07/2009
	v2.5, 18/06/2009
	v2.0, 11/06/2009
	v1.0, 27/10/2008

*/


/*
CamjaxController Class
*/
function CamjaxController() 
{
	this.timeoutMessage = "Unable to process request: Your session has ended. Please log back into the system.";
	this.timeoutChecks = null;
	this.timeoutRedirect = null;
	
	if (!getNewHttpRequestObject())
	{
		alert("Error: Could not initialize XMLHttpRequest.\n\nMessage: You must either upgrade your Internet browser to a newer version or decrease your security settings before you can use the full functionality of this webpage.");
		this.send = ajaxUnavailable;
		this.sendForm = ajaxUnavailable;
	}
	else
	{
		this.sendAjax = sendAjax;
		this.sendForm = sendForm;
		this.setTimeoutMessage = setTimeoutMessage;
		this.setTimeoutChecks = setTimeoutChecks;
		this.setTimeoutRedirect = setTimeoutRedirect;
		this.getTimeoutMessage = getTimeoutMessage;
		this.getTimeoutChecks = getTimeoutChecks;
		this.getTimeoutRedirect = getTimeoutRedirect;
	}
	
	function setTimeoutMessage(message)
	{
		this.timeoutMessage = message;
	}
	
	function setTimeoutChecks(timeoutChecks)
	{
		this.timeoutChecks = timeoutChecks;
	}
	
	function setTimeoutRedirect(timeoutRedirect)
	{
		this.timeoutRedirect = timeoutRedirect;
	}
	
	function getTimeoutMessage()
	{
		return this.timeoutMessage;
	}
	
	function getTimeoutChecks()
	{
		return this.timeoutChecks;
	}
	
	function getTimeoutRedirect()
	{
		return this.timeoutRedirect;
	}

	function ajaxUnavailable()
	{
		alert("Ajax functionality is not supported in your web browser. Unable to continue.");
	}

	function sendForm(form, theUpdateFunction, theOptionalArguments)
	{
		sendAjax(form.action, getFormParameters(form), theUpdateFunction, theOptionalArguments);
	}

	function sendAjax(url, parameters, theUpdateFunction, theOptionalArguments)
	{
		new CamjaxRequest(getNewHttpRequestObject(), url, parameters, theUpdateFunction, theOptionalArguments);
	}
	
	
	function getNewHttpRequestObject()
	{
		var request;
		try 
		{
			request = new XMLHttpRequest();
		} 
		catch (trymicrosoft) 
		{
			try 
			{
				request = new ActiveXObject("Msxml2.XMLHTTP");
			} 
			catch (othermicrosoft) 
			{
				try 
				{
					request = new ActiveXObject("Microsoft.XMLHTTP");
				} 
				catch (failed) 
				{
					request = false;
				}  
			}
		}
		
		return request;
	}
	
	function getFormParameters(form)
	{
		var parameterString = "";
		
		for(var i = 0; i < form.elements.length; i ++)
		{
			var element = form.elements[i];
			if(element.type != "submit" && element.type != "button")
			{
				if(	(element.type != "checkbox" && element.type != "radio") || 
					(element.type == "checkbox" && element.checked) ||
					(element.type == "radio" && element.checked))
				{
					parameterString += element.name + "=" + escape(element.value) + "&";
				}
			}
		}

		return parameterString;
	}
}

/*
CamjaxRequest Class
*/
function CamjaxRequest(request, url, parameters, theUpdateFunction, theOptionalArguments) 
{
	var functionString = generateFunctionString(theUpdateFunction, theOptionalArguments);
	
	try
	{
		var requestType = "GET";
		if(parameters != '')
		{
			requestType = "POST";
		}

		request.open(requestType, url, true);
		
		if(parameters != '')
		{
			request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); 
		}
		request.onreadystatechange = ajaxUpdatePage;
		request.send(parameters);
	}
	catch(exception)
	{
		alert(exception);
	}
	
	function ajaxUpdatePage()
	{
		if(request.readyState == 4 && request.status == 200)
		{		
			var timeout = true;
			if(camjaxController.getTimeoutChecks() != null && camjaxController.getTimeoutChecks().length > 0)
			{
				for(var i = 0; i < camjaxController.getTimeoutChecks().length; i ++)
				{
					if(request.responseText.indexOf(camjaxController.getTimeoutChecks()[i]) == -1)
					{
						timeout = false;
						break;
					}
				}
			}
			else
			{
				timeout = false;
			}
			
			if(timeout)
			{
				alert(camjaxController.getTimeoutMessage());
				document.location.href = camjaxController.getTimeoutRedirect();
			}
			else
			{
				eval(functionString);
			}
		}
	}
	
	
	function generateFunctionString(theUpdateFunction, theOptionalArguments)
	{
		var functionString = "theUpdateFunction(request.responseText";
		if(theOptionalArguments != null && theOptionalArguments.length > 0)
		{
			for(var i = 0; i < theOptionalArguments.length; i ++)
			{
				functionString += ",theOptionalArguments[" + i + "]";
			}
		}
		functionString += ")";
		
		return functionString;
	}
}

var camjaxController = new CamjaxController();