

	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="";
		}
	}

	function jsfOnLoadAttachHideShow(trg,hsi,hse,caf,imp,imm,ptg,txtp,txtm)
	{
		//for all the raw triggers with/without numbers
		var reg = new RegExp("(^|\\w*)"+hsi+"(\\d*|([\\w* ]))");
		
		//get all raw triggers
		var tgs = document.getElementsByClassName(trg,null,"a");
		
		//get all raw elements
		var elm = document.getElementsByClassName(hse,null,null);
		
		//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()
					{
						this.style.display = "none";
						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()
					{
						this.style.display = "";
						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,"a");
						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";
							}
						}
					},
					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(window,'load',jsfOnLoad);

	function jsfOnLoad()
	{
		jsfOnLoadHideElements("jstHide");
		jsfOnLoadAttachHideShow("jstHsTrg","jstHsItem","jstHsElm","jstHideAllFirst","jstHsPlus","jstHsMinus","readmore","Read more","Hide");
	}