browser_DOM = (document.getElementById) ? true : false;
browser_Khtml = (navigator.product) ? (navigator.product.indexOf('khtml') >= 0) : false;
browser_Opera = (navigator.appName) ? (navigator.appName.indexOf('Opera') >= 0) : false;
browser_IE = (document.all) ? (!browser_Khtml && !browser_Opera) : 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));

//document.write('browser_IE: '+browser_IE);


/*
 * 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 parentMenu = menu.parent;
    //alert(par.menu);
    if (parentMenu.menu.activeItem == parentMenu)
	return;

    clearTimeout(menu.root.focusEvent);
    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(subID);
	menuItem.noSubMenu == (menuItem.subMenu == null);
	
	if (menuItem.subMenu) {
	    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) {
    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);
}


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 menuInit(menu) {
    if (menu.root)
	return menu;

    menu.root = (menu.parent ? menu.parent.menu.root : menu);
    
    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;");
    }
    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;
	    var drus = menu.root;
	    z = new PageOffset(menu.parent);
	    if(browser_IE || 1==1) {
		var hest = new PageOffset(drus);
		y = z.y - hest.y + drus.offsetTop - 1;
		x = z.x + menu.parent.offsetWidth - hest.x + drus.offsetLeft;
	    } else {
		y = z.y;
		x = z.x + menu.parent.offsetWidth;
	    }
	    menu.style.left = x + "px";
	    menu.style.top  = y + "px";
	}
	if(menu.offsetWidth < 1 || !browser_IE){
	    //alert(menu.style.width + " =  " + mWidth);
	    menu.style.width = mWidth;
	}
	
	if(menu.offsetWidth < menu.parent.offsetWidth){
		menu.style.width = menu.parent.offsetWidth + "px";
	    }
}

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

	    
	    y = mParent.y - 90;// -  mRootOffset.y + mRoot.offsetTop + mRoot.offsetHeight - 1;
	    x = mParent.x  - mRootOffset.x + mRoot.offsetLeft + menu.parent.offsetWidth;
	    //alert("width: " + menu.parent.offsetWidth );
	    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;
}