Event.observe(window, 'load', addNavigationEvents);

var EFFECT_FAMILY = 'slide';
var EFFECT_DURATION = 0.2;

var TOC_SCROLL_EFFECT_DURATION = 1;

function addNavigationEvents() {
	// main navigation
	timeouts = new Hash();
	
	$$('.nav_top_element').each(function(e) {
		// ensure that all relevant elements have an id
		e.identify();
		e.select('.nav_elements')[0].hide().identify();
		
		e.observe('mouseover', showNavEntry);
		e.observe('mouseout', hideNavEntry);
	});
	
	$$('.location_element').each(function(e) {
		if( e.select('.nav_elements').length > 0 ) {
			// ensure that all relevant elements have an id
			e.identify();
			e.select('.nav_elements')[0].hide().identify();
			
			e.observe('mouseover', showNavEntry);
			e.observe('mouseout', hideNavEntry);
		}
	});
	
	// table of contents
	$$('a[href^="#"]').each(function(e) {
		var href = e.readAttribute('href');
		var targetId = href.substr(1, href.length-1);
		if( ! targetId.empty() ) {
			e.writeAttribute('onclick', 'return false;');
			e.observe('click',function(event) {
				Effect.ScrollTo(targetId, {duration: TOC_SCROLL_EFFECT_DURATION});
				window.setTimeout('location.hash = "#'+targetId+'"', TOC_SCROLL_EFFECT_DURATION*1000);
			});
		}
	});
}


function showNavEntry(event) {
	if( timeouts.get(this.identify()) != undefined ) {
		clearTimeout( timeouts.get(this.identify()) );
		timeouts.unset(this.identify());
	} else {
		showNavEntryCore(this.identify());
	}
}

function hideNavEntry(event) {
	timeouts.set( this.identify(), setTimeout("hideNavEntryCore('" + this.identify() + "')", 100) );
}

function showNavEntryCore(id) {
	var element = $(id).select('.nav_elements')[0];
	if( ! element.visible() )
		Effect.toggle(element, EFFECT_FAMILY, {duration: EFFECT_DURATION, queue: { position: 'end', scope: id, limit: 1 }});
}

function hideNavEntryCore(id) {
	var element = $(id).select('.nav_elements')[0];
	if( element.visible() )
		Effect.toggle(element, EFFECT_FAMILY, {duration: EFFECT_DURATION, queue: { position: 'end', scope: id, limit: 2 }});
	timeouts.unset(id);
}
