var speed = 7;
var eventsEnabled = true;

function jsfOnLoadHideElements(jh)
{
	var jhs = document.getElementsByClassName(jh,null,null);
	for(var i=0; i<jhs.length; i++)
	{
		jhs[i].style.display="none";
	}
}

function jsfOnLoadShowElements(js)
{
	var jhs = document.getElementsByClassName(js,null,null);
	for(var i=0; i<jhs.length; i++)
	{
		jhs[i].style.display="";
	}
}

//extend an object with addition methods/properties
function jsfExtendObject(d, s)
{
	for (p in s)
	{
		d[p] = s[p];
	}
	return d;
}

function jsfOnLoadAttachHideShow(trg,hsi,hse,caf,imp,imm)
{
	//get all raw triggers
	var tgs = document.getElementsByClassName(trg,null,"a");
	
	//get all raw elements
	var elm = document.getElementsByClassName(hse,null,null);

	//for all the raw triggers with/without numbers
	var reg = new RegExp("(^|\\w*)"+hsi+"(\\d*|([\\w* ]))");
	
	//set up hide/show element attributes and methods
	for(var i=0; i<elm.length; i++)
	{
		//if i have an associated image, let me control it's hide/show
		//get all images associated with me
		elm[i] = jsfExtendObject(elm[i],
			{
				hide:function()
				{
					if (eventsEnabled) {
						eventsEnabled = false;
						//this.style.display = "none";
						jstHide(this);
						this.hidden = true;
						for(var i=0;i<this.images.length;i++)
						{
							if(this.images[i].className.match(imp))
							{
								this.images[i].style.display="";
							}
							if(this.images[i].className.match(imm))
							{
								this.images[i].style.display="none";
							}
						}
					}
				},
				show:function()
				{
					if (eventsEnabled) {
						eventsEnabled = false;
						//this.style.display = "";
						jstShow(this);
						this.hidden = false;
						for(var i=0;i<this.images.length;i++)
						{
							if(this.images[i].className.match(imp))
							{
								this.images[i].style.display="none";
							}
							if(this.images[i].className.match(imm))
							{
								this.images[i].style.display="";
							}
						}
					}
				},
				toggle:function()
				{
					if(this.hidden)
					{
						this.show();
					}
					else
					{
						this.hide();
					}
				},
				init:function()
				{
					this.hidden = this.style.display===""?false:true;
					this.images = document.getElementsByClassName(reg.exec(this.className)[0],null,"span");
					for(var i=0;i<this.images.length;i++)
					{
						if(this.images[i].className.match(imp))
						{
							this.images[i].style.display=this.hidden?"":"none";
						}
						if(this.images[i].className.match(imm))
						{
							this.images[i].style.display=this.hidden?"none":"";
						}
					}
				},
				hidden:false,
				hsElement:true,
				images:[]
			}
		);
		elm[i].init();
	}

	//set up all the triggers with the elements
	for(var i=0; i<tgs.length; i++)
	{
		tgs[i] = jsfExtendObject(tgs[i],
			{
				onclick:function()
				{
					//get all elements that match the item class
					var els = document.getElementsByClassName(reg.exec(this.className)[0],null,null);

					//only close elements not controlled by me
					if(this.className.match(caf) && caf.length>0)
					{
						ael = document.getElementsByClassName(hse,null,null);
						for(var j=0;j<ael.length;j++)
						{
							if(ael[j].className.match(caf) && reg.exec(this.className)[0]!=reg.exec(ael[j].className)[0])
							{
								ael[j].hide();
							}
						}
					}

					for(var j=0; j<els.length; j++)
					{
						//hide/show anything that isn't the trigger
						if(els[j].hsElement)
						{
							els[j].toggle();
						}
					}
					return false;
				}
			}
		);
	}
}

/**
* jsfAttachEvent
* Author: Nick Bogaerts 13/11/2007
* Description: creates hide/show functionality for all uls except the last within divs with class sRootClassName.
*/
function jsfOnLoadCreateHideShows(sRootClassName, sSeparator, sAClassName, iSkip) {
	var iHSCounter = 0;
	var inCM = (window.location.search.indexOf("debug")!=-1);
	var oRootDivs = document.getElementsByClassName(sRootClassName, null, "DIV");
	for (var i = 0; i < oRootDivs.length; i++) {
		var oChildDivs = oRootDivs[i].getElementsByTagName("DIV");
		var oHSDivs = new Array();
		for (var j = 0; j < oChildDivs.length; j++)
		  if (oChildDivs[j].className.match(sRootClassName))
		    oHSDivs.push(oChildDivs[j]);
		for (var i = iSkip; i; i--) oHSDivs.pop();
		for (var oHSDiv = oHSDivs.pop(); oHSDiv; oHSDiv = oHSDivs.pop()) {
			if (!inCM && divEmpty(oHSDiv)) {
			  oHSDiv.style.display="none";
			  continue;
			}
			var sRadix = oHSDiv.className.substr(oHSDiv.className.indexOf(sRootClassName) + sRootClassName.length + sSeparator.length);
			var bStartHidden = sRadix.indexOf("hidden") === 0;
			if (bStartHidden) sRadix = sRadix.substr("hidden".length + sSeparator.length);
			var sHideText = sRadix.substr(0, sRadix.indexOf(sSeparator));
			var sShowText = sRadix.substr(sRadix.indexOf(sSeparator) + sSeparator.length);
			insertHideShow(oHSDiv, sRootClassName, sHideText, sShowText, sAClassName, bStartHidden);
		}
	} 
	
	function insertHideShow(oElm, sRoot, sHideText, sShowText, sAClassName, bStartHidden) {
		
		var oUls = oElm.getElementsByTagName("DIV");
		var oPs = oElm.getElementsByTagName("H2");
		if (!oPs.length) oPs = oElm.getElementsByTagName("P");
		if (oUls.length && oPs.length) {
			if (bStartHidden) oUls[0].className += " jstHide"
			oUls[0].className += " " + sRoot + "Elm " + sRoot + "Item" + iHSCounter;
			var oHideSpan = document.createElement("SPAN");
			oHideSpan.innerHTML = sHideText;
			oHideSpan.className = sRoot + "Plus " + sRoot + "Item" + iHSCounter;
			var oShowSpan = document.createElement("SPAN");
			oShowSpan.innerHTML = sShowText;
			oShowSpan.className = sRoot + "Minus " + sRoot + "Item" + iHSCounter;
			var oA = document.createElement("A");
			oA.href = "#";
			oA.className = sAClassName + " " + sRoot + "Trg " + sRoot + "Item" + iHSCounter;
			oA.appendChild(oHideSpan);
			oA.appendChild(oShowSpan);
			oPs[0].appendChild(oA);
			iHSCounter++;
		}
	}
	
	function divEmpty (d) {
		var dCnt = isMSIE ? d.innerText : d.textContent;
		var hCnt = d.getElementsByTagName("h2");
		if (!hCnt.length) hCnt = d.getElementsByTagName("p");
		if (!hCnt.length) return true;
		if (d.className && d.className.indexOf("noRemove")!=-1)
		  return false;
		hCnt = isMSIE ? hCnt[0].innerText : hCnt[0].textContent;
		dCnt = dCnt.substr(dCnt.indexOf(hCnt)+hCnt.length);
		if (dCnt==null || dCnt=="") return true;
		if (dCnt.match(/^[\s\012\015]*$/)) return true; 
		return false;
	}
}

var hsQueue = [];

function jstShow(elm) {
	var oHt = elm.offsetHeight;
	elm.style.display = '';
	var fHt = elm.offsetHeight;
	elm.style.overflow = 'hidden';
	elm.style.height = oHt + 1 + 'px';
	hsQueue.push(Array(elm,'show',fHt));
	glideProc(hsQueue[0]);
}

function jstHide(elm) {
	elm.style.height = elm.offsetHeight + 'px';
	elm.style.overflow = 'hidden';
	hsQueue.push(Array(elm,'hide',null));
	glideProc(hsQueue[0]);
}

function glideShow(elm,ht) {
	if(elm.offsetHeight+speed < ht) {
		elm.style.height = Number(Number(elm.style.height.replace(/[^0-9]/g,"")) + speed) + String('px');
		var t = setTimeout("glideProc(hsQueue[0]);",1);
	}
	else {
		elm.style.height = 'auto';
		elm.style.overflow = '';
		hsQueue.shift();
		eventsEnabled = true;
	}
}

function glideHide(elm) {
	var ht = elm.style.height.replace(/[^0-9]/g,"");
	if(ht-speed > 0) {
		elm.style.height = Number(ht - speed) + String('px');
		var t = setTimeout("glideProc(hsQueue[0]);",1);
	}
	else {
		elm.style.display = 'none';
		elm.style.height = '';
		elm.style.overflow = '';
		hsQueue.shift();
		eventsEnabled = true;
	}
}

function glideProc(attr) {
	if(attr) {
		if(attr[1] == 'hide') {
			glideHide(attr[0]);
		}
		else if(attr[1] == 'show') {
			glideShow(attr[0],attr[2]);
		}
	}
}

function jsfOnLoad()
{
	var sRoot = "jstAutoHS";
	var sRoot2 = "jstAutoHS2";
	if (!isMSIE || MSIEVersion > 5.2) jsfOnLoadCreateHideShows(sRoot, "_", "hShowHide", 1);
	if (!isMSIE || MSIEVersion > 5.2) jsfOnLoadCreateHideShows(sRoot2, "_", "hShowHide", 0);
	jsfOnLoadHideElements("jstHide");
	jsfOnLoadShowElements("jstShow");
	if (!isMSIE || MSIEVersion > 5.2) jsfOnLoadAttachHideShow(sRoot + "Trg", sRoot + "Item", sRoot + "Elm","jstHideAllFirst", sRoot + "Plus", sRoot + "Minus");
	if (!isMSIE || MSIEVersion > 5.2) jsfOnLoadAttachHideShow(sRoot2 + "Trg", sRoot2 + "Item", sRoot2 + "Elm","jstHideAllFirst", sRoot2 + "Plus", sRoot2 + "Minus");
	jsfOnLoadAttachHideShow("jstHsTrg","jstHsItem","jstHsElm","jstHideAllFirst","jstHsPlus","jstHsMinus");

}

jsfAttachEvent(window,'load',jsfOnLoad);
