/* 

 * ----------------------------------------------------------------------------

 * WebMenu

 * 

 * Version: 1.0

 * Release date: 2005.01.30

 * 

 * Copyright (c) Amir Firdus (Firdus Software), 2005.

 * All rights reserved.

 * 

 * License:

 * This software is free as long as this header is not removed.

 * Firdus Software welcomes improvements, suggestions as well as

 * news about successful application. To contact us, please use either

 * email or message board available at www.firdus.com.

 * ---------------------------------------------------------------------------- 

 */





// *** note ******************************************************************* 



// Public methods, those that are intended to be used on a web page,

// are prefixed with wm.





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

    }



    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 = 250;



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.");

}





// *** 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) {

	return;

  var debug = document.getElementById(debugId);

  if (debug != null) {

     debug.innerHTML = "&raquo; " + text + "<br>" + debug.innerHTML;

  }

}





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



// Utility code to calculate element position.



// Find total left offset.

function findOffsetLeft(obj){

  var curleft = 0;

  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 = 0;

  if (obj.offsetParent)	{

    while (obj.offsetParent){

      curtop += obj.offsetTop

      obj = obj.offsetParent;

    }

  }else if (obj.y){

    curtop += obj.y;

  }



  return curtop;

}







