//Modified version of treeMenu.js described in The Javascript Anthology
//by James Edwards and Cameron Adams (Collingwood, Australia: Sitepoint, 2006).
//Original code downloaded from publisher's Web site:
//http://www.sitepoint.com/books/jsant1/code.php

function treeMenu(navid, indexpage)
{
	if (typeof document.getElementById == 'undefined') { return; }
	var tree = document.getElementById(navid);
	if (tree)
	{
		var items = tree.getElementsByTagName('li');
		for (var i = 0; i < items.length; i++)
		{
			treeTrigger(tree, items[i], navid);
		}

		if (navigator.vendor == 'Apple Computer, Inc.'
				|| typeof window.opera != 'undefined')
		{
			displayReset(tree);
		}

	}
}


var isreset = false;

function displayReset(tree)
{
	var menus = tree.getElementsByTagName('ul');
	for (var i = 0; i < menus.length; i++)
	{
		if (menus[i].style.position != 'static' && menus[i].className != 'keep')
		{
			menus[i].style.display = 'none';
		}
		menus[i].style.position = 'static';
	}
	isreset = true;
}

function treeTrigger(tree, li, navid)
{
	var a = li.getElementsByTagName('a')[0];
	
	var menu = li.getElementsByTagName('ul').length > 0
		? li.getElementsByTagName('ul')[0] : null;
	
	li.onclick = function(e)
	{
		var target = e ? e.target : window.event.srcElement;
		while (target.nodeName.toUpperCase() != 'LI')
		{
			target = target.parentNode;
		}
		if (target == this && isreset)
		{
			if (menu && menu.className != 'showl')
			{
				if (menu.style.display == 'none')
				{
					clearSiblingBranches(this);
					menu.style.display = 'block';
					a.className += (a.className=='' ? '' : ' ') + 'rollover';
									
				}
				else 
				{
					 
						menu.style.display = 'none';
						a.className = a.className.replace(/ ?rollover/g, '');
				}
				return false;
			}
			else
			{
				return true;
			}
		}
	};

	attachEventListener(a, 'keyup', function(e)
	{
		if (!isreset && e.keyCode == 9)
		{
			displayReset(tree);
		}
	}, false);

	var moves = 0;
	attachEventListener(a, 'mousemove', function()
	{
		if (!isreset)
		{
			moves++;
			if (moves > 2) { displayReset(tree); }
		}
	}, false);
}

function clearSiblingBranches(trigger)
{
	var menus = trigger.parentNode.getElementsByTagName('ul');
	for (var i = 0; i < menus.length; i++)
	{
		menus[i].style.display = 'none';

		var a = menus[i].parentNode.getElementsByTagName('a')[0];
		if (a)
		{
			a.className = a.className.replace(/ ?rollover/g, '');
		}
	}
}

function attachEventListener(target, eventType, functionRef, capture)
{
	if (typeof target.addEventListener != 'undefined')
	{
		target.addEventListener(eventType, functionRef, capture);
	}
	else if (typeof target.attachEvent != 'undefined')
	{
		target.attachEvent('on' + eventType, functionRef);
	}
	else
	{
		eventType = 'on' + eventType;

		if (typeof target[eventType] == 'function')
		{
			var oldListener = target[eventType];

			target[eventType] = function()
			{
				oldListener();

				return functionRef();
			}
		}
		else
		{
			target[eventType] = functionRef;
		}
	}
	
	return true;
}

function addLoadListener(fn)
{
	if (typeof window.addEventListener != 'undefined')
	{
		window.addEventListener('load', fn, false);
	}
	else if (typeof document.addEventListener != 'undefined')
	{
		document.addEventListener('load', fn, false);
	}
	else if (typeof window.attachEvent != 'undefined')
	{
		window.attachEvent('onload', fn);
	}
	else
	{
		var oldfn = window.onload;
		if (typeof window.onload != 'function')
		{
			window.onload = fn;
		}
		else
		{
			window.onload = function()
			{
				oldfn();
				fn();
			};
		}
	}
}

addLoadListener(function() { treeMenu('navigation', 'index.html'); });
