// 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);

        if(menu && hasChildren(menu))
        {
            // item dimensions: item.offsetHeight, item.offsetWidth
            if (submenuPosition == WM_BOTTOM)
            {
                menu.style.top = (findOffsetTop(item) + item.offsetHeight + MARGIN_BOTTOM) + 'px';
                menu.style.left = findOffsetLeft(item) + 'px';
            }

            if (submenuPosition == WM_RIGHT)
            {
                menu.style.top = findOffsetTop(item) + 'px';
                menu.style.left = (findOffsetLeft(item) + item.offsetWidth + MARGIN_RIGHT) + 'px';
            }
            menu.style.visibility = "visible";
            menuTrail[level] = menu;
        }
    }
    else
    {
        // item has no submenu attached, update the menuTrail
        hide(level);
    }
}

function hasChildren(e)
{
    result = 0
    for(i=0; i<e.childNodes.length; i++)
    {
        if(e.childNodes[i].nodeName == "DIV") result++
    }
    debug("Has " + result + " children")
    return result > 0;
}

// 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 = 500;

function wmStartOffTimer()
{
    if (timerOn == false) {
        timerID = setTimeout("offAll()", timecount);
        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.");
}


function debug(text)
{
    //console.log(text)
}


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

// Utility code to calculate element position.

// Find total left offset.
function findOffsetLeft(e)
{
    var thisLeft = 0;
    if (e)
    {
        if (e.x > 0) {thisLeft = e.x;}
        else if (e.offsetParent) {
	  thisLeft = e.offsetLeft;
	  while (e.offsetParent) {
            e = e.offsetParent
            if (e.offsetLeft > 0) {thisLeft += e.offsetLeft;}
          }
        }
    }
    return thisLeft;

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

    }
    else curleft=640;

    return curleft;
}

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

    return curtop;
}


function adjustMenuPosition2()
{
    var m = document.getElementById("menuAnchor");

    if (m)
    {
        var l;
        l = findOffsetLeft(m);
        var el = document.getElementsByTagName("div");

        for (var i=0; i<el.length; i++)
        {
            if (el[i].className == "wmSubMenuHidden")
            {
                el[i].style.left = l;
            }
        }
    }
}+'px'

