/*
THIS IS A COMMENT!

xmlHTTP.readyState values:
0 = uninitialised
1 = loading
2 = loaded
3 = interactive
4 = complete
*/

var xmlHTTP = createXMLHTTPRequestObject();

var targetElement = null;

function createXMLHTTPRequestObject()
{
	var xmlHTTP;
	
	try
	{
		xmlHTTP = new XMLHttpRequest();
	}
	catch(e)
	{
		//if browser is IE6 or older
		var xmlHTTPVersions = new Array('MSXML2.XMLHTTP.6.0',
										'MSXML2.XMLHTTP.5.0',
										'MSXML2.XMLHTTP.4.0',
										'MSXML2.XMLHTTP.3.0',
										'MSXML2.XMLHTTP',
										'Microsoft.XMLHttp');
		
		for(var i = 0; (i < xmlHTTPVersions.length) && !xmlHTTP; i++)
		{
			try
			{
				xmlHTTP = new ActiveXObject(xmlHTTPVersions[i]);
			}
			catch(e)
			{
				//Removed this cos on IE6 it is way annoying
				//alert('Could not create xmlHTTP ActiveXObject.');
			}
		}
	}
	
	if(!xmlHTTP) alert('Error creating XMLHTTPRequest object.');
	else
	{
		var ajax_data = new Array();
		ajax_data['xmlHTTP'] = xmlHTTP;
		ajax_data['target_element'] = '';
		
		return ajax_data;
	}
		
	return null;
}

var num_active_requests = 0;
var max_active_requests = 2;

function AjaxRequest(element, resource, vars)
{
	this.element = ((element != null) ? document.getElementById(element) : null);
	
	this.resource = resource;
	
	this.vars = vars;
}

function handle_request(request)
{
	if(window.XMLHttpRequest || window.ActiveXObject)
	{
		if(num_active_requests < max_active_requests)
		{
			num_active_requests++;
			
			var uber_xmlHTTP = createXMLHTTPRequestObject();
			
			if(uber_xmlHTTP != null)
			{
				try
				{
					if(request != undefined)
					{
						var element = request.element;
						var resource = request.resource;
						var vars = request.vars;
						
						uber_xmlHTTP['xmlHTTP'].open('GET', resource + ((vars != null) ? ('?' + vars) : ''), true);
						
						uber_xmlHTTP['target_element'] = element;
						uber_xmlHTTP['xmlHTTP'].onreadystatechange = function handle_response()
															{
																if(uber_xmlHTTP['xmlHTTP'].readyState == 4)
																{
																	if(uber_xmlHTTP['xmlHTTP'].status == 200)
																	{
																		try
																		{
																			var uber_response = uber_xmlHTTP['xmlHTTP'].responseText;
																			
																			if(uber_xmlHTTP['target_element'] != null)
																			{
																				var target_element = uber_xmlHTTP['target_element'];
																				
																				set_innerHTML_exec_script(target_element, uber_response);
																				
																				uber_xmlHTTP = null;
																				
																				num_active_requests--;
																			}
																		}
																		catch(e)
																		{
																			alert('Error reading the response: ' + e.description);
																		}
																	}
																	else
																	{
																		alert('There was an problem retrieving the data:\n' + uber_xmlHTTP['xmlHTTP'].statusText);
																	}
																}
															};
						
						uber_xmlHTTP['xmlHTTP'].send(null);
					}
				}
				catch(e)
				{
					alert("Can't connect to server:\n" + e.description);
				}
			}
			else
			{
				alert("XMLHttpRequest object was not created.");
			}
		}
	}
}

function request(element, resource, vars)
{
	if(xmlHTTP['xmlHTTP'] != null)
	{
		try
		{
			targetElement = document.getElementById(element);
			
			xmlHTTP['xmlHTTP'].open("GET", resource + ((vars != null) ? ('?' + vars) : ''), true);
			
			//determine which function to use to process the response
			var ext = resource.split('.');
			ext = ext[ext.length - 1];
			
			var func = null;
			
			switch(ext)
			{
				case 'xml':
					func = responseXML;
					break;
					
				default:
					func = response;
					break;
			}
			
			xmlHTTP['xmlHTTP'].onreadystatechange = func;
			xmlHTTP['xmlHTTP'].send(null);
		}
		catch(e)
		{
			alert("Can't connect to server:\n" + e.description);
		}
	}
	else
		alert("xmlHTTP object was not created.");
}

function response()
{	
	//if request is complete
	if(xmlHTTP['xmlHTTP'].readyState == 4)
	{
		//if HTTP status is 'OK'
		if(xmlHTTP['xmlHTTP'].status == 200)
		{
			try
			{
				var responseVal = xmlHTTP['xmlHTTP'].responseText;
				
				set_innerHTML_exec_script(targetElement, responseVal);
			}
			catch(e)
			{
				alert('Error reading the response: ' + e.toString());
			}
		}
		else alert('There was a problem retrieving the data:\n' + xmlHTTP.statusText);
	}
}

function set_innerHTML_exec_script(element, html)
{
	if(element.parentNode)
 	{
		var new_element = element.cloneNode(false);
		new_element.innerHTML = html;
		
		element.parentNode.replaceChild(new_element, element);
	}
}

function responseXML()
{	
	//if request is complete
	if(xmlHTTP['xmlHTTP'].readyState == 4)
	{
		//if HTTP status is 'OK'
		if(xmlHTTP['xmlHTTP'].status == 200)
		{
			try
			{
				var xmlResponse = xmlHTTP['xmlHTTP'].responseXML;
				
				//catch potential errors with IE and Opera
				if(!xmlResponse || !xmlResponse.documentElement)
					throw("Invalid XML structure:\n" + xmlHTTP['xmlHTTP'].responseText);
				
				//catch potential errors with Firefox
				var rootNodeName = xmlResponse.documentElement.nodeName;
				
				if(rootNodeName == "parsererror")
					throw("Invalid XML structure:\n" + xmlHTTP['xmlHTTP'].responseText);
				
				var xmlRoot = xmlResponse.documentElement;
				
				var titleArray = xmlRoot.getElementsByTagName("title");
				var linkArray = xmlRoot.getElementsByTagName("link");
				
				var html = '';
				
				for(var i = 0; i < titleArray.length; i++)
				{
					html += '<a href="' + linkArray.item(i).firstChild.data + '">' + titleArray.item(i).firstChild.data + '</a><br/>';
				}
				
				targetElement.innerHTML = html;
			}
			catch(e)
			{
				alert('Error reading the response: ' + e.toString());
			}
		}
		else
			alert('There was a problem retrieving the data:\n' + xmlHTTP.statusText);
	}
}

function request_field_value(form_name, field_name, resource, vars)
{
	if(xmlHTTP['xmlHTTP'] != null)
	{
		try
		{
			targetElement = document.forms[form_name][field_name];
			
			xmlHTTP['xmlHTTP'].open("GET", resource + ((vars != null) ? ('?' + vars) : ''), true);
			
			//determine which function to use to process the response
			var ext = resource.split('.');
			ext = ext[ext.length - 1];
			
			var func = null;
			
			switch(ext)
			{
				case 'xml':
					func = responseXML;
					break;
					
				default:
					func = response_field_value;
					break;
			}
			
			xmlHTTP['xmlHTTP'].onreadystatechange = func;
			xmlHTTP['xmlHTTP'].send(null);
		}
		catch(e)
		{
			alert("Can't connect to server:\n" + e.description);
		}
	}
	else
		alert("xmlHTTP object was not created.");
}

function response_field_value()
{	
	//if request is complete
	if(xmlHTTP['xmlHTTP'].readyState == 4)
	{
		//if HTTP status is 'OK'
		if(xmlHTTP['xmlHTTP'].status == 200)
		{
			try
			{
				var responseVal = xmlHTTP['xmlHTTP'].responseText;
				
				targetElement.value = responseVal;
			}
			catch(e)
			{
				alert('Error reading the response: ' + e.description);
			}
		}
		else
			alert('There was a problem retrieving the data:\n' + xmlHTTP['xmlHTTP'].statusText);
	}
}
