var startFuncs=new Array('locationCheck');

/**********
 *
 *	Allows init functions to be stacked for body onload or xhro rendering
 *
 *	@param	funcs		array of functions names or array of arrays of function name, static parameters
 *	
 **********/


function chain(funcs,eve) {
	while (func=funcs.shift()) {
		if (typeof(func)=='string') {
			eval(func+'(eve);');
		} else if (func.length) {
			eval(func[0]+'("'+func[1]+'");');
		}
	}
}

/**********
 *
 *	Highlights and displays tab contents, conditionally managing location history.
 *
 *	@param	ele		tab element
 *	@param	rep		boolean, replace in history or assign.
 *	
 **********/

function selTab(ele, rep) {
	var orig=ele
	var par=ele
	while ((par.className!='tabcontent') && (par.className!='tabs')) {
		par=par.parentNode
		if (par.className=='tabs') {
			ele=par;
			break;
		}
		if (par.className=='tabcontent') {
			ele=document.getElementById(par.id.replace('_tcontent',''));
			break;
		}
		if (par.tagName=='BODY') return false;
	}

	var contentDiv=document.getElementById(ele.id.substring(0,ele.id.lastIndexOf('_')+1)+'tcontent');
	if (ele && ele.parentNode && contentDiv) {

		for (var el=0; el<ele.parentNode.childNodes.length; el++) {
			if (ele.parentNode.childNodes[el].tagName=='LI') {
				ele.parentNode.childNodes[el].className='tabs';
				ele.parentNode.childNodes[el].style.backgroundColor = '#ddd';
				ele.parentNode.childNodes[el].style.marginTop='0.25em';
				ele.parentNode.childNodes[el].style.paddingBottom='0.20em';
				ele.parentNode.childNodes[el].childNodes[0].style.color = '#002f5f';
				ele.parentNode.childNodes[el].childNodes[0].style.fontWeight = 'normal';
			}
		}
		for (var el=0; el<contentDiv.childNodes.length; el++) {
			if (contentDiv.childNodes[el].tagName=='DIV') {
				contentDiv.childNodes[el].style.display = 'none'
			}
		}
		var tab;
		if (tab=document.getElementById(contentDiv.id+'_'+ele.id.substr(ele.id.lastIndexOf('_')+1))) {
			tab.style.display = 'block';
		}
		ele.style.backgroundColor = '#FFF';
		ele.style.marginTop='0em';
		ele.style.paddingBottom='0.45em';

		ele.childNodes[0].style.color = '#002f5f';
		ele.childNodes[0].style.fontWeight = 'bold';
		var tabs=window.location.hash.substring(1).split(',');
		var found=false;

		if (tabs.length) {
			for (var i=0;i<tabs.length;i++) {
				if (tabs[i].indexOf(ele.id.substring(0,ele.id.lastIndexOf('_')+1))!=-1) {
					tabs[i]=ele.id;
					found=true;
				}
			}
			if (!found) tabs.push(ele.id);

		}
		if (found && !loadingTabs[ele.id] && !rep) {
			window.location.assign('#'+tabs.join(','));
		} else {
			window.location.replace('#'+tabs.join(','));
		}
		curLocation=window.location.href;
	}
}

/**********
 *
 *	Every 50ms check for location hash change and select tabs/load hro's as necessary.
 *	
 **********/

function locationCheck() {
	if (curLocation != window.location.href) {
		var cursubhref=curLocation.substring(1).split(',');
		curLocation=window.location.href;
		var subhref=window.location.hash.substring(1).split(',');
		if (subhref.length) {
			var hrosub=new Object();
			var tabsub=new Object();
			for (var i=0;i<subhref.length;i++) {
				if (subhref[i].indexOf('=',1) &&  (id=subhref[i].substring(0,subhref[i].indexOf('=',1))) && document.getElementById(id)) {
					var url=subhref[i].substring(subhref[i].indexOf('=',1)+1);
					var id=subhref[i].substring(0,subhref[i].indexOf('=',1));
					hrosub[id]=url;
				} else if (document.getElementById(subhref[i])) {
					tabsub[subhref[i].substring(0,subhref[i].lastIndexOf('_'))]=subhref[i].substring(subhref[i].lastIndexOf('_')+1);
				}
			}
			var hrocursub=new Object();
			var tabcursub=new Object();
			for (var i=0;i<cursubhref.length;i++) {
				var id;
				if (document.getElementById(cursubhref[i])) {
					tabcursub[cursubhref[i].substring(0,cursubhref[i].lastIndexOf('_'))]=cursubhref[i].substring(cursubhref[i].lastIndexOf('_')+1);
				}
			}

			for (var attr in tabsub) {
				if (attr && document.getElementById(attr+'_'+tabsub[attr]) && (tabsub[attr]!=tabcursub[attr])) {
					loadingTabs[attr+'_'+tabsub[attr]]=true;
					document.getElementById(attr+'_'+tabsub[attr]).childNodes[0].onclick();
					loadingTabs[attr+'_'+tabsub[attr]]=false;
				}
			}
		}
	}
	locationSetTimeoutID=setTimeout(locationCheck,50);
}


loadingTabs=new Object();

/**********
 *
 *	On body or hro load for tabs, parses location or uses default.
 *
 *	@param	prefix		tab construct id
 *	@param	def			defaul tab to be loaded if none present in location
 *	
 **********/

function loadTab(prefix, def) {
	var tabs=window.location.hash.substring(1).split(',');
	if (tabs.length) {
		for (var i=0;i<tabs.length;i++) {
			if ((tabs[i].indexOf(prefix)!=-1) && document.getElementById(tabs[i])) {
				loadingTabs[tabs[i]]=true;
				var ret=document.getElementById(tabs[i]).childNodes[0].onclick();
				loadingTabs[tabs[i]]=false;
				return ret;
			}
		}
	}
	if (document.getElementById(def)) {
		loadingTabs[def]=true;
		var ret=document.getElementById(def).childNodes[0].onclick();
		loadingTabs[def]=false;
		return ret;
	} else return false;
}


/**********
 *
 *	Allows tab highlighting to be called manually.
 *
 *	@param	on		boolean, highligh or not
 *	@param	ele		tab element
 *	
 **********/

function hoverTab (on, ele) {
	if (on) {
		ele.parentNode.style.marginTop='0em';
		ele.parentNode.style.paddingBottom='0.45em';
		ele.parentNode.style.backgroundColor='#eee';
		ele.parentNode.style.cursor='pointer';
	} else if (ele.style.fontWeight != 'bold') {
		ele.parentNode.style.marginTop='0.25em';
		ele.parentNode.style.paddingBottom='0.20em';
		ele.parentNode.style.backgroundColor='#ddd';
	}
}


