/***************************************************************

	jslib.js (C) 2007, BCD-Compat license

***************************************************************/

function dget(id){
	return document.getElementById(id);
}

var block_startfade=false;
var allow_new_fade=true;
var fade_calcs_per_sec=40;
var execwhendonelist="";
var fps=40;

function hidemore(a)
{
	e=dget(a);
	if (!e.fullContent) e.fullContent=e.innerHTML;
	s=e.innerHTML.split(/moretag/i);
	if (s.length>1)
	{
		q=s.shift();
		r=s.join("moretag");
		t=q+ "moretag\" alt='' style='cursor:pointer' title='click here to see more' src='/l/g/more.gif' onclick='e=getElementById(\""+a+"\"); e.innerHTML=e.lessContent'>"
		e.moreContent=t;
		t=q+ "moretag\" alt='' style='cursor:pointer' title='click here to see less' src='/l/g/less.gif' onclick='e=getElementById(\""+a+"\"); e.innerHTML=e.moreContent'><gibble \""+r
		e.lessContent=t;
		e.innerHTML=e.moreContent;
	}
}

function selectIndex(id,val) // pass id and value
{
	o=dget(id).options;
	for (p=0; p<o.length; p++) if (o[p].value == val) return (dget(id).selectedIndex=p);
}

function unhidemore(a)
{
	e=dget(a);
	if (!e.fullContent) e.fullContent=e.innerHTML;
	e.innerHTML=e.fullContent;
}

function slide_background(id,start_x,start_y,end_x,end_y,seconds)
{
	obj=dget(id)
			obj.bg_target_x=end_x;
	obj.bg_target_y=end_y;
	obj.bg_delta_x=(end_x-start_x)/(fps*seconds);
	obj.bg_delta_y=(end_y-start_y)/(fps*seconds);
	obj.bg_steps=fps*seconds;
	obj.bg_curstep=1;
	slide_background_(id);
}

function slide_background_(id)
{
	obj=dget(id);
	pos_x=obj.bg_target_x;
	pos_y=obj.bg_target_y;
	if (obj.bg_curstep <obj.bg_steps)
	{
		setTimeout("slide_background_('"+id+"')",1000/fps);
		pos_x-=obj.bg_delta_x*(obj.bg_steps-obj.bg_curstep);
		pos_y-=obj.bg_delta_y*(obj.bg_steps-obj.bg_curstep);
		obj.bg_curstep++;
	}
	obj.style.backgroundPosition=pos_x+"px "+pos_y+"px";
	return 1;
}

// obj.id, 0-100, 0-100, 1.0s, eval(str) *only* if 0 or 100 is hit.
function fadestart(id,startvalue,endvalue,time,execwhendone){
	var a=dget(id);
	a.set = function (attr,val) {a.setAttribute(attr,val)}
	if ( !isNaN( parseInt(dget(id).getAttribute("fadestatus")) ) ) {
		a.set("fadestepsize",((startvalue-endvalue)/(fade_calcs_per_sec*time)*100) );
		a.set("fadegoal",endvalue);
		a.set("exec",execwhendone);
		return;
	}
	a.set("fadestatus",startvalue);
	a.set("fadegoal",endvalue);
	a.set("fadestepsize",((startvalue-endvalue)/(fade_calcs_per_sec*time)*100) );
	a.set("exec",execwhendone);
	fade_step(id);
}

function fade_cancel(id){
	dget(id).set("fadestatus","");
}

function set_opacity(id,i){
	if(i>100)i=100;
	if(i<0)i=0;
	i=Math.abs(i);
	a=dget(id);
	a.style.MozOpacity=i/100;
	a.style.filter="alpha(opacity="+i+")";
	a.style.opacity=i/100;
}

function fade_step(id){
	a=dget(id);
	var i=parseInt(a.getAttribute("fadestatus"));
	var g=parseInt(a.getAttribute("fadegoal"));
	var s=parseInt(a.getAttribute("fadestepsize"))/100;
	if (s>0 && s<1) s=1;
	else if (s<0 && s>-1) s=-1;

	if ((s<0 && i<g) || (s>0 && i>g)){
		i-=s;
		if ((s<0 && i>g) || (s>0 && i<g)) i=g;
		set_opacity(id,i);
		a.set("fadestatus",i)
				setTimeout("fade_step('"+id+"');",1000/fade_calcs_per_sec);
	}
	else {
		if(i==0 && g==0){
			a.className="invisible";
			if (a.getAttribute("exec")!=""){
				if (execwhendonelist!="") clearTimeout(execwhendonelist);
				execwhendonelist+=a.getAttribute("exec");
				setTimeout(execwhendonelist+" execwhendonelist='';",1);
			}
		}
		a.setAttribute("fadestatus","");
	}
}

function getHTTPObjectUser() {
	var xmlhttp;
	if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
		try {xmlhttp = new XMLHttpRequest();} catch (e) {xmlhttp = false;}
	}

	if(!xmlhttp && typeof ActiveXObject != "undefined"){
		try{ xmlhttp=new ActiveXObject("MSXML2.XMLHTTP"); }catch(e){xmlhttp=false;}
		if(!xmlhttp)try{ xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){xmlhttp=false;}
	}
	return xmlhttp;
}

// if callBack is "" write response to ref.innerHMTL
// if callBack and ref are "", discard the response
function reqHTTP(strURL,strReq,callBack,ref) {
//	alert(strURL+"\n"+strReq+"\n"+callBack+"\n"+ref);
	var xmlHttpReq = false;
	var req = (ref=="")?this:dget(ref);
	if (callBack == "") callback = "reqToHTML";
	req.xmlHttpReq=getHTTPObjectUser();
	req.xmlHttpReq.open('POST', strURL, true);
	req.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	req.xmlHttpReq.onreadystatechange = function() {
		if (req.xmlHttpReq.readyState == 4)
		{
			var val = req.xmlHttpReq.responseText;
			var resp = callBack + "(val,ref)";
			eval(resp);
		}
	}
	req.xmlHttpReq.send(strReq);
}

function reqToHTML(response,id) // default callback
{
	if (id == "") return;
//	alert("response= "+response+" id= "+id);
	dget(id).innerHTML=response;
}

function reqToVoid(response,id) // discard callback
{
	return 1;
}
// a = toggleall, b = togglenext, c = object to toggle, d=marker format
function setupDisplayToggle(a,b,c,d)
{
	var i,m;
	var view=document.getElementsByName(b);
	var hide=document.getElementsByName(c);
	i=view.length;
	while (i > 0)
	{
		i--;
		view[i].hideObject=hide[i];
		if (dget(c+"M")) view[i].onmouseover = function () {displayMouseOver(this.hideObject)};
		view[i].onclick = function () {displayToggle(this.hideObject)};
		view[i].className=b;
		view[i].style.cursor="pointer";
		hide[i].className=c;
		if (d>0) view[i].innerHTML="["+(i+1)+"] "+view[i].innerHTML;
	}
	view=document.getElementsByName(a);
	i=view.length;
	while (i > 0)
	{
		i--;
		view[i].hideObject=c;
		view[i].onclick = function () {displayToggleAll(this.hideObject)};
		view[i].className=a;
		view[i].style.cursor="pointer";
		if (d>1) view[i].innerHTML+="[*]";
	}
	hide[0].displayToggle="none";
	displaySetAll(c,"none"); // default to saving browser space.
}

function displayMouseOver(a)
{
	dget(a.id+"M").innerHTML=a.innerHTML;
}

function displaySetAll(a,b)
{
	var i;
	var view=document.getElementsByName(a);
	i=view.length;
	while (i > 0)
	{
		i--;
		view[i].style.display=b;
	}
}

function toggleCheckboxes()
{
	var inputlist = document.getElementsByTagName("input");
	for (i = 0; i < inputlist.length; i++)
	{
		if ( inputlist[i].getAttribute("type") == 'checkbox' )
		{ // look only at input elements that are checkboxes
			if (inputlist[i].checked) inputlist[i].checked = false
			else inputlist[i].checked = true;
		}
	}
}

function displayToggleAll(a)
{
	var view=document.getElementsByName(a);
	view=(view[0].displayToggle=(view[0].displayToggle=="none")?"inline":"none");
	displaySetAll(a,view);
}

function displayToggle(a)
{
	a.style.display = (a.style.display == "none")? "inline":"none";
}

function displaySet(a,b)
{
	dget(a).style.display=b;
}

function revealForm(a,b)
{
	dget(a).style.display="inline";
	dget(b).focus();
}

/* menu functions, relies on these menu classes being in style.css!!! */
mSaved = ""
function boxOff(which){
	which.className='mOff'
	if (document.all) {
		Message.innerHTML = mSaved;
		Message.className='mOff';
	}
	else if (document.getElementById) {
		dget("Message").innerHTML = mSaved;
		dget("Message").className = 'mOff';

	}
}

function boxOn(which,message){
	which.className='mOn'
	if (document.all){
		mSaved = Message.innerHTML;
		Message.innerHTML = message;
		Message.className = 'mOn';
	}
	else if (document.getElementById){
		mSaved = dget("Message").innerHTML;
		dget("Message").innerHTML = message;
		dget("Message").className = 'mOn';

	}
}

// reference code from quirksmode.org:
function setCookie(cookieName,cookieValue,nDays) {
	var today = new Date();
	var expire = new Date();
	if (nDays==null || nDays==0) nDays=1;
	expire.setTime(today.getTime() + 3600000*24*nDays);
	document.cookie = cookieName+"="+escape(cookieValue)+
		";expires="+expire.toGMTString();
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}
// end reference code from quirksmode.org

/**************************************************************************************************

	ChangeLog:
	 
		V 0.2.6:	20100130 (WB)
	o Added selectIndex function
	
		V 0.2.5:	20091120 (WB)
	o Added background slide function
	
		V 0.2.4:	20091021 (WB)
	o Added Fade functions, shrank parts of the code. 

		V 0.2.3:       20091009  (AW)
        o Added toggleCheckboxes

                V 0.2.2:        20071212
	o made setupDisplayToggle() add pointer: cursor property
	o redefined 3rd parameter to mean 0: no tags, 1+: [#] leading elements 2+: [*] on toggle

		V 0.2.1:	20071019
	o added menu functions in (combined with my menu.js v0.1.0 from 20070603)
	o added automatic styles matching names passed to setupDisplayToggle()

		V 0.2.0:	20071017
	o added revealForm()
	o added automatic focus to named form element
	o added displayMouseOver() to show hidden contents on mouseover

		V 0.1.1		20070605
	o removed redundant displaySetAll() code from setupDisplayToggle()

		V 0.1.0		20070603
	o basic folding code and init function actually work

**************************************************************************************************/
