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; } } } }