
// Global variables
var timerlen = 2;
var slideAniLen = 350;

var timerID = new Array();
var startTime = new Array();
var obj = new Array();
var endHeight = new Array();
var moving = new Array();
var dir = new Array();
var inners = new Array();

var nextmove = new Array();		// this stores what the next move is.  allows for chaining animations.


	// slide an element down
	function slidedown(objname){
		if(moving[objname]) {
			nextmove[objname] = "down";
			return;
		}
	
		if(document.getElementById(objname).style.display != "none")
			return; // cannot slide down something that is already visible
	
		moving[objname] = true;
		dir[objname] = "down";

		fadeTo(objname, 100, 300);
		startslide(objname);
	}
	
	
	// slide an element up (hide it)
	function slideup(objname){
		if(moving[objname]) {
			nextmove[objname] = "up";
			return;
		}
	
		if(document.getElementById(objname).style.display == "none")
			return; // cannot slide up something that is already hidden
	
		moving[objname] = true;
		dir[objname] = "up";

		fadeTo(objname, 0, 300);
		startslide(objname);
	}
	
	
	// toggle the slide - if it's up, slide it down; and visa versa.
	function toggleSlide(objname){
		if(document.getElementById(objname).style.display == "none"){
			// div is hidden, so let's slide down
			slidedown(objname);
		} else {
			// div is not hidden, so slide up
			slideup(objname);
		}
	}



	// start the slide operation - performs some setup work, and then start animating
	function startslide(objname){
		obj[objname] = document.getElementById(objname);
	

		obj[objname].style.display = "block";		// so that we can grab the scrollHeight. else returns NaN
		obj[objname].style.border = '1px solid black';
		if (document.getElementById(objname).style.width == '') { document.getElementById(objname).style.width = obj[objname].scrollWidth+'px';  }
	
		endHeight[objname] = parseInt(obj[objname].scrollHeight);
		startTime[objname] = (new Date()).getTime();

		obj[objname].style.border = '';

	
		if (inners[objname] !== 'true') { 
			var inn_wid = obj[objname].scrollWidth;
			inners[objname] = "true"; 
	
			obj[objname].style.position = 'relative';
			obj[objname].style.overflow = 'hidden';
	
			var new_str = '<div id="' + objname + '_inners" style="position:absolute; bottom:0; margin:0; padding:0; width:' + inn_wid + 'px;">' + obj[objname].innerHTML + '</div>';
			obj[objname].innerHTML = new_str;
		}
	
		if(dir[objname] == "down"){
			obj[objname].style.height = "1px";
		} else {
			obj[objname].style.height = endHeight[objname] + "px";
		}
		timerID[objname] = setInterval('slidetick(\'' + objname + '\');',timerlen);
	}


	// INTERNAL FUNCTION - used in the setinterval call.
	function slidetick(objname){
		var elapsed = (new Date()).getTime() - startTime[objname];
	
		if (elapsed > slideAniLen) {
			endSlide(objname);
		} else {
			var d =Math.round(elapsed / slideAniLen * endHeight[objname]);
			if(dir[objname] == "up") {
				d = endHeight[objname] - d;
			}
			
			document.getElementById(objname).style.height = d + "px";
		}
	
		return;
	}
	
	
	// CLEAN UP FUNCTION - supports chaining animation
	function endSlide(objname){
		clearInterval(timerID[objname]);
	
		obj[objname].style.height = endHeight[objname] + "px";

		if(dir[objname] == "up") {
			obj[objname].style.display = "none";
		}

		delete(moving[objname]);
		delete(timerID[objname]);
		delete(startTime[objname]);
		delete(endHeight[objname]);
		delete(obj[objname]);
		delete(dir[objname]);
		
		// chain the animation
		if (nextmove[objname] == "down") 	{ slidedown(objname); }
		if (nextmove[objname] == "up")		{ slideup(objname); }
		nextmove[objname] = '';
	
		return;
	}