var _AJAXHTTPRequest = null;
var _AJAXHTTPRequestCallback;
var _AJAXHTTPRequestAbortTimer;
var _AJAXHTTPRequestWindowStatus = "";
var _callBack = null;
/*
AJAXCallback = function(callback)
{   
    _callback : callback;
    this.HTTPRequestCheck : function(HTTPStatus, HTTPResponseText)
	{
		// Displays an error message if the HTTP request has failed
		
		if (HTTPStatus != 200) // Not ok
		{
		    //set cursor back to normal
			Common.SetCursorDefault();
		
			// Failure - Show beginning of returned error message
			alert("HTTPRequest failed:\r\n\r\n" + Common.HtmlDecode(HTTPResponseText).substring(0, 2048));
			return false;
		}
		return true;
	};
	this.Call : function(HttpStatus,HttpResponseText)
	{
	    if (this.HTTPRequestCheck(HttpStatus,HttpResponse))
	        _callback.call(HttpResponseText);
	}
}*/

AJAX =
{
	HTTPRequest : function(url, parameters, callback)
	{
		// Makes an asynchronous HTTP request to the specified url
		// On completion, calls the specified callback function
		
		// Safety check for a current executing HTTP request - do not allow more than one request
		// to execute at one time, otherwise it is all far too asynchronously complicated!
		if (_AJAXHTTPRequest)
		{
			AJAX.WindowStatusAppend("request is in progress please wait");
			return;
		}

		// Create the HTTP request object
		_AJAXHTTPRequest = AJAX.GetHTTPRequestObject();
		if (!_AJAXHTTPRequest)
		{
			alert("AJAX request failed.\r\n\r\nCould not create XMLHTTPRequest object.");
			return;
		}
		
		// Update browser window status bar message
		AJAX.WindowStatusClear();
		
		// Set the callback function that will be executed on completion of the HTTP request
		_AJAXHTTPRequestCallback = callback;
		
		// Set the callback function that will be executed every time the HTTP request
		// state changes
		_AJAXHTTPRequest.onreadystatechange = AJAX.HTTPRequestStateChange;

		// Make asynchronous HTTP request
		/*if (url.indexOf("AJAXServiceGet.ashx") >= 0)
		{
			// Update browser window status bar message
			AJAX.WindowStatusAppend("Contacting server to get request");
			
			// Start an asynchronous HTTP GET request
			_AJAXHTTPRequest.open("GET", url + "?" + parameters, true);
			_AJAXHTTPRequest.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
			_AJAXHTTPRequest.send(null);
		}
		else
		{*/
			// Update browser window status bar message
			AJAX.WindowStatusAppend("Contacting server to post request");
			
			// Start an asynchronous HTTP POST request
			_AJAXHTTPRequest.open("POST", url, true);
			_AJAXHTTPRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			_AJAXHTTPRequest.setRequestHeader("Content-length", parameters.length);
			// _AJAXHTTPRequest.setRequestHeader("Connection", "close");  // On the Education Leeds network, including this header causes the request to time out. Should this header be included or not? There seems to be some debate - modern browsers minimise their connections, so this header should not be necessary?
			_AJAXHTTPRequest.send(parameters);
		//}
		
		// Create timer that will abort the HTTP request if it has not completed
		_AJAXHTTPRequestAbortTimer = setTimeout("AJAX.HTTPRequestAbort('false')", 60000);
	}
	,
	OnTimeout :function (func)
	{
	    _callback = func;
	}
	,
	HTTPRequestAbort : function(quiet)
	{
		// HTTP request did not respond in a timely fashion, so abort the request and
		// display an error
		
		if (_AJAXHTTPRequest)
		{
			// Update browser window status bar message
			AJAX.WindowStatusAppend("time out error, aborting");
			
			// Abort the HTTP request
			_AJAXHTTPRequest.abort();
			_AJAXHTTPRequest = null;
			
			//set cursor back to normal
			Common.SetCursorDefault();
			if (!quiet)
			    alert("AJAX request failed.\r\n\r\nTimeout. Server did not respond to request.\r\nPlease check your internet connection and try again.");
		    if(_callBack)
		        _callback(); 
		}
		
	}
	,
	HTTPRequestStateChange : function()
	{
		// HTTP request has changed state (uninitialised, open, sent, receiving, loaded)
		if (_AJAXHTTPRequest)
		{
			// Update browser window status bar message
			AJAX.WindowStatusAppend(_AJAXHTTPRequest.readyState);
			
			if (_AJAXHTTPRequest.readyState == 4)  // Complete
			{
				if (_AJAXHTTPRequest.status != 0)  // Not uninitialised (ie has not been aborted)
				{
					// Clear the HTTP request timeout timer
					clearTimeout(_AJAXHTTPRequestAbortTimer);
					
					// Note, the callback function may call AJAX.HTTPRequest again, which would 
					// reset _AJAXHTTPRequest to a new instance of the HTTPRequest object.
					var HTTPStatus = _AJAXHTTPRequest.status;
					var HTTPResponseText = _AJAXHTTPRequest.responseText;
					_AJAXHTTPRequest = null;
					if (_AJAXHTTPRequestCallback)
						_AJAXHTTPRequestCallback(HTTPStatus, HTTPResponseText);

					// Update browser window status bar message, unless callback has started another HTTP request
					if (_AJAXHTTPRequest == null)
						AJAX.WindowStatusAppend("finished.");
				}
				
				//set cursor back to normal
				Common.SetCursorDefault();
			}
		}
	}
	,
	HTTPRequestCheck : function(HTTPStatus, HTTPResponseText)
	{
		// Displays an error message if the HTTP request has failed
		
		if (HTTPStatus != 200) // Not ok
		{
		    //set cursor back to normal
			Common.SetCursorDefault();
		
			// Failure - Show beginning of returned error message
			alert("HTTPRequest failed:\r\n\r\n" + Common.HtmlDecode(HTTPResponseText).substring(0, 2048));
			return false;
		}
		
		return true;
	}
	,
	Message : function(HTTPStatus, HTTPResponseText)
	{
		// Displays message on page
		
		var time = new Date()
		var s = "";
		if (time.getHours() < 10) s = s + "0";
		s = s + time.getHours() + ":";
		if (time.getMinutes() < 10) s = s + "0";
		s = s + time.getMinutes() + ":";
		if (time.getSeconds() < 10) s = s + "0";
		s = s + time.getSeconds();

		if (HTTPStatus == 200) // Ok
			// Success
			AJAX.MessageSetSuccess("Save successful at " + s, "");
		else
			// Failure - Show beginning of returned error message
			AJAX.MessageSetFail("Save failed at " + s, Common.HtmlDecode(HTTPResponseText).substring(0, 2048));
	}
	,
	MessageSetSuccess : function(msg, hint)
	{
		// Displays a success message
		var span = document.getElementById("AJAXMessage");
		if (span)
		{
			span.innerHTML = Common.HtmlEncode(msg);
			span.className = "MessageSuccess";
			span.title = "";
		}	
	}
	,
	MessageSetFail : function(msg, hint)
	{
		// Displays a failure message
		var span = document.getElementById("AJAXMessage");
		if (span)
		{
			span.innerHTML = Common.HtmlEncode(msg);
			span.className = "MessageFail";
			span.title = hint;
		}	
	}
	,
	MessageClear : function()
	{
		var span = document.getElementById("AJAXMessage");
		if (span)
			span.innerHTML = "";
	}
	,
	Test : function()
	{
		// Check that the client browser has all the required components enabled
		// to run the scripts required by this application, and that the client 
		// browser can call the web server successfully.

		var div = document.getElementById("AJAXTest");
		if (div)
		{
			var step = "";
			try
			{
				// Hide message
				step = "Hide message.";
				div.style.display = "none";
				
				// Check creation of HTTP request object
				step = "Create AJAX HTTP request object on local browser";
				if (!AJAX.GetHTTPRequestObject())
					throw new Error("Could not create HTTP request object.");
				
				// Check call to HTTP server
				step = "Send AJAX HTTP request from local browser to web server";
				try
				{	AJAX.HTTPRequest("AJAXServiceGet.ashx", "Action=Test", AJAX.TestCallback);	}
				catch(e)
				{	throw new Error("Call to HTTP server failed. " + e.message);	}				
			}
			catch(e)
			{
				// Check failed, so display error message
				AJAX.TestMessage("Step: " + step + "\r\n"
					+ "Number: " + (e.number & 0xFFFF) + "\r\n"
					+ "Name: " + e.name + "\r\n"
					+ "Description: " + e.description);
			}
		}
	}
	,
	TestCallback : function(HTTPStatus, HTTPResponseText)
	{
		if (HTTPStatus != 200 || HTTPResponseText != "GOOD") // Not ok or unexpected response
			AJAX.TestMessage("Response to sending AJAX HTTP request from local browser to web server:\r\n" + Common.HtmlDecode(HTTPResponseText).substring(0, 2048));
	}
	,
	TestMessage : function(msg)
	{
		var div = document.getElementById("AJAXTest");
		if (div)
		{
			div.innerHTML = Common.HtmlEncode("The internet browser on this machine is not configured correctly for SWIFT.\r\n" + msg);
			div.style.display = "block";
		}
		else
			alert("The internet browser on this machine is not configured correctly for SWIFT.\r\n" + msg);
	}
	,
	GetHTTPRequestObject : function()
	{
		var HTTPRequest = null;
		
		try
		{
			if (window.XMLHttpRequest)
				HTTPRequest = new XMLHttpRequest();
			else if (window.ActiveXObject)
				HTTPRequest = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch(e)
		{
			HTTPRequest = null;
		}
		
		return HTTPRequest;
	}
	,
	WindowStatusClear: function()
	{
	    //set cursor to busy
	    Common.SetCursorWait();
	
		// Clears the browser window status bar
		_AJAXHTTPRequestWindowStatus = "";

		window.status = _AJAXHTTPRequestWindowStatus;
	}
	,
	WindowStatusAppend: function(msg)
	{
		// Append message to the browser window status bar
		if (_AJAXHTTPRequestWindowStatus != "")
			_AJAXHTTPRequestWindowStatus += ", ";
		_AJAXHTTPRequestWindowStatus += msg;

		window.status = _AJAXHTTPRequestWindowStatus;
	}
}

