/**
 * Open a connection to the specified URL, which is
 * intended to provide an XML message. The specified data
 * is sent to the server as parameters. This is the same as
 * calling xmlOpen("POST", url, toSend, responseHandler).
 *
 * @param string url	The URL to connect to.
 * @param string toSend The data to send to the server; must be URL encoded.
 * @param function responseHandler The Javascript function handling server response.
 */
function xmlPost(url, toSend)
{
	xmlOpen("POST", url, toSend, AjaxGetDivs);
}

/**
 * Open a connection to the specified URL, which is
 * intended to provide an XML message. No other data is
 * sent to the server. This is the same as calling
 * xmlOpen("GET", url, null, responseHandler).
 *
 * @param string url	The URL to connect to.
 * @param function responseHandler The Javascript function handling server response.
 */
function xmlGet(url, responseHandler)
{
	xmlOpen("GET", url, null, AjaxGetDivs);
}

/**
 * Open a connection to the specified URL, which is
 * intended to respond with an XML message.
 * 
 * @param string method The connection method; either "GET" or "POST".
 * @param string url	The URL to connect to.
 * @param string toSend The data to send to the server; must be URL encoded.
 * @param function responseHandler The Javascript function handling server response.
 */
function xmlOpen(method, url, toSend, responseHandler)
{
	if (window.XMLHttpRequest)
	{
		// browser has native support for XMLHttpRequest object
		req = new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{
		// try XMLHTTP ActiveX (Internet Explorer) version
		req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	
	if(req)
	{
		req.onreadystatechange = responseHandler;
		req.open(method, url, true);
		req.setRequestHeader("content-type","application/x-www-form-urlencoded");
		req.send(toSend);
	}
	else
	{
		alert('Your browser does not seem to support XMLHttpRequest.');
	}
}

/**
 * Gets the first child node of <code>parent</code> with the
 * specified tag name.
 *
 * @param parent the parent XML DOM node to search
 * @param tagName the tag name of the child node to search for
 */
function getNode(parent, tagName)
{
	var i;
	var max = parent.childNodes.length;
	
	// Check each child node
	for(i = 0; i < max; i++)
	{
		if(parent.childNodes[i].tagName)
		{
			if(parent.childNodes[i].tagName.toUpperCase() == tagName.toUpperCase())
			{
				// We found a matching child node; return it.
				return parent.childNodes[i];
			}
		}
	}
	// One was not found; return null
	return null;
}

/**
 * Gets the first child node of <code>parent</code> with the
 * specified tag name and whose value of the 'key' attribute
 * is <code>key</code>.
 *
 * @param parent the parent XML DOM node to search
 * @param tagName the tag name of the child nodes to search in
 * @param key the value of the 'key' attribute to search on
 */
function getNodesWithKey(parent, tagName, key)
{
	var i;
	var cellNodes = parent.getElementsByTagName(tagName);
	var max = cellNodes.length;
	
	// Check each cell node for the specified value for
	// the 'key' attribute
	for(i = 0; i < max; i++)
	{
		if(cellNodes[i].getAttribute('key') == key)
		{
			// We found a matching cell node; return it.
			return cellNodes[i];
		}
	}
	// One was not found; return null
	return null;
}



// ####################

function AjaxGetDivs()
{
	// Make sure the request is loaded (readyState = 4)
	if (req.readyState == 4)
	{
		// Make sure the status is "OK"
		if (req.status == 200)
		{
			var swappableSection;
			var divs = req.responseXML.getElementsByTagName('div');
			for(i=0; i < divs.length; i++)
			{
				var divNode = divs.item(i);
				if(divNode != null && divNode.hasChildNodes())
				{
					swappableSection = document.getElementById(divNode.getAttribute('id'));
					swappableSection.innerHTML = divNode.firstChild.nodeValue
				}
			}
			var scripts = req.responseXML.getElementsByTagName('script');
			for(i=0; i < scripts.length; i++)
			{
				var scriptNode = scripts.item(i);
				if(scriptNode != null && scriptNode.hasChildNodes())
				{
					eval(scriptNode.firstChild.nodeValue)
				}
			}
			
		}
		else
		{
			alert("There was a problem retrieving the XML data:\n" +
				req.statusText);
		}
	}
}

