//Object for working with tabs
var tabman=new Object();

//Runs when the page loads:
tabman.load=function() {

	//In each <div class="tab_heads"> :
	// - add the class name "current" to the first tab head
	// - and set click event handlers for all tab heads:
	var rHeads=tabman.getElementsByClassName("tab_heads");
	for(var iHeads=0; iHeads<rHeads.length; iHeads++) {
		var oHeads=rHeads[iHeads];
		var first=true;
		for(var iHead=0; iHead<oHeads.childNodes.length; iHead++) {
			var oHead=oHeads.childNodes[iHead];
			if(oHead.className && tabman.hasClassName(oHead, "tab_head")) {
				oHead.onclick=tabman.clicktab;
				if(first) tabman.addClassName(oHead, "current");
				first=false;
			}
		}
	}

	//In each <div class="tab_bodies"> :
	// - hide all but the first tab body
	var rBodies=tabman.getElementsByClassName("tab_bodies");
	for(var iBodies=0; iBodies<rBodies.length; iBodies++) {
		var oBodies=rBodies[iBodies];
		var first=true;
		for(var iBody=0; iBody<oBodies.childNodes.length; iBody++) {
			var oBody=oBodies.childNodes[iBody];
			if(oBody.className && tabman.hasClassName(oBody, "tab_body")) {
				if(!first) oBody.style.display="none";
				first=false;
			}
		}
	}
};

//Runs when a tab has been clicked:
tabman.clicktab=function(e) {
	var evt=window.event||e; if (!evt.target) evt.target=evt.srcElement;
	
	//Locate the tab that has been clicked:
	var clickedTab=evt.target;
	while(!tabman.hasClassName(clickedTab, "tab_head")) {
		if(clickedTab.parentNode) clickedTab=clickedTab.parentNode;
		else break;
	}
	
	//If the tab clicked has been found:
	if(tabman.hasClassName(clickedTab, "tab_head")) {
		
		//Find out the ordinal number of the tab clicked
		//and also currentify the tabs:
		var tabIndex=-1;
		var rHeads=clickedTab.parentNode.childNodes;
		var counter=0;
		for(var iHead=0; iHead<rHeads.length; iHead++) {
			oHead=rHeads[iHead];
			if(oHead.className && tabman.hasClassName(oHead, "tab_head")) {
				if(oHead==clickedTab) {
					tabIndex=counter;
					tabman.addClassName(oHead, "current");
				} else {
					tabman.removeClassName(oHead, "current");
				}
				counter++;
			}
		}
		
		//Show/hide tab bodies:
		var rBodies=tabman.getElementsByClassName("tab_bodies", null, clickedTab.parentNode.parentNode);
		if(rBodies.length) rBodies=rBodies[0];
		var counter=0;
		for(var iBody=0; iBody<rBodies.childNodes.length; iBody++) {
			var oBody=rBodies.childNodes[iBody];
			if(oBody.className && tabman.hasClassName(oBody, "tab_body")) {
				if(counter==tabIndex) oBody.style.display="block";
				else oBody.style.display="none";
				counter++;
			}
		}
	}
};


//Utility functions:

tabman.getElementsByClassName = function (className, tag, elm){
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};

tabman.addClassName=function(element, className) {
	if(element) {
		if(element.className=='')  element.className=className;
		else  element.className+=' '+className;
	}
};

tabman.removeClassName=function(element, className) {
	if(element && element.className) {
		var newClassNames='';
		var classNames=element.className.split(' ');
		for(var i=0; i<classNames.length; i++) {
			if(classNames[i]!=className) {
				if(newClassNames!='') newClassNames+=' ';
				newClassNames+=classNames[i];
			}
		}
		element.className=newClassNames;
	}
};

tabman.hasClassName=function(element, className) {
	var ret=false;
	if(element && element.className) {
		var classNames=element.className.split(' ');
		for(var i=0; i<classNames.length; i++) {
			if(classNames[i]==className) {
				ret=true;
				break;
			}
		}
	}
	return ret;
};




//Attach onload event:
if(window.addEventListener) {
	window.addEventListener('load', tabman.load, false);
} else if(window.attachEvent) {
	window.attachEvent('onload', tabman.load);
}


