
	// Script based on the one by Bill Pena found at
	// http://www.oreillynet.com/pub/a/javascript/2002/02/22/hierarchical_menus.html
	// Sliding implemented by Vaenthan Thiruvarudchelvan, 30 Nov 2003
	// Use, modify and distribute freely, but it would be nice if both names were 
	// preserved.

	var plusImg = new Image();
	plusImg.src = "gfx/plus.gif"
	var minusImg = new Image();
	minusImg.src = "gfx/minus.gif"

	var updateRate = 50;
	var slideSmoothness = 10;
	var slideDirection;
	var slideAngle;
	var slideAngleStep = (Math.PI / 2) / slideSmoothness;
	var slideAngleMax;
	var slideMax;
	var slideLevel;
	var slideImg;
	var slideTime = updateRate * slideSmoothness;

	// _subLevels and _subLines are a list for ALL sublevels (ie. fully expanded)
	// must be sorted in order to be closed in (ie, reverse sorted)

	function hideLevel( _levelId, _levelLines, _subLevels, _subLines ) 
	{
		var j = 0;

		// Hide sublevels
		if (_subLevels.length > 0)
		{
			var i;
			for (i = 0; i < _subLevels.length; i++) 
			{ 
			  // Don't hide already hidden levels
			  if ((document.getElementById(_subLevels[i])).style.display != "none")
			  {
				setTimeout("hideOneLevel('" + _subLevels[i] + "'," + _subLines[i] + ");", j*slideTime);
				j++;
			  }
			}
		}

		setTimeout( "hideOneLevel('" + _levelId + "'," + _levelLines + ");", j*slideTime);
	}
	
	
	function hideOneLevel( _levelId, _levelLines )
	{
		var thisLevel = document.getElementById( _levelId );
		var thisLevelLines = parseInt(_levelLines);
		var thisImg = document.getElementById( _levelId + "Img" );
		
		slideUp( thisLevel, thisLevelLines, thisImg );
	}
	
	
	function hideAll() 
	{
		hideLevel("chapters", "chapImg");
		hideLevel("projectlinks", "projImg");
		hideLevel("interestlinks", "intsImg");
	}
	
	
	function showLevel( _levelId, _levelLines, _subLevels , _subLines ) 
	{	
		var thisLevel = document.getElementById( _levelId );
		var thisLevelLines = parseInt(_levelLines);
		var thisImg = document.getElementById( _levelId + "Img" );
	
		if ( thisLevel.style.display == "none") 
		{ slideDown( thisLevel, thisLevelLines, thisImg ); }
		else
		{ hideLevel( _levelId, _levelLines, _subLevels, _subLines ); }
	}

	
	function slideDown( thisLevel, thisLevelLines, thisImg )
	{
		var slider = document.getElementById( "slider" );
		slideDirection = "down";
		slideAngle = Math.PI / 2;
		slideAngleMax = Math.PI;
		slideMax = parseInt(getElementStyle(thisLevel, "lineHeight", "line-height")) * thisLevelLines; 
		slideLevel = thisLevel;
		slideImg = thisImg;
		
		slider.style.height = 0;				// Show slider
		slider.style.display = "block";
		slide( );
	}
	
	
	function slideUp( thisLevel, thisLevelLines, thisImg )
	{
		var slider = document.getElementById( "slider" );
		slideDirection = "up";
		slideAngle = 0;
		slideAngleMax = Math.PI / 2;
		slideMax = parseInt(getElementStyle(thisLevel, "lineHeight", "line-height")) * thisLevelLines; 
		slideLevel = thisLevel;
		slideImg = thisImg;
		
		thisLevel.style.display = "none";		// Hide the block
		thisImg.src = plusImg.src;
		
		slider.style.height = slideMax;			// Show slider
		slider.style.display = "block";
		slide( );
	}
	
	
	function slide( )
	{
		var slider = document.getElementById( "slider" );

  		slideAngle += slideAngleStep;

 	    if (slideAngle >= slideAngleMax)
		{
			slider.style.display = "none"; 
			if (slideDirection == "down") 
			{ 
				slideLevel.style.display = "block";	// Show block
				slideImg.src = minusImg.src;
		    	return; 
			}
			else { return; }	// Block already be hidden in slideUp()
		}

		// Use the power of cos() squared!
		slider.style.height = Math.pow(Math.cos(slideAngle), 2) * slideMax;
		setTimeout("slide()", updateRate);
	}
	
	
	// This function to get effective style properties from 
	// http://www.oreillynet.com/pub/a/javascript/excerpt/JSDHTMLCkbk_chap5/index5.html
	
	function getElementStyle(elem, IEStyleProp, CSSStyleProp) 
	{
    	//var elem = document.getElementById(elemID);
    	if (elem.currentStyle)
		{
        	return elem.currentStyle[IEStyleProp];
	    } 
		else if (window.getComputedStyle) 
		{
			var compStyle = window.getComputedStyle(elem, "");
        	return compStyle.getPropertyValue(CSSStyleProp);
    	}
    	return "";
	}
	
