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];
}

/* AJAX functions */
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;
}
/* End AJAX functions */

/* DOM and extended JS function */
/*Object.prototype.isArray = function() {
   return this.constructor == Array;
}*/
Array.prototype.inArray = function (value) {
	var i;
	for (i=0; i < this.length; i++) {
		if (this[i] == value) {
			return true;
		}
	}
	return false;
};
function selectOption(target, value) {
	if (typeof(target) == "string") {
		target = document.getElementById(target);
	}
	//alert(target.options.length);
	for(var i = 0; i < target.options.length; i++) {
		if (target.options[i].value == value) {
			target.selectedIndex = i;
			break;
		}
	}
}
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 addSubmitEvent(func) {
	var oldonsubmit = getForm().onsubmit;
	if (typeof getForm().onsubmit != 'function') {
		getForm().onsubmit = func;
	} else {
		getForm().onsubmit = function() {
			if (oldonsubmit) {
				oldonsubmit();
			}
			func();
		}
	}
}
function addEvent(element,event,callback) {
	YAHOO.util.Event.addListener(element,event,callback);
}
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 addUnloadEvent(func) {
	var oldonunload = window.onunload;
	if (typeof window.onunload != 'function') {
		window.onunload = func;
	} else {
		window.onunload = function() {
			if (oldonunload) {
				oldonunload();
			}
			func();
		}
	}
}

function createElementWithName(){}
(function(){
	try {
		var el=document.createElement( '<div name="foo">' );
		if( 'DIV'!=el.tagName || 'foo'!=el.name ){
			throw 'create element error';
		}
		createElementWithName = function( tag, name ){
			return document.createElement( '<'+tag+' name="'+name+'"></'+tag+'>' );
		}
	}catch( e ){
		createElementWithName = function( tag, name ){
		var el = document.createElement( tag );
		// setAttribute might be better here ?
		el.setAttribute("name",name);
		return el;
	}
}
})();
function removeAllChildren(element) {
	if (element.hasChildNodes()) {
    	while (element.childNodes.length >= 1) {
    	    element.removeChild(element.firstChild);
    	} 
	}
}
/* Modified appendChild() that first looks to 
 * see if there are any children with the same 
 * id. If so, the element is not appended.
 */
function appendNewChild(target, newElement) {
	var found = false;
	if (target.hasChildNodes()) {
		for (var i=0; i<target.childNodes.length; i++) {
			if (target.childNodes[i].id == newElement.id) {
				found = true;
				break;
			}
		}
	}
	if (found == false) {
		target.appendChild(newElement);
	}
}
function getForm() {
	var elements = document.getElementsByTagName("FORM");
	return elements[0];
}
function displayElements(elements, displayType) {
	for (var i=0;i<elements.length;i++) {
		displayElement(elements[i], displayType);
	}
}
function undisplayElements(elements) {
	displayElements(elements,'none');
}
function displayElement(element, displayType) {
	if (displayType == null) {
		displayType = 'block';
	}
	if (typeof(element) == "string") {
		var element = document.getElementById(element);
	}
	if (typeof(element) != "undefined") {
		element.style.display = displayType;
	}
}
function undisplayElement(element) {
	displayElement(element,'none');
}
function toggleElements(elements) {
	var element = elements[0];
	if (typeof(element) != "undefined") {
		if (element.style.display == "block") {
			undisplayElements(elements);
			return 'invisible';
		} else {
			displayElements(elements);
			return 'visible';
		}
	}
}
function toggleElement(element, useDisplay) {
	if (typeof(element) == "string") {
		var element = document.getElementById(element);
	}
	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 toggleElementAnimated(el, elClicked) {
	var loader = new YAHOO.util.YUILoader({
		base: "", 
		require: ["animation"], 
		loadOptional: false, 
		combine: true, 
		filter: "MIN", 
		allowRollup: true, 
		onSuccess: function() { 
			var YUD = YAHOO.util.Dom;
			var YUA = YAHOO.util.Anim;
			
			el = YUD.get(el);
			elClicked = YUD.get(elClicked);
			
			var animate = true;
			var class_hidden = "hidden";
			var class_active = "active";
			
			var oOptions = {};
			var nHeight = 0;
			
			var bHideAfter = (!YUD.hasClass(el, class_hidden));
			//alert(bHideAfter);
			
			if(animate) {
				if(!bHideAfter) {
					YUD.removeClass(el, class_hidden);
					nHeight = el.offsetHeight;
					YUD.setStyle(el, 'height', 0);
					oOptions = {height: {from: 0, to: nHeight}};
				} else {
					nHeight = el.offsetHeight;
					oOptions = {height: {from: nHeight, to: 0}};
				}
				//alert(nHeight);
				var nSpeed = 0.5;
				var sEffect = YAHOO.util.Easing.easeBoth;
				var oAnimator = new YUA(el, oOptions, nSpeed, sEffect);
				if(bHideAfter) {
					YUD.removeClass(elClicked, class_active);
					oAnimator.onComplete.subscribe(function(){
						YUD.setStyle(el, 'height', 'auto');
						YUD.addClass(el, class_hidden);
					});
				} else {
					oAnimator.onComplete.subscribe(function(){
						YUD.setStyle(el, 'height', 'auto');
					});
					YUD.addClass(elClicked, class_active);
				}
				oAnimator.animate();
			} else {
				if(bHideAfter) {
					YUD.addClass(el, class_hidden);
					YUD.removeClass(elClicked, class_active);
					//elClicked.tabIndex = -1;
				} else {
					YUD.removeClass(el, class_hidden);
					YUD.addClass(elClicked, class_active);
					//elClicked.tabIndex = 0;
				}
			}
		} 
	});
	// Load the files using the insert() method. 
	loader.insert();
}

/* 
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;
}
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;
		}
	}
}

/* End DOM and extended JS functions */

/* Animation functions */
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 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 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);
}
/* End Animation functions */