/*
var inTO;
var outTO;
function fadeIn(objId, step, delay, opacity) {
	var currOpacity = getOpacity();
	if (currOpacity <= opacity) {
		setOpacity(document.getElementById(objId), currOpacity+step);
		inTO = setTimeout("fadeIn(\'"+objId+"\',"+step+","+delay+","+opacity+")", 50);
	}
}
function fadeOut(objId, step, delay, removeChild) {
	//clearTimeout(inTO);
	var obj = document.getElementById(objId);
	var opacity;
	opacity = getOpacity(obj);
	//alert("objId: " + objId + ", opacity: " + opacity + ", object: " + obj);
	if (opacity > 0) {
		setOpacity(obj, opacity-step);
		//setTimeout("doNothing()",50);
		outTO = setTimeout("fadeOut(\'"+objId+"\',"+step+","+delay+","+removeChild+")", delay);
	} else {
		switch (removeChild) {
			case 2:
				// Remove element from DOM
				alert("removing div");
				obj.parentNode.removeChild(obj);
				break;
			case 1:
				// Hide the element
				obj.style.display = "none";
				break;
			case 0:
				obj.style.background = "inherit";
				setOpacity(obj,100);
				//showElement(objId, "block", true);
				break;
		}
	}
}
function setOpacity(obj, opacity) {
	//opacity = (opacity == 100)?99.999:opacity;
	//alert("opacity: " + opacity + " opacity/100: " + opacity/100);
	
	// IE/Win
	obj.style.filter = "alpha(opacity:"+opacity+")";
	
	// Safari<1.2, Konqueror
	obj.style.KHTMLOpacity = opacity/100;
	
	// Older Mozilla and Firefox
	obj.style.MozOpacity = opacity/100;
	
	// Safari 1.2, newer Firefox and Mozilla, CSS3
	obj.style.opacity = opacity/100;
}
function getOpacity(obj) {
	//alert("getOpacity: obj: " + obj + " opacity: " + (obj.style.opacity) + " getOpacity*100: " + (obj.style.opacity)*100);
	try {
		return (obj.style.opacity)*100;
	} catch (error) {
		//alert("exc: obj: "+obj);
		return 0;
	}
	
}*/
function toggleElement(element) {
	if (typeof(element) != "undefined") {
		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 {
		try {
			obj.style.display = style;
		} catch(e) {}
	}
	
}
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 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) {
	//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;
	}
}
/* 
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);
}