
browser_DOM = (document.getElementById) ? true : false;
browser_Khtml = (navigator.product) ? (navigator.product.indexOf('khtml') >= 0) : false;
browser_IE = (document.all) ? (!browser_Khtml) : false;
browser_NS = (document.layers) ? true : ((navigator.vendor) && (navigator.vendor.indexOf('Netscape') >=0 ));
browser_Mac = (navigator.appVersion.indexOf("Mac") != -1);
browser_Gecko = (browser_DOM && browser_NS) || ((navigator.product) && (navigator.product.indexOf('Gecko') >= 0));


/*
 * send onLostFocus to a menuItem
 */

function item_unFocus(menuItem) {
    menuItem.menu.hideDelay = menuItem.onLostFocus();
    if ((menuItem.menu.hideDelay >= 0) && (menuItem.subMenu)) {
	menu_unFocus(menuItem.menu, menuItem.menu.hideDelay);
    }
}

/*
 * send onShow event to a menuitem's submenu
 */

function menu_show(menu, delayTime, parentMenu) {
    if (!menu || delayTime < 0) return;
    //var par = menu.parent;
    //alert(par.menu);
    if (parentMenu.menu.activeItem == parentMenu)
	return;

    clearTimeout(menu.rootfocusEvent);
    menu.root.focusEvent = null;
    menu.root.focusEventObj = null;
    
    if (delayTime > 0) {
	menu.root.focusEventObj = menu;
	menu.root.focusEvent =
	setTimeout("menu_show(document.getElementById('" +
	menu.root.id + "').focusEventObj, 0);", delayTime, parentMenu);
	return;
    }
    
    clearTimeout(menu.root.hideEvent);
    menu.root.hideEvent = null;
    menu.root.hideEventObj = null;
    
    if (menu.parent.menu.activeItem)
	menu_unFocus(menu.parent.menu, 0);
    
    menu.parent.menu.activeItem = menu.parent;
    menu.onShow();
}

/*
 * Send focus event to a menuItem
 */
function item_focus(menuItem) {
    var rootMenu = menuItem.menu.root;

    if (rootMenu.focusedItem == menuItem)
	return;

    // if an item is already focused, unfocus it
    if (rootMenu.focusedItem) {

	// if we're moveing focus to another menu, set focus in the previously focused menu to it's active item.
	if (rootMenu.focusedItem.menu != menuItem.menu) {
	    if (rootMenu.focusedItem.menu.activeItem)
		item_focus(rootMenu.focusedItem.menu.activeItem);

	    rootMenu.focusedItem = menuItem.menu.activeItem;
	}

	// if item already got focus, hide sub-sub menu of this menuitem
	if (menuItem.subMenu && menuItem.subMenu.activeItem && (menuItem == rootMenu.focusedItem))
	    menu_unFocus(menuItem.subMenu, menuItem.subMenu.showDelay);
    }

    if (menuItem == rootMenu.focusedItem)
	return;

    clearTimeout(rootMenu.hideEvent);
    rootMenu.hideEvent = null;

    if (rootMenu.focusedItem)
	item_unFocus(rootMenu.focusedItem);

    rootMenu.focusedItem = menuItem;

    var menu = menuItem.menu;

    if ((!menuItem.subMenu) && (!menuItem.noSubMenu)) {
	
	var subID;
	if ( menuItem.getAttribute("id") && menuItem.getAttribute("id").match(/main(\d+)/) ){

			    subID = "m" + RegExp.$1;
	}
	//menuItem.subMenu = document.getElementById(menuItem.getAttribute("submenu"));
	//alert("sub: " + menuItem.getAttribute("submenu") + " id: " + menuItem.getAttribute("id"));
	menuItem.subMenu = document.getElementById(subID);// ? document.getElementById(menuItem.getAttribute("submenu")):null;
	menuItem.noSubMenu == (menuItem.subMenu == null);
	if (menuItem.subMenu) {
	    //alert("Main: " + menuItem.id + " Sub: " + subID + " Subitem: " + menuItem.subMenu.id);
	    menuItem.subMenu.parent = menuItem;
	    menuInit(menuItem.subMenu);
	    menuItem.subMenu.setPosition();
	}
    }else{
	//We position the menu each time to make shure it dosn't move on window resize
	menuItem.subMenu.setPosition();
    }
   
    menu.showDelay = menuItem.onGotFocus();

    if (menu.hideDelay<0) 
	menu.hideDelay = menu.showDelay;

    if (menu.activeItem && (menu.hideDelay>=0))
	menu_unFocus(menu, menu.hideDelay);

    if (menuItem.subMenu) {
	// alert(menuItem);
	menu_show(menuItem.subMenu, menu.showDelay, menuItem);
    }
}

/*
 * Send onNoFocus event to a menu
 */

function menu_unFocus(menu, timeOut) {
    if (!menu || (timeOut < 0))
	return false;

    var rootMenu = menu.root;
    var menuItem = menu.activeItem;

    if (!menuItem)
	return false;
    
    if (timeOut > 0) {
	rootMenu.focusEventObj = rootMenu;
	rootMenu.focusEvent = setTimeout("menu_unFocus(document.getElementById('" + menu.id + "'), 0);", timeOut);
	return false;
    }

    // remove focus from active menuitem
    if (rootMenu.focusedItem != menuItem) {
	menuItem.onLostFocus();
    }

    /* hide submenu */
    if (menu.activeItem.subMenu.activeItem)
	menu_unFocus(menu.activeItem.subMenu, 0);
    
    /* Hide this menu */
    menu.activeItem.subMenu.onHide();
    menu.activeItem = null;
    
    return true;
}

/*
 *
 */

function menuItemMouseoverM(menuItem) {
    if ( menuItem.menu != menuItem || menuItem.menu.mouseOver == "false"){
    
	var rootMenu = menuItemInit(menuItem).menu.root;
	clearTimeout(rootMenu.mouseOutEventPending);
	
	rootMenu.mouseOutEventPending = null;
	
	if (rootMenu.focusedItem != menuItem) {
	    clearTimeout(rootMenu.focusEvent);
	    rootMenu.focusEvent = null;
	    rootMenu.focusEventObj = null;
	    
	    if (!rootMenu.focusedItem)
		rootMenu.focusedItem = menuItem.menu.activeItem;
	}
	if (rootMenu.focusedItem != menuItem)
	    item_focus(menuItem);

	if(menuItem.menu != menuItem)
	    menuItem.menu.mouseOver = "true";
    }
}


function menuMouseout(menu) {
    var rootMenu = menu.root;
    clearTimeout(rootMenu.mouseOutEventPending);
    rootMenu.mouseOutEventPending = null;
    var menuItem = rootMenu.focusedItem;

    // accept event only if this menu is the same as the menu with focus
    if (menuItem && (menuItem.menu == menu))
	rootMenu.mouseOutEventPending = setTimeout("menuMouseoutM(document.getElementById('" + menu.id + "'));", 1);
}

function menuMouseoutM(menu) {
    var rootMenu = menu.root;
    var menuItem = rootMenu.focusedItem;
    rootMenu.mouseOutEventPending = null;

    if ((!menuItem) || (menuItem.menu != menu))
	return;

    clearTimeout(rootMenu.focusEvent);

    rootMenu.focusEvent = null;

    if (menu.activeItem != menuItem) {
	item_unFocus(menuItem);
	if (menu.activeItem != null)
	    item_focus(menu.activeItem);
    }

    rootMenu.focusedItem = null;
    menu_unFocus(rootMenu, rootMenu.onLostFocus());
}




/*
 *  Initialize menu,
 *
 */

function menuItemInit(menuItem) {
    if (menuItem.initialized)
	return menuItem;

    menuItem.onGotFocus = function() {
	menuItem.hilite();
	// The timeout before showing a menu
	//return 200;
	return 0;
    }
    
    menuItem.onLostFocus = function() {
	menuItem.difuse();
	return -1;
    }

    menuItem.difuse = function() {
	removeClassName(menuItem, (menuItem.menu.parent ? "menuItemHighlight" : "rootMenuItemActive"));
    }
    
    menuItem.hilite = function() {
	menuItem.className += menuItem.menu.parent ? " menuItemHighlight" : " rootMenuItemActive";
	//addClassName(menuItem, (menuItem.menu.parent ? "menuItemHighlight" : "rootMenuItemActive"));
    }

    menuItem.initialized = true;
    return menuItem;
}

function menuItemOut(menuItem){
    menuItem.menu.mouseOver = "false";
}

function menuInit(menu) {
    if (menu.root)
	return menu;

    menu.root = (menu.parent ? menu.parent.menu.root : menu);

    if (menu.id != "rootMenu"){
	menu.menu = menu;
	menu.mouseOver = "false";
	menu.onmouseover = new Function("return menuItemMouseoverM(this);");
	}
    var i, itemList;
    itemList = menu.getElementsByTagName("a");
    for (i = 0; i < itemList.length; i++) {
	itemList[i].menu = menu;
	itemList[i].onmouseover = new Function("return menuItemMouseoverM(this);");
	itemList[i].onclick = new Function("this.blur(); return true;");
	itemList[i].onmouseout = new Function("return menuItemOut(this)");
    }
    menu.onmouseout = new Function("menuMouseout(document.getElementById(this.id));");

    /*
     * mouseout event function
     */

    menu.setPosition = function() {
	if (menu.root != menu) {
	    var mWidth = menu.offsetWidth;
	    var x, y, z;
	    mParent = new PageOffset(menu.parent);
	    var mRoot = menu.root;
	    var mRootOffset = new PageOffset(mRoot);

	    if (menu.parent.menu == menu.root) {
		y = mParent.y -  mRootOffset.y + mRoot.offsetTop + mRoot.offsetHeight - 1;
		x = mParent.x  -  mRootOffset.x + mRoot.offsetLeft;
	    }else {
		y = mParent.y -  mRootOffset.y + mRoot.offsetTop - 1;
		x = mParent.x + menu.parent.offsetWidth -  mRootOffset.x + mRoot.offsetLeft;
	    }
	    
	    menu.style.left = x + "px";
	    menu.style.top  = y + "px";
	    
	    if(menu.offsetWidth < 1 || !browser_IE){
		menu.style.width = mWidth;
	    }

	    if(menu.offsetWidth < menu.parent.offsetWidth){
		menu.style.width = menu.parent.offsetWidth + "px";
	    }	    
	}
    }
    
    /*
     *
     */
    
    menu.onHide = function() {
	menu.style.visibility = "hidden";
    }

    // return true if menu is displayed
    menu.onShow = function() {
	menu.style.visibility = "visible";
    }

    // return mseconds til onNoFocus event is to be sent;
    menu.onLostFocus = function() {
	// The timeout before the menu hides
	return 1000;
    }

    menu.onGotFocus = function() {
    }
    
    return menu;
}

function removeClassName(el, name) {

  var i, curList, newList;

  if (el.className == null)
    return;

  newList = new Array();
  curList = el.className.split(" ");
  for (i = 0; i < curList.length; i++)
    if (curList[i] != name)
      newList.push(curList[i]);
  el.className = newList.join(" ");
}


function addClassName(el, name) {
  var i, curList, newList;

  if (el.className == null)
    return;

  newList = new Array();
  curList = el.className.split(" ");
  for (i = 0; i < curList.length; i++)
    if (curList[i] != name)
      newList.push(curList[i]);
  newList.push(name);
  el.className = newList.join(" ");

}


function PageOffset(el) {
    this.x = el.offsetLeft;
    this.y = el.offsetTop;
    if (el.offsetParent != null) {
	var z;
	z = new PageOffset(el.offsetParent);
	this.x += z.x;
	this.y += z.y;
    }
    
    return;
}
