/***********************************************
* AnyLink Drop Down Menu- © Dynamic Drive (www.dynamicdrive.com)
* This notice MUST stay intact for legal use
* Visit http://www.dynamicdrive.com/ for full source code
***********************************************/

/*
 * Heavily modified by Ben Birney, www.bbirney.com
 * Note: page SCIDs double as menu element identifiers and menu identifiers.
 */

var menuPixelWidth = 125; //default menu width
var menuwidth = menuPixelWidth + 'px' ;
var menubgcolor = 'lightyellow';  //menu bgcolor
var disappeardelay = 50;  //menu disappear speed onMouseout (in milliseconds)
var hidemenu_onclick = "yes"; //hide menu when user clicks within menu?
var topoffset = 0;
var leftoffset = 0;
var sub_top_offset = 0;
var sub_left_offset = 0;
var indent_width = 4;
var submenus_on = false;
var depth_offset_marker = '';
var fade_in_period = 0;

var menus = new Array();
var menu_divs = new Array();
var dropmenu_objects = new Array();
var sub_parents = new Array();
var open_menus = new Array();
var hiding_menus = new Array();
var delayhide = new Array();
var	debug_mode = false;

function set_fade_in_period(milliseconds)
{
	fade_in_period = milliseconds;
}

function set_submenus_on()
{
	submenus_on = true;
}

function set_submenus_off()
{
	submenus_on = false;
}

function set_delay(delay_value)
{
	disappeardelay = delay_value;
}

function set_menu_width(pixel_width)
{
	menuPixelWidth = pixel_width;
	menuwidth = menuPixelWidth + "px";
}

function set_depth_indent(pixel_width)
{
	indent_width = pixel_width;
}

function debugging_on()
{
	debug_mode = true;	
}

function debugging_off()
{
	debug_mode = false;
}

function add_menu(name, scid, classname, onmouseover, onmouseout)
{
	name = String(name);
	menus[name] = new Array();
	
	if(classname == "" || !classname)
	{
		classname = "SC_dropmenu_div";
		if(debug_mode)
			Logger.info("No classname specified for menu " + name + ". Defaulting to SC_dropmenu_div");
	}
	else
	{
		if(debug_mode)
			Logger.info("Created menu " + name + " with classname " + classname);
	}
		
	new_div = '<div id="dropmenudiv_' + scid
		+ '" class="' + classname + '" style="visibility:hidden" onmouseover="clearhidemenu(' + scid + ');' + onmouseover
		+ '" onmouseout="dynamichide(event,' + scid + ');' + onmouseout + '"></div>';
	
	menu_divs[scid] = new_div;
	
	prepdiv(scid);
}

function add_menu_item(name, position, parent, link, depth, classname, scid, has_sub_menu, onmouseover, onmouseout)
{		
	if(classname == "" || !classname)
	{
		classname = "SC_dropmenu_element";
		if(debug_mode)
			Logger.info("No classname specified for menu item " + name + ". Defaulting to SC_dropmenu_element");
	}
	else
	{
		if(debug_mode)
			Logger.info("Created menu item " + name + " with classname " + classname);
	}

	if(has_sub_menu)
	{
		menus[parent][position] = '<span class="' + classname + '">'
			+ '<a href="' + link + '"' 
				+ ' onmouseover="dropdownmenu(this, event, menus[' + scid + '], \'\', ' + scid + ', true);' + onmouseover + '"'
				+ ' onmouseout="' + onmouseout + '"'
				+ '>'
			+ name + ' &raquo;' 
			+ '</a>' 
			+ '</span>';
			
		sub_parents[scid] = parent;
	}
	else
	{
		grandparent = sub_parents[parent];
	
		menus[parent][position] 
			= '<span class="' + classname + '">'
			+ '<a href="' + link + '"';
			
		//onmouseover for menu <a> elements needs to clearhidemenu for parent and grandparent, if there is one. This is so you can
		//cut diagonally across non-related menu items to get to the sub-menu; otherwise the whole thing disappears on a diagonal cross.
		if(grandparent)
		{
			menus[parent][position] = menus[parent][position]
				+ ' onmouseover="clearhidemenu(' + grandparent + ', ' + parent + ')"';
		}
		else
		{
			menus[parent][position] = menus[parent][position]
				+ ' onmouseover="clearhidemenu(' + parent + ')"';
		}
		
		if(!submenus_on || depth > 2)
		{
			depth_indent = depth * indent_width;
			new_width = menuPixelWidth - depth_indent;
			
			menus[parent][position] = menus[parent][position]
				+ ' style="padding-left: ' + depth_indent + 'px;width:' + new_width + 'px;"';	
		}

		menus[parent][position] = menus[parent][position] + '>' 
			+ name 
			+ '</a></span>';
	}
	
	menu_divs[scid] = '<div id="dropmenudiv_' + scid + '" name="dropmenudiv_' + scid + '"'
		+ 'class="' + classname + '" style="visibility:hidden" onmouseover="clearhidemenu(' + scid + ');" onmouseout="dynamichide(event,' + scid + ');"></div>';
		
	prepdiv(scid);
}

function set_offsets(top,left)
{
	topoffset = top;
	leftoffset = left;
}

function set_sub_offsets(top, left)
{
	sub_top_offset = top;
	sub_left_offset = left;
}

//For menus using sub-menus, marker will be appended to the beginning of quarternary and deeper items.
//For menus not using sub-menus, marker will be appended to the beginning of tertiary and deeper items.
//Marker will be appended a number of times equal to the level of depth below either tertiary or secondary,
//respectively.

function set_depth_offset_marker(marker)
{
	depth_offset_marker = marker;
}

var ie4=document.all;
var ns6=document.getElementById&&!document.all;

function prepdiv(scid)
{
	if (ie4||ns6)
	{
		div_contents = menu_divs[scid];
		document.write(div_contents);
	}
}

function cleardiv(scid)
{
	if (ie4||ns6)
	{
		document.removeNamedItem('dropmenudiv_' + scid);
	}
}

function getposOffset(what, offsettype)
{
	var totaloffset=(offsettype=="left")? what.offsetLeft : what.offsetTop;
	var parentEl=what.offsetParent;
	
	while (parentEl!=null)
	{
		totaloffset=(offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
		parentEl=parentEl.offsetParent;
	}
	
	return totaloffset;
}


function showhide(obj, e, visible, hidden, menuwidth, scid)
{
	dropmenuobj = dropmenu_objects[scid];

	if (ie4||ns6)
		dropmenuobj.style.left=dropmenuobj.style.top="-500px";

	if (menuwidth!="")
	{
		dropmenuobj.widthobj=dropmenuobj.style;
		dropmenuobj.widthobj.width=menuwidth;
	}
	
	if (e.type=="click" && obj.visibility==hidden || e.type=="mouseover")
	{
		if(fade_in_period > 0)
		{
			changeOpac(0, dropmenuobj.id);
			obj.visibility=visible;
			opacity(dropmenuobj.id, 0, 100, fade_in_period);
		}
		else
		{
			obj.visibility=visible;
		}
		
	}
	else if (e.type=="click")
	{
		obj.visibility=hidden;
		
	}
	else
	{
		obj.visibility=visible;
		
	}
}

function iecompattest()
{
	return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body;
}

function clearbrowseredge(obj, whichedge, scid)
{
	dropmenuobj = dropmenu_objects[scid];

	var edgeoffset=0;
	
	if (whichedge=="rightedge")
	{
		var windowedge=ie4 && !window.opera? iecompattest().scrollLeft+iecompattest().clientWidth-15 : window.pageXOffset+window.innerWidth-15;

		dropmenuobj.contentmeasure=dropmenuobj.offsetWidth;
	
		if (windowedge-dropmenuobj.x < dropmenuobj.contentmeasure)
			edgeoffset=dropmenuobj.contentmeasure-obj.offsetWidth
	}
	else
	{
		var topedge=ie4 && !window.opera? iecompattest().scrollTop : window.pageYOffset;
		var windowedge=ie4 && !window.opera? iecompattest().scrollTop+iecompattest().clientHeight-15 : window.pageYOffset+window.innerHeight-18;
		
		dropmenuobj.contentmeasure=dropmenuobj.offsetHeight;

		if (windowedge-dropmenuobj.y < dropmenuobj.contentmeasure)
		{ //move up?
			edgeoffset=dropmenuobj.contentmeasure+obj.offsetHeight;
			
			if ((dropmenuobj.y-topedge) < dropmenuobj.contentmeasure) //up no good either?
				edgeoffset=dropmenuobj.y+obj.offsetHeight-topedge
		}
	}
	
	return edgeoffset;
}

function populatemenu(what, scid)
{
	dropmenuobj = dropmenu_objects[scid];

	if ((ie4||ns6) && what)
		dropmenuobj.innerHTML=what.join("");
}


function dropdownmenu(obj, e, menucontents, menuwidth, scid, is_sub)
{
	dropmenuobj = dropmenu_objects[scid];

	if (window.event) 
		event.cancelBubble=true;
	else if (e.stopPropagation) 
		e.stopPropagation();
		
	clearhidemenu(scid);
	
	dropmenu_objects[scid]=document.getElementById? document.getElementById("dropmenudiv_" + scid) : dropmenudiv;
	
	dropmenuobj = dropmenu_objects[scid];
	
	populatemenu(menucontents, scid);

	if (ie4||ns6)
	{
		showhide(dropmenuobj.style, e, "visible", "hidden", menuwidth, scid);
		
		if(!open_menus[scid])
		{
			open_menus[scid] = true;
		}
		
		dropmenuobj.x = getposOffset(obj, "left")+leftoffset;
		dropmenuobj.y = getposOffset(obj, "top")+topoffset;
		
		menu_left = dropmenuobj.x - clearbrowseredge(obj, "rightedge", scid);
		menu_top = dropmenuobj.y - clearbrowseredge(obj, "bottomedge", scid) + obj.offsetHeight;
		
		//Is this a sub-menu? If so, add the parent menu's width to the left offset.
		if(is_sub)
		{
			menu_left += menuPixelWidth + sub_left_offset;
			menu_top -= obj.offsetHeight;
			menu_top += sub_top_offset;
		}
		
		dropmenuobj.style.left = menu_left + "px";
		dropmenuobj.style.top = menu_top + "px";
		
		//Re-open the parent scid if we're opening a child.
		if(is_sub)
		{
			parent_scid = sub_parents[scid];
			
			if(!open_menus[parent_scid])
			{
				parent_dropmenuobj = dropmenu_objects[parent_scid];
				
				dropdownmenu(parent_dropmenuobj, e, menus[parent_scid], '', parent_scid, false);
			}
			else
			{
				//Debugging here, if you like.
			}
				
		}
	}

	return clickreturnvalue();
}

function clickreturnvalue()
{
	if (ie4||ns6) 
		return false;
	else 
		return true;
}

function contains_ns6(a, b) 
{
	while (b.parentNode)
	{
		if ((b = b.parentNode) == a)
			return true;
	}

	return false;
}

function dynamichide(e, scid)
{
	dropmenuobj = dropmenu_objects[scid];
	
	do_toggle = false;
	
	if (ie4 && !dropmenuobj.contains(e.toElement))
		do_toggle = true;
		
	else if (ns6 && e.currentTarget != e.relatedTarget && !contains_ns6(e.currentTarget, e.relatedTarget))	
		do_toggle = true;
		
	if(do_toggle)
	{
		
		delayhidemenu(scid, true);
	
		//Examine the open menus
		for(key in open_menus)
		{
			//The scid we are examining
			open_menu_scid = open_menus[key];
			
			//DO NOT hide the menu referenced by scid if one of its children is open.
			if(sub_parents[open_menu_scid] == scid)
				return;
		}		
	}	
	
	//Examine the children
	for(child_scid in sub_parents)
	{
		//The parent of the child we are examining
		parent_scid = sub_parents[child_scid];
		
		//DO hide the menu referenced by child_scid if it is a child of THIS menu, scid,
		//and the child menu is open.
		if(parent_scid == scid && open_menus[child_scid])
		{
			delayhidemenu(child_scid, false);
		}
	}
	
	//Also try to hide the parent. If the mouse transit's back into the parents space,
	//the delayhide will be cancelled.
	parent_scid = sub_parents[scid];
	if(parent_scid)
		delayhidemenu(parent_scid, true);
	
}

function hidemenu(e, scid)
{
	dropmenuobj = dropmenu_objects[scid];

	//Examine the children, but only if we're not forcing closure
	for(child_scid in sub_parents)
	{
		//The parent of the child we are examining
		parent_scid = sub_parents[child_scid];
		
		//DO NOT hide the menu referenced by parent_scid if it is the parent of a 
		//child that is open (and not waiting to close)
		if(parent_scid == scid && open_menus[child_scid] && !hiding_menus[child_scid])
			return;
	}

	if(!hiding_menus[scid])
		return;

//	Logger.info("hidemenu " + scid);

	if (typeof dropmenuobj!="undefined")
	{
		if (ie4||ns6)
		{
			dropmenuobj.style.visibility="hidden";
			open_menus[scid] = false;
			hiding_menus[scid] = false;
		}
		else
		{
			if(Logger.error)
				Logger.error("compat error");
		}
	}
	else
	{
		if(Logger.error)
			Logger.error("dropmenuobj no good");
	}
}

function delayhidemenu(scid, wait_extra)
{
//	Logger.info("delayhidemenu " + scid);

	if (ie4||ns6)
	{
		if(wait_extra)
		{
			if(BrowserDetect.browser == "Explorer" && BrowserDetect.OS == "Windows")
				delayhide[scid] = setTimeout('hidemenu(0, ' + scid + ')', disappeardelay+100, 'JavaScript');
			else
				delayhide[scid] = setTimeout(hidemenu, disappeardelay+100, 'JavaScript', scid);
		}
		else
		{
			if(BrowserDetect.browser == "Explorer" && BrowserDetect.OS == "Windows")
				delayhide[scid] = setTimeout('hidemenu(0, ' + scid + ')', disappeardelay, 'JavaScript');
			else
				delayhide[scid] = setTimeout(hidemenu, disappeardelay, 'JavaScript', scid);
		}
			
		hiding_menus[scid] = true;
	}
}

//Accepts any number of SCIDs as arguments
function clearhidemenu()
{
	var args = clearhidemenu.arguments;


	for(i=0; i < args.length; i++)
	{
		the_scid = args[i];
						
		if (typeof delayhide[the_scid] != "undefined" && hiding_menus[the_scid])
		{
			clearTimeout(delayhide[the_scid]);
			hiding_menus[the_scid] = false;
		}
	}
}

if (hidemenu_onclick=="yes")
	document.onclick=hidemenu;