Array.prototype.inArray = function (value) {
	var i;
	for (i=0; i < this.length; i++) {
		if (this[i] == value) {
			return true;
		}
	}
	return false;
};
function gotoSelect(object, url) {
	var value = object.options[object.selectedIndex].value;
	if (value != '0') {
		window.location = url + value;
	}
}
function popitup(url) {
	newwindow=window.open(url,'name','width=800,height=600,toolbar=0,resizable=0');
	if (window.focus) {newwindow.focus()}
	return false;
}
function changeTab(newTab, undisplayArr, displayArr, selectedClass, newValues) {
	undisplayElements(undisplayArr);
	displayElements(displayArr);
	var noneSelClass = newTab.className;
	var idPrefix = newTab.id.split('_')[0];
	// Loop through the other tabs and deselect them
	var arr = getElementsByClass(noneSelClass);
	for (var i=0;i<arr.length;i++) {
		if (arr[i].id.indexOf(idPrefix) == 0) {
			arr[i].className = noneSelClass;
		}
	}
	newTab.className = newTab.className + ' ' + selectedClass;
	for (var i=0;i<newValues.length;i++) {
		try {
			document.getElementById(newValues[i][0]).value = newValues[i][1];
		} catch (error) {}
	}
}
function displayElements(elements, displayType) {
	if (displayType == null) {
		displayType = 'block';
	}
	for (var i=0;i<elements.length;i++) {
		if (typeof(elements[i]) == "string") {
			var element = document.getElementById(elements[i]);
		} else {
			var element = elements[i];
		}
		if (typeof(element) != "undefined") {
			element.style.display = displayType;
		}
	}
}
function undisplayElements(elements) {
	displayElements(elements,'none');
}
function toggleElements(elements) {
	var element = elements[0];
	if (typeof(element) != "undefined") {
		if (element.style.display == "block") {
			undisplayElements(elements);
		} else {
			displayElements(elements);
		}
	}
}
function toggleElement(element, useDisplay) {
	if (typeof(element) != "undefined") {
		if (useDisplay == true) {
			if (element.style.display == "block") {
				element.style.display = "none";
			} else {
				element.style.display = "block";
			}
		} else {
			if (element.style.visibility == "visible") {
				element.style.visibility = "hidden";
			} else {
				element.style.visibility = "visible";
			}
		}
	}
}
function hideElement(element) {
	if (typeof(element) != "undefined") {
		element.style.visibility = "hidden";
	}
}
function showElement(element) {
	if (typeof(element) != "undefined") {
		element.style.visibility = "visible";
	}
}
function showContainer(id, style, animate) {
	//alert("id: "+id);
	var obj = document.getElementById(id);
	//alert("obj: "+obj);
	if ((animate == true) && (obj.style.display == "none")) {
		changeOpac(id, 0);
		obj.style.display = style;
		fadeIn(id,5,100,100);
	} else {
		obj.style.display = style;
	}
	
}
function hideContainer(id, animate, removeChild) {
	//alert("id: "+id);
	if (animate == true) {
		changeOpac(id, 100);
		fadeOut(id,5,100,removeChild);
	} else {
		document.getElementById(id).style.display = "none";
	}
}
function addUnloadEvent(func) {
	/* 
	http://www.dustindiaz.com/top-ten-javascript
	Originally written by Simon Willison and highly adopted by many others as a simple 
	way to add events to trigger after the page has loaded. This of course attaches all 
	your events to the onload event handler which some still see as necessary, 
	nevertheless it does exactly what it’s supposed to, and does it well.
	*/
	var oldonunload = window.onunload;
	if (typeof window.onunload != 'function') {
		window.onunload = func;
	} else {
		window.onunload = function() {
			if (oldonunload) {
				oldonunload();
			}
			func();
		}
	}
}
function addLoadEvent(func) {
	/* 
	http://www.dustindiaz.com/top-ten-javascript
	Originally written by Simon Willison and highly adopted by many others as a simple 
	way to add events to trigger after the page has loaded. This of course attaches all 
	your events to the onload event handler which some still see as necessary, 
	nevertheless it does exactly what it’s supposed to, and does it well.
	*/
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() {
			if (oldonload) {
				oldonload();
			}
			func();
		}
	}
}
function opacity(id, opacStart, opacEnd, millisec, removeChild) { 
	//speed for each frame 
	var speed = Math.round(millisec / 100); 
	var timer = 0; 

	//determine the direction for the blending, if start and end are the same nothing happens 
	if(opacStart > opacEnd) { 
		for(i = opacStart; i >= opacEnd; i--) { 
			setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed)); 
			timer++; 
		}
		setTimeout("fadeEnd('" + id + "'," + removeChild + ", '')",(timer * speed));
	} else if(opacStart < opacEnd) { 
		for(i = opacStart; i <= opacEnd; i++) 
			{ 
			setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed)); 
			timer++; 
		}
		//setTimeout("fadeEnd('" + id + "'," + removeChild + ")",(timer * speed));
	}
}
function moveIn(id, startPos, endPos, millisec, pxPerIter, removeChild, edge, alsoExecute) {
	var speed = Math.round((millisec / 100) * pxPerIter);
	//alert('speed: ' + speed + ', pxPerIter: ' + pxPerIter);
	var timer = 0;
	
	//determine the direction for the blending, if start and end are the same nothing happens 
	if(startPos > endPos) {
		for(i = startPos; i >= endPos; i-=pxPerIter) {
			setTimeout("changeEdge(" + i + ",'" + id + "', '" + edge + "')",(timer * speed));
			timer++;
		}
		setTimeout("fadeEnd('" + id + "'," + removeChild + ", '" + alsoExecute + "')",(timer * speed));
	} else if(startPos < endPos) {
		for(i = startPos; i <= endPos; i+=pxPerIter) {
			setTimeout("changeEdge(" + i + ",'" + id + "', '" + edge + "')",(timer * speed));
			timer++;
		}
		setTimeout("changeEdge(" + endPos + ",'" + id + "', '" + edge + "')",(timer * speed));
		//setTimeout("fadeEnd('" + id + "'," + removeChild + ")",(timer * speed));
	}
}
function changeEdge(newValue, id, edge) {
	var object = document.getElementById(id).style;
	eval("object." + edge + " = newValue + 'px'");
}

//change the opacity for different browsers 
function changeOpac(opacity, id) { 
	try {
		var object = document.getElementById(id).style;
		object.opacity = (opacity / 100);
		object.MozOpacity = (opacity / 100);
		object.KhtmlOpacity = (opacity / 100);
		object.filter = "alpha(opacity=" + opacity + ")";
	} catch (error) {}
}
function shiftOpacity(id, millisec) { 
	//if an element is invisible, make it visible, else make it invisible 
	if(document.getElementById(id).style.opacity == 0) { 
		opacity(id, 0, 100, millisec); 
	} else { 
		opacity(id, 100, 0, millisec); 
	} 
}
function fadeEnd(objId, removeChild, alsoExecute) {
	var obj = document.getElementById(objId);
	//alert("objId: " + objId + " obj: " + obj + " removeChild: " + removeChild + " alsoExecute: " + alsoExecute);
	switch (removeChild) {
		case 2:
			// Remove element from DOM
			obj.parentNode.removeChild(obj);
			break;
		case 1:
			// Hide the element
			obj.style.display = "none";
			break;
		case 0:
			obj.style.backgroundColor = "inherit";
			break;
		case 3:
			obj.style.backgroundColor = "red";
			break;
		case 4:
			// Hide the element
			obj.style.visibility = "hidden";
			break;
	}
	eval(alsoExecute);
}

function toggleExpand(element, content, state, event) {
	//alert('element.src: ' + element);
	if (element != null) {
		var oldSrc = element.src;
		var dirs = oldSrc.split("/");
		filename = dirs.pop();
		nameArr = filename.split("_");
		filename = "_" + nameArr[1];
		if (nameArr.length == 1) {
			nameArr = filename.split(".");
			filename = "." + nameArr[1];
		}
	}
	
	switch (state) {
		 case "expanded":
		 	if (element != null) {
		 		element.src = dirs.join("/") + "/expanded" + filename;
		 	}
			content.style.display = "block";
		 	break;
		 case "close":
		 	if (element != null) {
		 		element.src = dirs.join("/") + "/expand" + filename;
		 	}
			content.style.display = "none";
		 	break;
		 default:
		 	if (content.style.display == "none") {
				if (element != null) {
					element.src = dirs.join("/") + "/expanded" + filename;
				}
				content.style.display = "block";
			} else {
				if (element != null) {
					element.src = dirs.join("/") + "/expand" + filename;
				}
				content.style.display = "none";
			}
		 	break;
	}
	
	// Prevent event from bubble
	if (!event) {
		event = window.event;
	}
	event.cancelBubble = true;
	if (event.stopPropagation) {
		event.stopPropagation();
	}
}
/* 
http://www.dustindiaz.com/top-ten-javascript
Originially written by nobody in particular. Several developers have implemented 
their own version and no one single version has proven to be better than another. 
As you might expect, my humble self has even had a crack at it. This function was 
spawned from developers needing a quick and elegant way of grabbing elements by a 
className and to a developer@s surprise, it’s not an original DOM method as one 
might think... afterall, we have getElementById, getElementsByName(), 
getElementsByTagName, what the hell happened to getElementsByClass???
*/

function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp('(^|\\s)'+searchClass+'(\\s|$)');
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}
/*
http://www.dustindiaz.com/top-ten-javascript
As far as I know, Jeremy Keith sort of came up with this idea even though one would 
have thought this too would be a DOM core method. But just like getElementsByClass, 
it isn’t. So rather than pulling the function straight out of the book, I’ll leave 
that up to you to buy it yourself. Instead I’ve pulled this simple method from public domain:
*/
function insertAfter(parent, node, referenceNode) {
	parent.insertBefore(node, referenceNode.nextSibling);
}

function httpRequest() {
	var request;
	if (window.XMLHttpRequest) { // Mozilla, Safari, ...
		request = new XMLHttpRequest();
	} else if (window.ActiveXObject) { // IE
		try {
			request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	return request;
}
function sendAJAXRequest(request, responseHandler) {
	ajaxRequest.onreadystatechange = responseHandler;
	ajaxRequest.open("GET", request , true);
	//myHomeListRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
	ajaxRequest.send(null);
}
function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}
var inputTags = new Array("INPUT","SELECT","TEXTAREA");
function resetForm(formID,prefix,suffix, url, resetSearchState) {
	var formObject = document.getElementById(formID);
	for(var i = 0;i < formObject.elements.length;i++) {
		//try {
			var tagName = formObject.elements[i].tagName.toUpperCase();
			
			if ((inputTags.inArray(tagName))
					&&
				(
					(typeof(formObject.elements[i].id) == "undefined") || 
					(
						(typeof(prefix) == "undefined") || (prefix == null) || (formObject.elements[i].id.indexOf(prefix) == 0)
							&&
						(typeof(suffix) == "undefined" || suffix == null) || (formObject.elements[i].id.indexOf(suffix) != -1)
					)
				)
			) {
				switch (tagName) {
					case 'TEXTAREA':
						break;
					case 'SELECT':
						switch(formObject.elements[i].type) {
							case "select-one":
								formObject.elements[i].selectedIndex = 0;
								break;
						}
						break;
					case 'INPUT':
						switch(formObject.elements[i].type) {
							case "checkbox":
							case "radio":
								formObject.elements[i].checked = false;
								break;
						}
						break;
				}
			}
		//} catch (error) {}
	}
	// Unset servers search session
	var resetRequest = httpRequest();
	resetRequest.onreadystatechange = function () {};
	resetRequest.open("GET", url + "?RequestState=" + resetSearchState, true);
	resetRequest.send(null);
}

function getFormValues(formID,prefix,suffix) {
	var formObject = document.getElementById(formID);
	var str = "";
	
	for(var i = 0;i < formObject.elements.length;i++) {
		try {
			var tagName = formObject.elements[i].tagName.toUpperCase();
			if ((inputTags.inArray(tagName))
					&&
				(
					(typeof(formObject.elements[i].id) == "undefined") || 
					(
						(typeof(prefix) == "undefined") || (prefix == null) || (formObject.elements[i].id.indexOf(prefix) == 0)
							&&
						(typeof(suffix) == "undefined" || suffix == null) || (formObject.elements[i].id.indexOf(suffix) != -1)
					)
				)
			) {
				
				if (tagName == "TEXTAREA") {
					str += formObject.elements[i].name + "=" + encodeURIComponent(formObject.elements[i].value) + "&";
				} else {
					switch(formObject.elements[i].type) {
						case "text":
						case "hidden":
							str += formObject.elements[i].name + "=" + encodeURIComponent(formObject.elements[i].value) + "&";
							break;
						case "radio":
							if (formObject.elements[i].checked) {
								str += formObject.elements[i].name + "=" + encodeURIComponent(formObject.elements[i].value) + "&";
							}
							break;
						case "checkbox":
							if (formObject.elements[i].checked) {
								str += formObject.elements[i].name + "=" + encodeURIComponent(formObject.elements[i].value) + "&";
							} else {
								str += formObject.elements[i].name + "=&";
							}
							break;
						case "select-one":
							str += formObject.elements[i].name + "=" + encodeURIComponent(formObject.elements[i].options[formObject.elements[i].selectedIndex].value) + "&";
							break;
					}
				}
			}
		} catch (error) {}
	}
	str = str.substr(0,(str.length - 1));
	return str;
}
function getRequestState() {
	return document.getElementById("RequestState").value;
}

function setRequestState(state) {
	document.getElementById("RequestState").value = state;
}

function parseXMLDoc(xml, parentTag) {
	if (parentTag == null) {
		parentTag = 'MHL';
	}
	//alert('xml.getElementsByTagName("LAL")[0]: ' + xml.getElementsByTagName('LAL')[0]);
	var elements = findAllChildren(xml.getElementsByTagName(parentTag)[0]);
	
	for(var i = 0; i < elements.length; i++) {
		var noEvents = false;
		//alert('elements[i]: ' + elements[i]);
		//alert('elements[i].tagName: ' + elements[i].tagName + ' document.getElementById(elements[i].tagName): ' + document.getElementById(elements[i].tagName));
		htmlElement = document.getElementById(elements[i].tagName);
		
		
		//alert('htmlElement: ' + htmlElement);
		if ((htmlElement != undefined) && (htmlElement != null)) {
			var oldEvent = null;
			if (typeof htmlElement.onchange == 'function') {
				oldEvent = htmlElement.onchange;
			}
			//alert('elements[i].getAttribute("value"): ' + elements[i].getAttribute("value"));
			
			// Update attributes
			var attrs = elements[i].attributes;
			for(var j=attrs.length-1; j>=0; j--) {
				if (attrs[j].name == "parseXML_noEvents") {
					noEvents = eval(attrs[j].value);
					if (typeof oldEvent == 'function' && noEvents == true) {
						htmlElement.onchange = function () {};
					}
				} else {
					htmlElement.removeAttribute(attrs[j].name);
					htmlElement.setAttribute(attrs[j].name,attrs[j].value);
				}
			}
			//alert('htmlElement.getAttribute("value"): ' + htmlElement.getAttribute("value"));
			
			// Update text content
			if (elements[i].hasChildNodes()) {
				htmlElement.innerHTML = elements[i].firstChild.nodeValue;
			}
			
			if (typeof oldEvent == 'function' && noEvents == true) {
				htmlElement.onchange = oldEvent;
			}
			
			// Check for and fire onchange event
			if (typeof htmlElement.onchange == 'function' && noEvents == false) {
				try {
					htmlElement.onchange();
				} catch (e) {}
			}
		}
	}
}
function findAllChildren(parent, ignoreClassName, includeTagName) {
	var nodes = new Array();
	var cNodes = parent.childNodes;
	for(var i = 0; i < cNodes.length; i++) {
		//alert("class: " + cNodes[i].className + ", tag: " + cNodes[i].tagName);
		//alert("includeTagName: " + includeTagName + ", ignoreClassName: " + ignoreClassName);
		if (((cNodes[i].tagName == includeTagName) || (includeTagName == undefined)) && ((ignoreClassName == undefined) || (cNodes[i].className != ignoreClassName))) {
			nodes.push(cNodes[i]);
		}
		if (cNodes[i].hasChildNodes()) {
			nodes = nodes.concat(findAllChildren(cNodes[i], ignoreClassName, includeTagName));
		}
	}
	
	//alert("nodes length: " + nodes.length);
	return nodes;
}
function toggleCheckAll(field, idPrefix) {
	var checked = false;
	if (field.checked == true) {
		checked = true;
	}
	var arr = document.getElementsByTagName('INPUT');
	for (i=0;i<arr.length;i++) {
		if (arr[i].id.indexOf(idPrefix) == 0) {
			arr[i].checked = checked;
		}
	}
}
/**
* Function : dump()
* Arguments: The data - array,hash(associative array),object
*    The level - OPTIONAL
* Returns  : The textual representation of the array.
* This function was inspired by the print_r function of PHP.
* This will accept some data as the argument and return a
* text that will be a more readable version of the
* array/hash/object that is given.
*/
function dump(arr,level) {
var dumped_text = "";
if(!level) level = 0;

//The padding given at the beginning of the line.
var level_padding = "";
for(var j=0;j<level+1;j++) level_padding += "    ";

if(typeof(arr) == 'object') { //Array/Hashes/Objects
 for(var item in arr) {
  var value = arr[item];
 
  if(typeof(value) == 'object') { //If it is an array,
   dumped_text += level_padding + "'" + item + "' ...\n";
   dumped_text += dump(value,level+1);
  } else {
   dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
  }
 }
} else { //Stings/Chars/Numbers etc.
 dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
}
return dumped_text;
} 