Here is the source code for the navigation menu. The code relies on a portion
of the pathname to identify the appropriate menu. This works for a small site
such as this but would be replaced with a more structure scheme in a more
complex environment. Timers are used to attempt "intelligent" decision-making about when to
activate the menus.
The source presented here is modified slightly from the actual code both
for content and formatting in this window.
// version 2001110600 change menu name stub code - uses pathname instead
// of hostname et al in order to get around various
// implementations showing or not showing port port
// numbers when and when not port=80
// add delay of menu display - nowshow() called from showmenu
// mydiv and obj now GLOBAL for nowshow() from showmenu()
// protect hidemenus() if currmenu is NOT set (i.e. mouseout
// before it ever gets set)
var rootdir = "d.holmes/"; // top level of URL - used to trim pathname
// to get menu name stub in whatmenu()
// NOTE that using pathname instead of hostname
// etc. gets around the various interpretations
// of whether port appears in host and/or is
// ever null etc.
// NOTE2 that MSIE drops leading / while NS does not
var showdelay = 70; // delay to ignore transients (mouseover-mouseout)
var hidedelay = 1500; // delay until hide after mouseout
var timeout = 7000; // timeout if no activity after initial top link
// mouseover
var mx = -1; // set for each menu
var my = -1; // set once by first menu called
var menuholdID // timer until menu re-hidden
var currmenu = "x"; // currently displayed menu; "x" => none visible
var mydiv
// used for initial test IE vs NS
// additional tests check specific functionality
var whoami = navigator.userAgent + '';
var obj;
function hold() {
clearTimeout(menuholdID);
}
function drop() {
clearTimeout(menuholdID);
menuholdID = setTimeout("hidemenus()", hidedelay);
}
function hidemenus() {
clearTimeout(menuholdID);
if (currmenu != "x") {
if (!document.all && document.getElementById) { // NS6
myobj = "div" + currmenu;
obj = document.getElementById(myobj);
obj.style.visibility = "hidden";
} else if (whoami.indexOf('MSIE')==-1) {
obj = eval("document.div"+currmenu); // current drop menu
obj.visibility = 'hidden';
} else {
obj = eval("document.all.div"+currmenu+".style");
obj.visibility = 'hidden';
}
currmenu = "x"; // mark currmenu as "all hidden"
}
}
function showmenu(event,mythis) {
clearTimeout(menuholdID);
var a = mythis.pathname.indexOf(rootdir) + rootdir.length;
var b = a + 4; // right index for substring cut
mydiv = mythis.pathname.substring(a,b);
// just the path with or without leading '/'
// used to id the menu DIVs (home is
// special-cased) for example: home phot
// port art2 hard
if (mydiv == "") { mydiv = "home"; }
if(isNaN(mx))
{
mx = -1;
my = -1;
}
if (mydiv != currmenu) {
if (!document.all && document.getElementById) { // NS6
mx = event.pageX - 20;
mx = ((mx < 10) ? 10 : mx);
if (my == -1) { // once "my" is set use it for both
my = ((event.pageY < 20) ? 20 : event.pageY);
}
myobj = "div" + mydiv;
obj = document.getElementById(myobj);
obj.style.left = mx;
obj.style.top = my + 10 ;
menuholdID = setTimeout("nowshow()", showdelay);
} else if (whoami.indexOf('MSIE')==-1) {
mx = event.pageX - 20;
mx = ((mx < 10) ? 10 : mx);
if (my == -1) { // once "my" is set use it for both
my = ((event.pageY < 20) ? 20 : event.pageY);
}
obj = eval("document.div"+mydiv);
obj.pageX = mx;
obj.pageY = my + 10 ;
menuholdID = setTimeout("nowshow()", showdelay);
} else {
mx = window.event.clientX - 20;
mx = ((mx < 10) ? 10 : mx);
if (my == -1) { // once "my" is set use it for both
my = ((window.event.clientY < 20) ? 20 : window.event.clientY);
}
obj = eval("document.all.div"+mydiv+".style");
obj.pixelLeft = mx;
obj.pixelTop = my + 10 ;
menuholdID = setTimeout("nowshow()", showdelay);
} // NS or IE
} // mydiv != currmenu
} // showmenu
function nowshow() {
clearTimeout(menuholdID);
if (!document.all && document.getElementById) { // NS6
obj.style.visibility = 'visible';
} else {
obj.visibility = 'visible';
}
if (currmenu != "x") {
if (!document.all && document.getElementById) { // NS6
myobj = "div" + currmenu
obj = document.getElementById(myobj);
obj.style.visibility = 'hidden';
} else if (whoami.indexOf('MSIE')==-1) {
obj.visibility = 'visible';
obj = eval("document.div"+currmenu);
obj.visibility = 'hidden';
} else {
obj.visibility = 'visible';
obj = eval("document.all.div"+currmenu+".style");
obj.visibility = 'hidden';
}
}
currmenu = mydiv;
// default timeout on drop menus if there's no movement/change
menuholdID = setTimeout("hidemenus()", timeout);
}
function makeMenus() { // writes HTML for menu DIVs
// remember to update CSS as well
document.write (' <DIV id="divhome"> \
<TABLE CELLPADDING=6 class="menutbl"> \
<TR><TD> \
<A class="menulink" onMouseOver="hold();" onMouseOut="drop();" \
HREF="/one/top_one.html" TARGET="_top">top one</A><BR> \
<A class="menulink" onMouseOver="hold();" onMouseOut="drop();" \
HREF="/two/top_two.html" TARGET="_top">top two</A><BR> \
<A class="menulink" onMouseOver="hold();" onMouseOut="drop();" \
HREF="/one/top_three.html" TARGET="_top">top three</A><BR> \
</TD></TR></TABLE> \
</DIV> \
\
<DIV id="divphot"> \
<TABLE CELLPADDING=6 class="menutbl"> \
<TR><TD> \
<A class="menulink" onMouseOver="hold();" onMouseOut="drop();" \
HREF="/aaa/second_one.html" TARGET="_top">second one</A><BR> \
<A class="menulink" onMouseOver="hold();" onMouseOut="drop();" \
HREF="/bbb/second_two.html" TARGET="_top">second two</A><BR> \
</TD></TR></TABLE> \
</DIV> \
\
}