// *** submenu position *******************************************************

// Two positions are available for now. New positions can be easily added.
var WM_BOTTOM = "bottom";
var WM_RIGHT = "right";

// Margin values in pixels. Allows for submenu position to be fine-tuned.
var MARGIN_BOTTOM = 1;
var MARGIN_RIGHT = 1;


// *** item activation ********************************************************

// One set of global values is enough, 
// no one can navigate more than one menu at the time.

// There can be only one active item at the time on whole page.
var currentItem = null;

// There is only one way to reach a submenu. 
// The trail to that submenu is kept in this array.
// Every time an item is activated trail has to be reset. 
// All submenus after the current level removed and the current one added.
var menuTrail = new Array();

// This is needed when switching from one menu to another with two different
// styles, otherwise last element gets styleOff from the other menu.
var currentStyleOff = null;

// This function activates an item. 
// An item is active when mouse is over that item.
// Parameters:
// - item  . . . . . . . item to be activated
// - level . . . . . . . level of the submenu
// - styleOn . . . . . . style class name when item is active
// - styleOff. . . . . . style class name when item is not active
// - submenuId . . . . . id of the submenu that is to be attached to this item, pass null if no submenu
// - submenuPosition . . position of the submenu, ex: WM_RIGHT or WM_BOTTOM, pass null if no submenu
function wmItemOn(item, level, styleOn, styleOff, submenuId, submenuPosition)
{
	//  debug("level:" + level + ", styleOn:" + styleOn + ", styleOff:" + styleOff + ", submenu:" + submenuId + "/" + submenuPosition);
	stopOffTimer();

	// turn off previous item 
	if (currentItem != null)
	{
		if (styleOff != currentStyleOff && currentStyleOff != null)
		{
			currentItem.className = currentStyleOff;
		}
		else
		{
			currentItem.className = styleOff;
		}
	}

	// make this item new current item
	currentItem = item;
	item.className = styleOn;
	currentStyleOff = styleOff;

	if (submenuId != null)
	{
		// take care of attached submenu
		hide(level);
		var menu = document.getElementById(submenuId);

		// item dimensions: item.offsetHeight, item.offsetWidth
		if (submenuPosition == WM_BOTTOM)
		{
			menu.style.top = findOffsetTop(item) + item.offsetHeight + MARGIN_BOTTOM;
			menu.style.left = findOffsetLeft(item) + 4;
		}
		if (submenuPosition == WM_RIGHT)
		{
			menu.style.top = findOffsetTop(item);
			menu.style.left = findOffsetLeft(item) + item.offsetWidth + MARGIN_RIGHT;
		}

		menu.style.visibility = "visible";

		menuTrail[level] = menu;
	}
	else
	{
		// item has no submenu attached, update the menuTrail
		hide(level);
	}
}


// Hide all submenus after the level passed in, inclusive.
function hide(level)
{
	for (var i = level; i < menuTrail.length; i++)
	{
		menuTrail[i].style.visibility = "hidden";
	}
}


// *** timer ******************************************************************
// Timer is needed to turn off all items and submenus, once mouse moves away from the menu.

var timerID = null;
var timerOn = false;
var timecount = 150;

// gui
function wmStartOffTimer(milsecs)
{
	if (!milsecs)
		milsecs = 200;

	if (timerOn == false)
	{
		timerID = setTimeout("offAll()", milsecs);
		timerOn = true;
	}
}


function stopOffTimer()
{
	if (timerOn)
	{
		clearTimeout(timerID);
		timerID = null;
		timerOn = false;
	}
}

// Hide all submenus and turn current item off.
function offAll()
{
	hide(0);

	if (currentStyleOff != null)
	{
		currentItem.className = currentStyleOff;
	}

	debug("All off by timer.");
}


// *** debug ******************************************************************
// Print text to the debug element. If the element that debugId is pointing to is not found on the page, it does nothing.

var debugId = "wmDebug";

function debug(text)
{
	var debug = document.getElementById(debugId);
	if (debug != null)
	{
		debug.innerHTML = "&raquo; " + text + "<br>" + debug.innerHTML;
	}
}


// *** position ***************************************************************

// Find total left offset.
function findOffsetLeft(obj)
{
	if (obj.className=="s1_menu_On")
	{
		var curleft = -5;
	}
	else
	{
		var curleft = -1;
	}

	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
	{
		curleft += obj.x;
	}
	return curleft;
}

// Find total top offset.
function findOffsetTop(obj)
{
	var curtop = -1;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
	{
		curtop += obj.y;
	}
	return curtop;
}

