var SCROLL_TIME = 500;
var oldDiv;
var currentDiv;
var allGNSAnchors;

function revealSub(id, timeout){
	
	var anchor = document.getElementById(id);
	var newDiv = anchor.parentNode.lastChild;
	if(!currentDiv){
		for(var i = 0; i != allGNSAnchors.length; ++i)
			allGNSAnchors[i].className = "";
		currentDiv = newDiv;
		startScrollDiv(id);
	}
	else if(newDiv != currentDiv){
		for(var i = 0; i != allGNSAnchors.length; ++i)
			allGNSAnchors[i].className = "";
		currentDiv = newDiv;
		hideOldDiv();
		setTimeout("startScrollDiv('" + id + "')", timeout);
	}
	return true;
}


function hideOldDiv(){
	var gns = document.getElementById('gns')
	var gnsUL = findFirstElementChild(gns);
	var nodes = gnsUL.childNodes;
	for(var i = 0; i != nodes.length; ++i){
		if(nodes[i].tagName && nodes[i].tagName.toLowerCase() == 'li'){
			var div = findLastElementChild(nodes[i]);
			if(div.style.height && div.style.height.length && div.style.height != "0px"){
				if(div != currentDiv){
					oldDiv = div;
					scrollUpDiv(new Date().getTime());
				}
				return;
			}
		}
	}
}
function startScrollDiv(id){
	document.getElementById(id).className = "selected";
	scrollDiv(new Date().getTime());
}
function scrollDiv(started){
	var millisPassed = new Date().getTime() - started;
	if(millisPassed > SCROLL_TIME)
		currentDiv.style.height = currentDiv.scrollHeight + "px";
	else{
		currentDiv.style.height = currentDiv.scrollHeight * millisPassed / SCROLL_TIME + "px";
		setTimeout("scrollDiv(" + started + ")",0);
	}
}
function scrollUpDiv(started){
	var millisPassed = new Date().getTime() - started;
	if(millisPassed > SCROLL_TIME)
		oldDiv.style.height = "0px";
	else{
		oldDiv.style.height = (currentDiv.scrollHeight - currentDiv.scrollHeight * millisPassed / SCROLL_TIME) + "px";
		setTimeout("scrollUpDiv(" + started + ")",0);
	}
}
function findFirstElementChild(node){
	var child = node.firstChild;
	while(!child.tagName)
		child = child.nextSibling;
	return child;
}
function findLastElementChild(node){
	var child = node.lastChild;
	while(!child.tagName)
		child = child.previousSibling;
	return child;
}

var setUpGNSAlready = false;

function setUpGNS(){

	if(setUpGNSAlready)
		return;
		
	setUpGNSAlready = true;
	
	var gns = document.getElementById('gns')
	var gnsUL = findFirstElementChild(gns);
	var nodes = gnsUL.childNodes;
	var anchors = new Array();
	for(var i = 0; i != nodes.length; ++i){
		if(nodes[i].tagName && nodes[i].tagName.toLowerCase() == 'li'){
		
			var anchor = findFirstElementChild(nodes[i]);
			if(anchor.tagName.toLowerCase() == 'a'){
				anchors.push(anchor);
				anchor.id = "GNS_Anchor_" + i;
				//eval("anchor.onclick = function(){return revealSub('GNS_Anchor_" + i + "');}");
			}
		}
	}
	
	allGNSAnchors = anchors;
	
	for(var i = 0; i != nodes.length; ++i){
		if(nodes[i].tagName && nodes[i].tagName.toLowerCase() == 'li'){
			var anchor = findFirstElementChild(nodes[i]);
			//if node is marked as current selected node then expand it. ( should be only one )
			if(anchor.className == "selected")
			{
				revealSub("GNS_Anchor_" + i, SCROLL_TIME);
			}	
		}
	}	
}

onload = setUpGNS;