

//===========================
// Debug stuff
/*
var debug = window.open("", "debug");

function out(win, text) {
    var i;

    for (i = text.indexOf('<'); i != -1; i = text.indexOf('<'))
	text = text.substring(0, i) + "&lt;" + text.substring(i + 1);

    for (i = text.indexOf('>'); i != -1; i = text.indexOf('>'))
	text = text.substring(0, i) + "&gt;" + text.substring(i + 1);

    win.document.writeln(text + "<br>");
}
*/



//////////////////////////////////////////////////////////////
//  Constructor and initalization

var menus = new Array();

function menuItem(name, parent) {
    m = new Object();
    m.name = name;
    m.parent = parent;
    m.x = 0;
    m.y = 0;
    m.level = 0;
    m.status = HIDE;
    menus[menus.length] = m;
    return m;
}

function initMenu() {
    if (menus.length == 0)
	return;

    //out(debug, "menus.length " + menus.length);

    for (var i=0; i < menus.length; i++) {
	m = menus[i];
	//out(debug, "initMenu i is " + i + " and m is " + m.name);

	if (m.parent == null) {
	   //out(debug, "parent is null - calling set level on: " + m.name);
	    setLevel(m);
	}
    }


/* debug
    for (i=0; i < menus.length; i++) {
	d = menus[i];
	//out(debug, d.level + " name:" + d.name + " parent:" + d.parent);
    }
*/
}

function setLevel(rootMenu) {
   // out(debug, "in setLevel: root is " + rootMenu.name);
    for (var i=0; i < menus.length; i++) {
	//out(debug, "setLevel i is " + i + " and m is " + m.name);
	m = menus[i];
	if (m.parent == rootMenu.name) {
	    m.level = rootMenu.level + 1;
	    //out(debug, "child level: " + m.level);
	    setLevel(m);
	}
    }
}

//////////////////////////////////////////////////////////////
//  Timer functions

var menuTimerId = -1;
var timerLength = 150;

function setMenuTimeout(name) {
    if (name == "all") {
	menuTimerId = setTimeout('hideAll()', timerLength);
    } else {
	menuTimerId = setTimeout('hideLevelByName("' + name + '");', timerLength);
    }
}

function clearMenuTimeout() {
    if (menuTimerId != -1)
    	clearTimeout(menuTimerId);
    menuTimerId = -1;
}


//////////////////////////////////////////////////////////////
// Show/Hide 

var HIDE = 0;
var SHOW = 1;

var menuWidth = 150;
var menuOverlap = 20;

/* First-level dropdown menu */
function showMenu(name, event) {
    clearMenuTimeout()
    menu = getMenu(name);

    if (menu.y == 0)
	menu.y = (document.all)
		? document.all.headerTable.clientHeight - 15
		: 95;
    if (menu.x == 0)
	menu.x = (document.all)
		? event.srcElement.parentElement.parentElement.offsetLeft - 21
		: event.pageX;

    hideLevel(menu);
    doShowMenu(menu, menu.x, menu.y);
}


/* Submenus from first-level dropdown */
function showSubMenu(name, event) {
    clearMenuTimeout()

    menu = getMenu(name);

    if (menu.parent != null) {
	parentMenu = getMenu(menu.parent);
	if (menu.y == 0)
	    menu.y = (document.all)? event.clientY : event.pageY;
	if (menu.x == 0)
	    menu.x = parentMenu.x + 130 - menuOverlap;
    }

    hideLevelChildren(menu);
    doShowMenu(menu, menu.x, menu.y);
}

//========  Show

function doShowMenu(menu, pX, pY) {
    var name = menu.name;
    var zval = menu.level + 1;

    if (document.all) {
	document.all[name].style.visibility = "visible";
	document.all[name].style.left = pX;
	document.all[name].style.top = pY;
	document.all[name].style.zIndex = zval;
    } else {
	document.getElementById(name).style.visibility = "visible";
	document.getElementById(name).style.left = pX;
	document.getElementById(name).style.top = pY;
	document.getElementById(name).style.zIndex = zval;
    }
    menu.status = SHOW;
}

//========  Hide
function hideLevelByName(name) {
    var menu = getMenu(name);
    hideLevel(menu);
}

function hideLevel(menu) {
//out(debug, "called hide level on " + menu.name + " and level is " + menu.level);
    if (menus.length == 0)
	return;

    // hide all the menus at the same level as the menu passed in
    for (var i=0; i < menus.length; i++) {
	m = menus[i];
	if (m.level == menu.level && m.status == SHOW) {
	//if (m.level == menu.level) {
	    hideMenu(m.name);
	    m.status = HIDE;
	    // and hide their children
	    hideChildren(m.name);
	}
    }
}

// hide all the child menus below this level
function hideLevelChildren(menu) {
    if (menus.length == 0)
	return;
    for (var i=0; i < menus.length; i++) {
	m = menus[i];
	if (m.level > menu.level && m.status == SHOW) {
	    hideMenu(m.name);
	    m.status = HIDE;
	}
    }
}

function hideAll() {
    if (menus.length == 0)
	return;

    for (var i=0; i < menus.length; i++) {
	m = menus[i];
	if (m.status == SHOW) {
	    hideMenu(m.name);
	    m.status = HIDE;
	}
    }
}


/* loop through and hide all the children of a menu */
function hideChildren(name) {
    if (menus.length == 0)
	return;

    for (var i=0; i < menus.length; i++) {
	m = menus[i];
	if (m.parent == name && m.status == SHOW) {
	    hideMenu(m.name);
	    m.status == HIDE;
	    hideChildren(m.name);
	}
    }
}


function hideMenu(name) {
    clearMenuTimeout()
    if (document.all)
	document.all[name].style.visibility = "hidden"
    else
	document.getElementById(name).style.visibility = "hidden";
}

//////////////////////////////////////////////////////////////
// Util Functions

/* returns a menuItem object from the menus array */
function getMenu(name) {
    for (var i=0; i < menus.length; i++) {
	m = menus[i];
	if (m.name == name)
	    return m;
    }
    return null;
}

//////////////////////////////////////////////////////////////
// 

function mlo(div) {
    div.style.backgroundColor = menuNormalColor;
}

function mhi(div) {
    div.style.backgroundColor = menuHiliteColor;
}



//////////////////////////////////////////////////////////////
// 

//==== Rollovers
imgList = new Array();

function addImg(name, sourceOff, sourceOn){
  var img = new Object();
  if(document.images){
    img.on = new Image()
    img.on.src = sourceOn
    img.off = new Image()
    img.off.src = sourceOff
    imgList[name] = img;
    return img;
 }
}

//This function swaps in the "on" image. It should be called in an onMouseover event handler
function imgOn(imgName){
  if(document.images){
    document[imgName].src = imgList[imgName].on.src;
  }
}

// This function swaps in the "off" image. It should be called in an onMouseout event handler
function imgOff(imgName){
  if(document.images){
    document[imgName].src = imgList[imgName].off.src;
  }
}
