// DOM wrapper functions

function addEvent(obj, evType, fn)
{
	var rc;
	if (obj.addEventListener)
	{
		obj.addEventListener(evType, fn, true);
		rc = true;
	}
	else if (obj.attachEvent)
	{
		rc = obj.attachEvent("on"+evType, fn);
	} 
	else
	{
		rc = false;
	}
	return(rc);
}
function getItemByName(c, n)
{
	var ni = new Array();
  for (i = 0; i < c.length; i++) {
    if (c[i].name == n) ni.push(c[i]);
  }
  if (ni.length == 0) ni = null;
  else if (ni.length == 1) ni = ni[0];
	return(ni);
}

// XMLHttpRequest functions

var XMLHttpRequests = new Array();
function sendXMLHttpRequest(XMLHttpRequestLabel, XMLHttpRequestMethod, XMLHttpRequestURL, XMLHttpRequestContentType, XMLHttpRequestData, XMLHttpRequestResponseFunction)
{
	if (XMLHttpRequestLabel == "") XMLHttpRequestLabel = "default";
	if (!XMLHttpRequests[XMLHttpRequestLabel] || XMLHttpRequests[XMLHttpRequestLabel].readyState == 4)
	{
    if (window.XMLHttpRequest) XMLHttpRequests[XMLHttpRequestLabel] = new XMLHttpRequest();
  	else if(window.ActiveXObject) XMLHttpRequests[XMLHttpRequestLabel] = new ActiveXObject("Microsoft.XMLHTTP");
  	if (XMLHttpRequests[XMLHttpRequestLabel])
  	{
  		XMLHttpRequests[XMLHttpRequestLabel].onreadystatechange = function()
  		{
      	var responseXML;
        if (XMLHttpRequests[XMLHttpRequestLabel].readyState == 4)
      	{
          if (XMLHttpRequests[XMLHttpRequestLabel].status == 200)
      		{
      			responseXML = XMLHttpRequests[XMLHttpRequestLabel].responseXML;
  					if (responseXML) eval(XMLHttpRequestResponseFunction + "(responseXML);");
      			else window.alert("[XMLHttpRequest:" + XMLHttpRequestLabel + "] The response from the server could not be processed.");
      		}
        	else window.alert("[XMLHttpRequest:" + XMLHttpRequestLabel + "] A server error has occured:\n(HTTP " + XMLHttpRequests[XMLHttpRequestLabel].status + ") " + XMLHttpRequests[XMLHttpRequestLabel].statusText);
      	}
  		}
      XMLHttpRequests[XMLHttpRequestLabel].open(XMLHttpRequestMethod, XMLHttpRequestURL, true);
  		if (XMLHttpRequestContentType != null) XMLHttpRequests[XMLHttpRequestLabel].setRequestHeader("Content-Type", XMLHttpRequestContentType);
      XMLHttpRequests[XMLHttpRequestLabel].send(XMLHttpRequestData);
  	}
		else window.alert("[XMLHttpRequest:" + XMLHttpRequestLabel + "] Could not create XMLHttpRequest object.");
	}
	else window.alert("[XMLHttpRequest:" + XMLHttpRequestLabel + "] Duplicate request cancelled.");
}

// Miscellaneous functions

function urlencodeForm(fid)
{
	var form, element, option;
	var i, j;
	var rc = "";
	if (document.forms.namedItem) form = document.forms.namedItem(fid);
	else form = document.forms.item(fid);
	for (i = 0; i < form.elements.length; i++)
	{
		element = form.elements[i];
		if (element.name != "")
		{
  		switch (element.tagName)
  		{
  			case "INPUT":
  				switch (element.type)
  				{
  					case "file":
  					case "hidden":
  					case "password":
  					case "submit":
  					case "text":
  						if (element.value != "") rc += escape(element.name.replace(" ", "+")) + "=" + escape(element.value.replace(" ", "+")) + "&";
  						break;
  					case "checkbox":
  					case "radio":
  						if (element.checked == true) rc += escape(element.name.replace(" ", "+")) + "=" + escape(element.value.replace(" ", "+")) + "&";
  						break;
  				}
  				break;
  			case "TEXTAREA":
  				if (element.value != "") rc += escape(element.name.replace(" ", "+")) + "=" + escape(element.value.replace(" ", "+")) + "&";
  				break;
  			case "SELECT":
    			for (j = 0; j < element.options.length; j++)
    			{
  					option = element.options[j];
    				if (option.selected == true) rc += escape(element.name.replace(" ", "+")) + "=" + escape(option.value.replace(" ", "+")) + "&";
    			}				
  				break;
  		}
  	}
	}
	rc = rc.substr(0, rc.length - 1);
	return(rc);
}
function clearChildNodes(n)
{
	if (n.childNodes) while (n.childNodes.length > 0) n.removeChild(n.childNodes[0]);
}
function appendAsHTML(p, n)
{
	var e, i;
	if (p.nodeType && n.nodeType)
	{
  	if (n.nodeType == 3) p.appendChild(document.createTextNode(n.nodeValue));
  	else
  	{
  		e = document.createElement(n.tagName);
			if (e)
			{
    		for (i = 0; i < n.attributes.length; i++)
  			{
					switch (n.attributes[i].nodeName)
					{
						case "class":
							e.className = n.attributes[i].nodeValue;
							break;
  					case "style":
        			if (e.style) e.style.cssText = n.attributes[i].nodeValue;
        			else e.setAttribute(n.attributes[i].nodeName, n.attributes[i].nodeValue);
  						break;
  					default:
  						e.setAttribute(n.attributes[i].nodeName, n.attributes[i].nodeValue);
  						break;
					}
  			}
    		e = p.appendChild(e);
    		for (i = 0; i < n.childNodes.length; i++) appendAsHTML(e, n.childNodes[i]);
			}
  	}
	}
}

