/*  ARWEB.MENUS.JS
 *  7-17-2006
 *  www.ArkansasWeb.com
 *  Taken from The Javascript Anthology by James Edwards & Cameron Adams.
 *  Script modified by Joshua Baker
 *
 *  Provides some functions to handle and display an accessible DHTML drop-down
 *  menu system. *Modified to function as a horizontal drop-down menu system.
 *  The menus must exist in HTML code as a list, with sub-menus being nested
 *  lists. The primary navigation list must have a unique id, and the top-level
 *  menu lists (the drop-downs) must be assigned consistent class names.
 *
 *  *** REQUIRES: arweb.window-xy.js ***
 */
 
var branch;

function dropdownMenu(navid, menuClass, menuWidth)
{
	var isopera = typeof window.opera != 'undefined';
	var isie = (typeof document.all != 'undefined'
		&& typeof window.opera == 'undefined'
		&& isopera && navigator.vendor != 'KDE');
	var issafari = navigator.vendor == 'Apple Computer, Inc.';
	
	if (typeof document.getElementById == 'undefined'
		|| (issafari && typeof window.XMLHttpRequest == 'undefined')
		|| (isie && typeof document.uniqueID == 'undefined'))
	{
		return;
	}
	
	var tree = document.getElementById(navid);
	if(tree)
	{
		branch = tree;
		var horiz = tree.className.indexOf('horizontal') != -1;
		var items = tree.getElementsByTagName('li');
		for (var i = 0; i < items.length; i++)
		{
			dropdownTrigger(tree, items[i], navid, menuClass, menuWidth, isie, horiz);
		}
		var eles = typeof document.all != 'undefined'
			? document.all : document.getElementsByTagName('*');
		for (i = 0; i < eles.length; i++)
		{
			attachEventListener(eles[i], 'focus', function(e)
			{
				var target = typeof e.target != 'undefined'
					? e.target : e.srcElement;
				if (!tree.contains(target))
				{
					resetSiblingBranches(items[0]);
				}
			}, false);
		}
		
		if (!isie)
		{
			tree.contains = function(node)
			{
				if (node == null) { return false; }
				if (node == this) { return true; }
				else { return this.contains(node.parentNode); }
			};
		}
	}
}

function dropdownTrigger(tree, li, navid, menuClass, menuWidth, isie)
{
	var opentime, closetime;
	var a = li.getElementsByTagName('a')[0];
	var menu = li.getElementsByTagName('ul').length > 0
		? li.getElementsByTagName('ul')[0] : null;
	var horiz = tree.className.indexOf('horizontal') != -1;
	var issub = li.parentNode.id == navid;
	
	if(menu)
	{
		li.className += (li.className == '' ? '' : ' ') + 'hasmenu';
	}
	
	attachEventListener(a, 'focus', function(e)
	{
		clearTimeout(closetime);
		
		a.className = 'rollover';
		
		resetSiblingBranches(li);
		if (menu)
		{
			showMenu(menu, menuClass, menuWidth);
		}
		
		var parent = li.parentNode;
		if (parent != tree)
		{
			if (parent.style.top == '' ||
				parent.style.top == '-1000px')
			{
				showAncestors(tree, parent, horiz, issub, isie);
			}
		}
	}, false);
	
	attachEventListener(li, 'mouseover', function(e)
	{
		if(unwantedTextEvent()) { return; }
		clearTimeout(closetime);
		if (branch == li) { branch = null; }
		
		a.className = 'rollover';
		
		var target = typeof e.target != 'undefined'
			? e.target : e.srcElement;
		while (target.nodeName.toUpperCase() != 'LI')
		{
			target = target.parentNode;
		}
		if (target != li) { return; }
		
		if(menu)
		{
			opentime = window.setTimeout(function()
			{
				if (branch)
				{
					clearMenus(branch)
					branch = null;
				}
				resetSiblingBranches(li);
				showMenu(menu, menuClass, menuWidth);
			}, 250);
		}
	}, false);
	
	attachEventListener(li, 'mouseout', function(e)
	{
		if (unwantedTextEvent()) { return; }
		
		var related = typeof e.relatedTarget != 'undefined'
			? e.relatedTarget : e.toElement;
		if (!li.contains(related))
		{
			clearTimeout(opentime);
			branch = li;
			
			a.className = '';
			if (menu)
			{
				closetime = window.setTimeout(function()
				{
					menu.style.top = '-1000px';
				}, 600);
			}
		}
	}, false);
	
	if (!isie)
	{
		li.contains = function(node)
		{
			if (node == null) { return false; }
			if (node == this) { return true; }
			else {return this.contains(node.parentNode); }
		};
	}
} // end dropdownTrigger

//function showMenu(menu, horiz, issub, li, a, isie)
function showMenu(menu, menuClass, menuWidth)
{
	if(menu.className == menuClass)
	{
		menu.style.left = '-1px';
		menu.style.top = '24px';
	}
	else
	{
		menu.style.left = menuWidth;
		menu.style.top = '0px';
	}

/*	menu.style.left = horiz
		? (isie ? a.offsetHeight + 'px' : 'auto')
		: '0'; */
/*	menu.style.top = horiz && issub
		? (isie ? a.offsetHeight + 'px' : 'auto')
		: (isie ? li.offsetTop + 'px' : '0'); */

	repositionMenu(menu);
}

function clearMenus(root)
{
	var menus = root.getElementsByTagName('ul');
	for (var i = 0; i < menus.length; i++)
	{
		menus[i].style.top = '-1000px';
	}
}

function unwantedTextEvent()
{
	return (navigator.vendor == 'Apple Computer, Inc.'
		&& (event.target == event.relatedTarget.parentNode
		|| (event.eventPhase == 3
		&& event.target.parentNode == event.relatedTarget)));
};

function repositionMenu(menu)
{
	var extent = [
		getRoughPosition(menu, 'x') + menu.offsetWidth + 25,
		getRoughPosition(menu, 'y') + menu.offsetHeight + 25
	];
	var viewsize = getViewportSize();
	
/*	if (extent[0] > viewsize[0])
	{
		var offset = menu.offsetWidth
			+ menu.parentNode.parentNode.offsetWidth;
		var inset = menu.parentNode.offsetWidth
			- menu.offsetLeft;
		
		menu.style.left = (0 - offset + (inset * 2)) + 'px'; 
	} */
	if (extent[1] > viewsize[1])
	{
		var current = parseInt(menu.style.top, 10);
		var difference = (extent[1] - viewsize[1]);
		
		menu.style.top = (current - difference) + 'px';
	}
}

function showAncestors(tree, menu, horiz, issub, isie)
{
	clearMenus(tree);
	
	while (menu.id != tree.id)
	{
		var li = menu.parentNode;
		var a = li.getElementsByTagName('a')[0];
		
		showMenu(menu, menuClass, menuWidth);
		
		menu = li.parentNode;
	}
}

function resetSiblingBranches(trigger, tree)
{
	clearMenus(trigger.parentNode);
	
	var links = trigger.parentNode.getElementsByTagName('a');
	for (var i = 0; i < links.length; i++)
	{
		links[i].className = '';
	}
}