Problem: Javascript cascading menu is being shown behind flash object when using layer tags. Without the flash object and picture imbedded in background cascading menu is displayed properly.
We have tried the zindex but it is not working properly.
Here is the code:
<!-- CASCADING MENU FOR TOP NAV.-->
<SCRIPT LANGUAGE="JavaScript">
<!-- Original: Angus Turnbull -->
<!-- Web Site:
http://gusnz.cjb.net -->
<!-- This script and many more are available free online at -->
<!-- The JavaScript Source!!
http://javascript.internet.com -->
<!-- Begin
var isDOM = (document.getElementById ? true : false);
var isIE4 = ((document.all && !isDOM) ? true : false);
var isNS4 = (document.layers ? true : false);
function getRef(id) {
if (isDOM) return document.getElementById(id
);
if (isIE4) return document.all[id];
if (isNS4) return document.layers[id];
}
function getSty(id) {
return (isNS4 ? getRef(id) : getRef(id).style);
}
// Hide timeout.
var popTimer = 0;
// Array showing highlighted menu items.
var litNow = new Array();
function popOver(menuNum, itemNum) {
clearTimeout(popTimer);
hideAllBut(menuNum);
litNow = getTree(menuNum, itemNum);
changeCol(litNow, true);
targetNum = menu[menuNum][itemNum].tar
get;
if (targetNum > 0) {
thisX = parseInt(menu[menuNum][0].
ref.left) + parseInt(menu[menuNum][ite
mNum].ref.
left);
thisY = parseInt(menu[menuNum][0].
ref.top) + parseInt(menu[menuNum][ite
mNum].ref.
top);
with (menu[targetNum][0].ref) {
left = parseInt(thisX + menu[targetNum][0].x);
top = parseInt(thisY + menu[targetNum][0].y);
visibility = 'visible';
}
}
}
function popOut(menuNum, itemNum) {
if ((menuNum == 0) && !menu[menuNum][itemNum].ta
rget)
hideAllBut(0)
else
popTimer = setTimeout('hideAllBut(0)'
, 500);
}
function getTree(menuNum, itemNum) {
// Array index is the menu number. The contents are null (if that menu is not a parent)
// or the item number in that menu that is an ancestor (to light it up).
itemArray = new Array(menu.length);
while(1) {
itemArray[menuNum] = itemNum;
// If we've reached the top of the hierarchy, return.
if (menuNum == 0) return itemArray;
itemNum = menu[menuNum][0].parentIte
m;
menuNum = menu[menuNum][0].parentMen
u;
}
}
// Pass an array and a boolean to specify colour change, true = over colour.
function changeCol(changeArray, isOver) {
for (menuCount = 0; menuCount < changeArray.length; menuCount++) {
if (changeArray[menuCount]) {
newCol = isOver ? menu[menuCount][0].overCol
: menu[menuCount][0].backCol
;
// Change the colours of the div/layer background.
with (menu[menuCount][changeArr
ay[menuCou
nt]].ref) {
if (isNS4) bgColor = newCol;
else backgroundColor = newCol;
}
}
}
}
function hideAllBut(menuNum) {
var keepMenus = getTree(menuNum, 1);
for (count = 0; count < menu.length; count++)
if (!keepMenus[count])
menu[count][0].ref.visibil
ity = 'hidden';
changeCol(litNow, false);
}
// *** MENU CONSTRUCTION FUNCTIONS ***
function Menu(isVert, popInd, x, y, width, overCol, backCol, borderClass, textClass) {
// True or false - a vertical menu?
this.isVert = isVert;
// The popout indicator used (if any) for this menu.
this.popInd = popInd
// Position and size settings.
this.x = x;
this.y = y;
this.width = width;
// Colours of menu and items.
this.overCol = overCol;
this.backCol = backCol;
// The stylesheet class used for item borders and the text within items.
this.borderClass = borderClass;
this.textClass = textClass;
// Parent menu and item numbers, indexed later.
this.parentMenu = null;
this.parentItem = null;
// Reference to the object's style properties (set later).
this.ref = null;
}
function Item(text, href, frame, length, spacing, target) {
this.text = text;
this.href = href;
this.frame = frame;
this.length = length;
this.spacing = spacing;
this.target = target;
// Reference to the object's style properties (set later).
this.ref = null;
}
function writeMenus() {
if (!isDOM && !isIE4 && !isNS4) return;
for (currMenu = 0; currMenu < menu.length; currMenu++) with (menu[currMenu][0]) {
// Variable for holding HTML for items and positions of next item.
var str = '', itemX = 0, itemY = 0;
// Remember, items start from 1 in the array (0 is menu object itself, above).
// Also use properties of each item nested in the other with() for construction.
for (currItem = 1; currItem < menu[currMenu].length; currItem++) with (menu[currMenu][currItem])
{
var itemID = 'menu' + currMenu + 'item' + currItem;
// The width and height of the menu item - dependent on orientation!
var w = (isVert ? width : length);
var h = (isVert ? length : width);
// Create a div or layer text string with appropriate styles/properties.
// Thanks to Paul Maden (
www.paulmaden.com) for helping debug this in IE4, apparently
// the width must be a miniumum of 3 for it to work in that browser.
if (isDOM || isIE4) {
str += '<layer name="uplayer" onMouseOver="moveAbove(hab
ib)"><div id="' + itemID + '" style="position: absolute; left: ' + itemX + '; top: ' + itemY + '; width: ' + w + '; height: ' + h + '; z-index:100; visibility="inherit" ';
if (backCol) str += 'background: ' + backCol + '; ';
str += '" ';
}
if (isNS4) {
str += '<layer id="' + itemID + '" left="' + itemX + '" top="' + itemY + '" width="' + w + '" height="' + h + '" visibility="inherit" ';
if (backCol) str += 'bgcolor="' + backCol + '" ';
}
if (borderClass) str += 'class="' + borderClass + '" ';
// Add mouseover handlers and finish div/layer.
str += 'onMouseOver="popOver(' + currMenu + ',' + currItem + ')" onMouseOut="popOut(' + currMenu + ',' + currItem + ')" >';
// Add contents of item (default: table with link inside).
// In IE/NS6+, add padding if there's a border to emulate NS4's layer padding.
// If a target frame is specified, also add that to the <a> tag.
str += '<table width="' + (w - 8) + '" border="0" cellspacing="0" cellpadding="' + (!isNS4 && borderClass ? 3 : 0) + '"><tr><td align="left" height="' + (h - 7) + '">' + '<a class="' + textClass + '" href="' + href + '"' + (frame ? ' target="' + frame + '">' : '>') + text + '</a></td>';
if (target > 0) {
// Set target's parents to this menu item.
menu[target][0].parentMenu
= currMenu;
menu[target][0].parentItem
= currItem;
// Add a popout indicator.
if (popInd) str += '<td class="' + textClass + '" align="right">' + popInd + '</td>';
}
str += '</tr></table>' + (isNS4 ? '</layer>' : '</div></layer>');
if (isVert) itemY += length + spacing;
else itemX += length + spacing;
}
if (isDOM) {
var newDiv = document.createElement('di
v');
document.getElementsByTagN
ame('body'
).item(0).
appendChil
d(newDiv);
newDiv.innerHTML = str;
ref = newDiv.style;
ref.position = 'absolute';
ref.visibility = 'hidden';
}
// Insert a div tag to the end of the BODY with menu HTML in place for IE4.
if (isIE4) {
document.body.insertAdjace
ntHTML('be
foreEnd', '<div id="menu' + currMenu + 'div" ' + 'style="position: absolute; visibility: hidden">' + str + '</div>');
ref = getSty('menu' + currMenu + 'div');
}
// In NS4, create a reference to a new layer and write the items to it.
if (isNS4) {
ref = new Layer(0);
ref.document.write(str);
ref.document.close();
}
for (currItem = 1; currItem < menu[currMenu].length; currItem++) {
itemName = 'menu' + currMenu + 'item' + currItem;
if (isDOM || isIE4) menu[currMenu][currItem].r
ef = getSty(itemName);
if (isNS4) menu[currMenu][currItem].r
ef = ref.document[itemName];
}
}
with(menu[0][0]) {
ref.left = x;
ref.top = y;
ref.visibility = 'visible';
}
}
// Syntaxes: *** START EDITING HERE, READ THIS SECTION CAREFULLY! ***
//
// menu[menuNumber][0] = new Menu(Vertical menu? (true/false), 'popout indicator', left, top,
// width, 'mouseover colour', 'background colour', 'border stylesheet', 'text stylesheet');
//
// Left and Top are measured on-the-fly relative to the top-left corner of its trigger, or
// for the root menu, the top-left corner of the page.
//
// menu[menuNumber][itemNumbe
r] = new Item('Text', 'URL', 'target frame', length of menu item,
// additional spacing to next menu item, number of target menu to popout);
//
// If no target menu (popout) is desired, set it to 0. Likewise, if your site does not use
// frames, pass an empty string as a frame target.
//
// Something that needs explaining - the Vertical Menu setup. You can see most menus below
// are 'true', that is they are vertical, except for the first root menu. The 'length' and
// 'width' of an item depends on its orientation -- length is how long the item runs for in
// the direction of the menu, and width is the lateral dimension of the menu. Just look at
// the examples and tweak the numbers, they'll make sense eventually :).
var menu = new Array();
// Default colours passed to most menu constructors (just passed to functions, not
// a global variable - makes things easier to change later in bulk).
var defOver = '#FF0000', defBack = '#CC0000';
// Default 'length' of menu items - item height if menu is vertical, width if horizontal.
var defLength = 20;
// Menu 0 is the special, 'root' menu from which everything else arises.
menu[0] = new Array();
// A non-vertical menu with a few different colours and no popout indicator, as an example.
// *** MOVE ROOT MENU AROUND HERE *** it's positioned at (10, 80) and is 20px high now.
menu[0][0] = new Menu(false, '', 10, 80, 20, '#CC0000', '#FF0000', '', 'itemText');
// Notice how the targets are all set to nonzero values...
menu[0][1] = new Item('<img src="images/1_rollover_a.g
if" alt="About Us" width="65" height="20" border="0">', 'about.html', '', 65, 10, 1);
menu[0][2] = new Item('<img src="images/2_rollover_a.g
if" alt="Summer Institute" width="115" height="20" border="0">', 'summer_2003.html', '', 115, 10, 2);
menu[0][3] = new Item('<img src="images/3_rollover_a.g
if" alt="Early College/High School" width="45" height="20" border="0">', 'echs.html', '', 45, 10, 3);
menu[0][4] = new Item('<img src="images/4_rollover_a.g
if" alt="Empowering Parents Program" width="40" height="20" border="0">', 'ep2.html', '', 40, 10, 4);
menu[0][5] = new Item('<img src="images/5_rollover_a.g
if" alt="Programs" width="65" height="20" border="0">', 'programs.html', '', 65, 10, 5);
menu[0][6] = new Item('<img src="images/6_rollover_a.g
if" alt="News" width="40" height="20" border="0">', 'news.html', '', 40, 10, 6);
menu[0][7] = new Item('<img src="images/7_rollover_a.g
if" alt="Professional Development" width="165" height="20" border="0">', 'development.html', '', 165, 10, 7);
menu[0][8] = new Item('<img src="images/8_rollover_a.g
if" alt="Scholars" width="60" height="20" border="0">', 'scholars.html', '', 60, 10, 8);
menu[0][9] = new Item('<img src="images/9_rollover_a.g
if" alt="Calendar" width="70" height="20" border="0">', 'calendar.html', '', 70, 10, 9);
// About Us menu.
menu[1] = new Array();
// The File menu is positioned 0px across and 20 down from its trigger, and is 120 wide.
menu[1][0] = new Menu(true, '>', 0, 20, 120, defOver, defBack, 'itemBorder', 'itemText');
menu[1][1] = new Item('Executive Welcome', '#', '', defLength, 0, 0);
menu[1][2] = new Item('Overview', '#', '', defLength, 0, 0);
menu[1][3] = new Item('SECME Model', '#', '', defLength, 0, 0);
menu[1][4] = new Item('Partners', '#', '', defLength, 0, 0);
// Summer Institute menu.
menu[2] = new Array();
menu[2][0] = new Menu(true, '>', 5, 20, 155, defOver, defBack, 'itemBorder', 'itemText');
menu[2][1] = new Item('2004 Summer Institute', '2_2004', '', defLength, 0, 0);
menu[2][2] = new Item('2004 Online Registration', '2_registration.html', '', defLength, 0, 0);
menu[2][3] = new Item('2003 Summer Institute', '2_2003.html', '', defLength, 0, 0);
menu[2][4] = new Item('Speakers Bureau', '2_bureau.html', '', defLength, 0, 0);
menu[2][5] = new Item('Events', '2_events.html', '', defLength, 0, 0);
menu[2][6] = new Item('Video', '2_video.html', '', defLength, 0, 0);
// ECHS menu
menu[3] = new Array();
menu[3][0] = new Menu(true, '>', 5, 20, 155, defOver, defBack, 'itemBorder', 'itemText');
menu[3][1] = new Item('Background', '#', '', defLength, 0, 0);
menu[3][2] = new Item('Program Information', '#', '', defLength, 0, 0);
menu[3][3] = new Item('SECME ECHS Sites', '#', '', defLength, 0, 0);
menu[3][4] = new Item('Community Engagement', '#', '', defLength, 0, 0);
menu[3][5] = new Item('ECHS Staff', '#', '', defLength, 0, 0);
menu[3][6] = new Item('Partners', '#', '', defLength, 0, 0);
menu[3][7] = new Item('Photo Gallery', '#', '', defLength, 0, 0);
// EP2 menu
menu[4] = new Array();
menu[4][0] = new Menu(true, '>', 5, 20, 110, defOver, defBack, 'itemBorder', 'itemText');
menu[4][1] = new Item('About (EP)2', '#', '', defLength, 0, 0);
menu[4][2] = new Item('Summer Institute', '#', '', defLength, 0, 0);
menu[4][3] = new Item('Workshops', '#', '', defLength, 0, 0);
menu[4][4] = new Item('Parent Resources', '#', '', defLength, 0, 0);
menu[4][5] = new Item('(EP)2 Network', '#', '', defLength, 0, 0);
menu[4][6] = new Item('ECHS', '#', '', defLength, 0, 0);
menu[4][7] = new Item('Tip of the Month', '#', '', defLength, 0, 0);
// Programs menu
menu[5] = new Array();
menu[5][0] = new Menu(true, '>', 5, 20, 80, defOver, defBack, 'itemBorder', 'itemText');
menu[5][1] = new Item('ECHS', '#', '', defLength, 0, 0);
menu[5][2] = new Item('(EP)2', '#', '', defLength, 0, 0);
menu[5][3] = new Item('ICEMS', '#', '', defLength, 0, 0);
menu[5][4] = new Item('Jump Start', '#', '', defLength, 0, 0);
menu[5][5] = new Item('SEMAA', '#', '', defLength, 0, 0);
menu[5][6] = new Item('Team Girls', '#', '', defLength, 0, 0);
// News menu
menu[6] = new Array();
menu[6][0] = new Menu(true, '>', 5, 20, 80, defOver, defBack, 'itemBorder', 'itemText');
// Professional Development menu
menu[7] = new Array();
menu[7][0] = new Menu(true, '>', 5, 20, 155, defOver, defBack, 'itemBorder', 'itemText');
menu[7][1] = new Item('Summer Institute', '#', '', defLength, 0, 0);
menu[7][2] = new Item('Regional Institutes', '#', '', defLength, 0, 0);
menu[7][3] = new Item('Workshops', '#', '', defLength, 0, 0);
menu[7][4] = new Item('Leadership Development', '#', '', defLength, 0, 0);
menu[7][5] = new Item('Service Matrix', '#', '', defLength, 0, 0);
// Scholars menu
menu[8] = new Array();
menu[8][0] = new Menu(true, '>', 5, 20, 80, defOver, defBack, 'itemBorder', 'itemText');
// Calendar menu
menu[9] = new Array();
menu[9][0] = new Menu(true, '>', 5, 20, 80, defOver, defBack, 'itemBorder', 'itemText');
// *** OPTIONAL CODE FROM HERE DOWN ***
// These two lines handle the window resize bug in NS4. See <body onResize="...">.
// I recommend you leave this here as otherwise when you resize NS4's width menus are hidden.
var popOldWidth = window.innerWidth;
nsResizeHandler = new Function('if (popOldWidth != window.innerWidth) location.reload()');
// This is a quick snippet that captures all clicks on the document and hides the menus
// every time you click. Use if you want.
if (isNS4) document.captureEvents(Eve
nt.CLICK);
document.onclick = clickHandle;
function clickHandle(evt)
{
if (isNS4) document.routeEvent(evt);
hideAllBut(0);
}
// This is just the moving command for the example.
function moveRoot()
{
with(menu[0][0].ref) left = ((parseInt(left) < 100) ? 100 : 5);
}
// End -->
</script>
<!-- STYLE SHEET SECTION -->
<style>
<!--
.itemBorder { border: 1px solid black }
.itemText { text-decoration: none; color: #FFFFFF; font: 12px Arial, Helvetica }
-->
</style>
</head>
<BODY background="images/backgro
und_main.g
if" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" style="margin: 0" onLoad="writeMenus()" onResize="if (isNS4) nsResizeHandler()">
<layer name="habib" above="uplayer">
<div id="Layer1" style="position:absolute; left:10px; top:100px; width:750px; height:125px;" >
<object classid="clsid:D27CDB6E-AE
6D-11cf-96
B8-4445535
40000" codebase="
http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="750" height="125">
<param name="_cx" value="19844">
<param name="_cy" value="3307">
<param name="FlashVars" value>
<param name="Movie" value="masthead.swf">
<param name="Src" value="masthead.swf">
<param name="WMode" value="Window">
<param name="Play" value="0">
<param name="Loop" value="-1">
<param name="Quality" value="High">
<param name="SAlign" value>
<param name="Menu" value="-1">
<param name="Base" value>
<param name="AllowScriptAccess" value="always">
<param name="Scale" value="ShowAll">
<param name="DeviceFont" value="0">
<param name="EmbedMovie" value="0">
<param name="BGColor" value>
<param name="SWRemote" value>
<param name="MovieData" value>
<param name="SeamlessTabbing" value="1"><embed src="masthead.swf" quality="high" pluginspage="
http://www.macromedia.com/go/getflashplayer" type="application/x-shockw
ave-flash"
width="750" height="125"></object>
</div>
</layer>