/* menuDropdown.js - implements a dropdown menu based on a HTML list
* Author: Dave Lindquist (http://www.gazingus.org)
* Modified by: Nicolas Lesbats (nicolas lesbats at laposte net)
* Version: 0.1b (2004-03-11)
*/

var maxWidth = 50;
/* maximum width of the submenus (in 'em' units) */

var borderBox = false;
var horizontal = new Array();
var menuTop = new Array();
var menuHeight = new Array();
var menuLeft = new Array();
var menuWidth = new Array();



function loadMenu() {
if (!document.getElementById) return;
var i = 0, j, root, submenus, node, li, link, division;
while (true) {
root = document.getElementById("menuList" + (i + 1));
if (root == null)
break;
submenus = root.getElementsByTagName("ul");
division = root.parentNode;

if (document.createElement) {
/* Win/IE5-6 trick: makes the whole width of the submenus clickable
*/
for (j = 0; j < submenus.length; j++) {
node = submenus.item(j);
if (node.className == "menu" && node.getElementsByTagName("ul").length == 0) {
li = document.createElement("li");
node.appendChild(li);
li.style.position = "absolute";
li.style.visibility = "hidden";
}
}
/* checks whether the 'width' property applies to the border box or
* the content box of an element
*/
if (i == 0) {
li.style.display = "block";
li.style.padding = "0";
li.style.width = "2px";
li.style.border = "1px solid";
if (li.offsetWidth == 2)
borderBox = true;
}
}

initializeMenu(root, division, i);

for (j = 0; j < submenus.length; j++) {
node = submenus.item(j);
if (node.className == "menu") {
link = node.previousSibling;
while (link != null) {
if (link.className == "actuator") {
initializeSubmenu(node, link, root, division);
node.set();
break;
}
link = link.previousSibling;
}
}
}
i++;
}
}

function initializeMenu(root, div, index) {

horizontal[index] = menuIsHorizontal(root);
menuTop[index] = div.offsetTop;
menuHeight[index] = div.offsetHeight;
menuLeft[index] = div.offsetLeft;
menuWidth[index] = div.offsetWidth;

div.horizontal = function() {
return horizontal[index];
}

div.checkMove = function() {
if (this.hasMoved()) this.resetMenu();
}

div.hasMoved = function() {
if (menuTop[index] == this.offsetTop &&
menuHeight[index] == this.offsetHeight &&
menuLeft[index] == this.offsetLeft &&
menuWidth[index] == this.offsetWidth)
return false;
return true;
}

div.resetMenu = function() {
horizontal[index] = menuIsHorizontal(root);
menuTop[index] = this.offsetTop;
menuHeight[index] = this.offsetHeight;
menuLeft[index] = this.offsetLeft;
menuWidth[index] = this.offsetWidth;

var submenus = root.getElementsByTagName("ul");
for (var j = 0; j < submenus.length; j++) {
var node = submenus.item(j);
if (node.className == "menu") {
node.style.right = "";
node.style.left = "";
if (!window.opera)
node.style.width = "";
node.set();
}
}
}
}

function menuIsHorizontal(root) {
var first = firstElement(root, "LI");
if (first != null) {
var second = first.nextSibling;
while (second != null) {
if (second.tagName == "LI") {
first = firstElement(first, "A");
second = firstElement(second, "A");
if (first != null && second != null)
if (first.offsetLeft == second.offsetLeft)
return false;
return true;
}
second = second.nextSibling;
}
}
return true;
}

function initializeSubmenu(menu, actuator, root, div) {

var parent = menu.parentNode;

parent.onmouseover = function() {
div.checkMove();
menu.style.visibility = "visible";
}

actuator.onfocus = function() {
div.checkMove();
menu.style.visibility = "visible";
}

parent.onmouseout = function() {
menu.style.visibility = "";
}

var tags = menu.getElementsByTagName("a");
var link = tags.item(tags.length - 1);
if (!link.onblur)
link.onblur = function() {
var node = link.parentNode.parentNode;
while (node != menu) {
node.style.visibility = "";
node = node.parentNode.parentNode;
}
menu.style.visibility = "";
}

if (parent.parentNode == root) {
menu.set = function() {
setLocation1(this, actuator, root, div);
}
} else {
menu.set = function() {
setLocation2(this, actuator, div);
}
}
}

function setLocation1(menu, actuator, root, div) {
var first = firstElement(menu, "LI");
if (first != null)
if (first.offsetParent == menu)
setWidth(menu);
if (div.horizontal()) {
if (actuator.offsetParent == menu.offsetParent) {
menu.style.left = actuator.offsetLeft + "px";
menu.style.top = actuator.offsetTop + actuator.offsetHeight + "px";
} else {
/* happens in Win/IE5-6 when some ancestors are 'static' and have their
* 'width' or 'height' different than 'auto' */
var parent = actuator.offsetParent;
var top = 0;
var left = 0;
while (parent != menu.offsetParent && parent != null) {
top = top + parent.offsetTop;
left = left + parent.offsetLeft;
parent = parent.offsetParent;
}
menu.style.left = left + actuator.offsetLeft + "px";
menu.style.top = top + actuator.offsetTop + actuator.offsetHeight + "px";
}
} else {
menu.style.top = actuator.offsetTop + "px";
menu.style.left = (div.offsetWidth + actuator.offsetWidth) / 2 + "px";
}
}

function setLocation2(menu, actuator, div) {
if (menu.offsetParent != document.body)
setWidth(menu);
menu.style.top = actuator.offsetTop + "px";
menu.style.left = actuator.offsetWidth + "px";
}

function setWidth(menu) {
menu.style.right = - maxWidth + "em";
var width = 0;
var height = 0;
var items = menu.getElementsByTagName("a");
for (var i = 0; i < items.length; i++) {
var link = items.item(i);
if (link.parentNode.parentNode == menu) {
height = height + link.offsetHeight;
if (link.offsetWidth > width)
width = link.offsetWidth;
}
}
if (borderBox)
width = width + (menu.offsetHeight - height);
menu.style.width = width + "px";
}

function firstElement(node, name) {
var first = node.firstChild;
while (first != null) {
if (first.tagName == name)
return first;
first = first.nextSibling;
}
return null;
}
