/* 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)
* Modified by: Neuts JL www.toolbox.free.fr
* 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();
window.onload = function()
{
loadMenus();
}
function loadMenus()
{
if (!document.getElementById)
return;
var i = 0;
var menus=null;
var count=0;
menus=document.getElementsByTagName("ul");
for (i=0;i<menus.length;i++)
{
if (menus[i].id.substr(0,8)=="menuList")
loadMenu(menus[i],count++);
}
}
function loadMenu(root,index)
{
var j, submenus, node, li, link, division;
submenus = root.getElementsByTagName("ul");
division = root.parentNode;
if (document.createElement)
{
/* Win/IE5-6 trick: makes the whole width of the submenus clickable
*/
li=null;
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 (index == 0 && li!=null)
{
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, index);
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;
}
}
}
}
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)
{
if (root.type=="square")
return false;
if (root.type=="disc")
return true;
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;
}
var idMenu = 0;
var activeMenu=null;
var activeTimerMenu=null;
function initializeSubmenu(menu, actuator, root, div)
{
var parent = menu.parentNode;
idMenu++;
parent.idMenu = "menu" + idMenu;
window[parent.idMenu] = parent;
parent.menu=menu;
parent.menuTimer=null;
parent.onmouseover = function()
{
if (activeMenu!=null)
activeMenu.style.visibility= "";
activeMenu=null;
if (activeTimerMenu!=null)
clearTimeout(activeTimerMenu);
activeTimerMenu=null;
if (this.menuTimer!=null)
clearTimeout(this.menuTimer);
div.checkMove();
this.menu.style.visibility = "visible";
}
actuator.onfocus = function()
{
div.checkMove();
menu.style.visibility = "visible";
}
parent.onmouseout = function()
{
if (navigator.appName=='Microsoft Internet Explorer' && navigator.appVersion.indexOf('MSIE 6') && !menuIsHorizontal(root))
time=500;
else
time=10; // Attendre un peu quand même
activeMenu=menu;
this.menuTimer=setTimeout('window.'+this.idMenu+'.menu.style.visibility= "";',time);
activeTimerMenu=this.menuTimer;
}
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;
}

