function jsioMenu(element,positionAnchor)
{
/*
Based on a slightly mutated version of Dave Lindquist's
dropdown menu (see below). Authored by Simon Greaves 2005
menuDropdown.js - implements a dropdown menu based on a HTML list
Author: Dave Lindquist (http://www.gazingus.org)
*/
/*
The javascript behaviour is structurally coupled to the schema below.
Break the structure and you will break the behaviour.
*/
var currentMenu = null;
//default the positionAnchor if not passed in constructor
if (!positionAnchor)
{
//positionAnchor = element.parentElement;
positionAnchor = element.parentNode;
}
this.init = function ()
{
element.onclick = menuOnClick;
element.onmouseover = menuOnMouseOver;
element.onkeydown = menuOnKeyDown;
//find all the actuators and init onblur event handling
//it doesn't seem to work on top level element
/*
var selectedNodes = getElementsByFilter(element, function(n) {
return (n.className && n.className.toUpperCase() == "MENUBAR");});
for (var i = 0; i < selectedNodes.length ;i++)
{
selectedNodes[i].onblur = menuOnBlur;
}
*/
//bodge
document.body.onclick = menuOnBlur;
}
function menuOnClick(evt)
{
var objUnknown;
evt = (evt) ? evt : ((window.event) ? window.event : null);
objUnknown = (evt) ? ((evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null)) : null;
//if its an actuator with no menu attached then return with true
//to allow any default action to take place
if (objUnknown && objUnknown.tagName.toUpperCase() == "A" && objUnknown.className && objUnknown.className.toUpperCase() == "ACTUATOR")
{
//check for a menu to show
var aMenu = getChildElements(objUnknown.parentNode,"UL")[0]
if (!aMenu)
{
return true;
}
if (window.event){
evt.cancelBubble = true;
evt.returnValue = false;
}
else
{
evt.stopPropagation();
evt.preventDefault();
}
onActuatorClicked(objUnknown);
}
else
{
return true;
}
objUnknown = null;
evt = null;
}
function onActuatorClicked(objUnknown)
{
if (currentMenu == null) {
showMenu(objUnknown);
}
else {
currentMenu.style.visibility = "hidden";
currentMenu = null;
}
return false;
}
function menuOnMouseOver(evt)
{
var objUnknown;
evt = (evt) ? evt : ((window.event) ? window.event : null);
objUnknown = (evt) ? ((evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null)) : null;
if (objUnknown.tagName.toUpperCase()!= "A") {return;}
if ((objUnknown.className.toUpperCase()) == "ACTUATOR")
{
if (currentMenu) {
currentMenu.style.visibility = "hidden";
showMenu(objUnknown);
}
}
objUnknown = null;
}
function menuOnBlur(evt)
{
if (currentMenu) {
currentMenu.style.visibility = "hidden";
currentMenu = null;
}
}
function menuOnKeyDown(evt)
{
var objUnknown;
evt = (evt) ? evt : ((window.event) ? window.event : null);
objUnknown = (evt) ? ((evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null)) : null;
//ignore the tab key
if (evt.keyCode == 9) {return;}
//ignore the tab key
if (evt.keyCode == 13) {return;}
if (window.event){
evt.cancelBubble = true;
evt.returnValue = false;
} else {
evt.stopPropagation();
evt.preventDefault();
}
/*
if (!objLI_Current)
{
var defaultLIText = getDefaultLIText();
if (defaultLIText != "") {
me.setSelectedItem(defaultLIText);
} else {
return;
}
}
*/
switch(evt.keyCode)
{
case 9: //tab key
if (evt.shiftKey)
{
// movePrevious();
}
else
{
// moveNext();
}
break;
case 13: //enter key
//coolTreeOnClick();
break;
case 37: //left arrow key
//moveLeft();
break;
case 38: //up arrow key
//moveUp();
break;
case 39: //right arrow key
//moveRight();
break;
case 40: //down arrow key
//moveDown();
break;
case 188: //"<" key
//movePrevious();
break;
case 190: //">" key
//moveNext();
break;
}
evt = null;
}
function showMenu(objUnknown) {
var menu;
if(objUnknown && (objUnknown.className.toUpperCase()) == "ACTUATOR")
{
var menuNodes = getChildElements(objUnknown.parentNode,"UL");
if (menuNodes.length == 1){
menu = menuNodes[0];
menu.style.left = objUnknown.offsetLeft + 1 + "px";
//if ie
if (menu.parentElement)
{
var offsetTopTotal;
var newObj;
newObj = objUnknown;
offsetTopTotal = positionAnchor.offsetTop;
while (newObj != positionAnchor)
{
offsetTopTotal += newObj.offsetTop;
//newObj = newObj.parentElement;
newObj = newObj.parentNode;
}
menu.style.top = (offsetTopTotal + objUnknown.offsetHeight) + "px";
menu.style.filter="blendTrans(duration=0.2) progid:DXImageTransform.Microsoft.Shadow(color='#777777', Direction=135, Strength=4) alpha(Opacity=90)";
menu.filters.blendTrans.apply();
}
else
{
menu.style.top = objUnknown.offsetTop + objUnknown.offsetHeight + "px";
}
menu.style.visibility = "visible";
//skip if not ie
if (menu.style.filter)
{
menu.filters.blendTrans.play();
}
currentMenu = menu;
}
}
}
}