Menu and submenu
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>xmenu-xlayer</title>
<meta name="KEYWORDS" content="">
<meta name="DESCRIPTION" content="">
<style type="text/css">
<!--
body
{
background-color: #ffffff;
color: #000000;
font-size: 12px;
font-family: Arial, Helvetica;
}
p
{
color: #a1a1a1;
font-weight: bold;
}
a
{
font-family: Arial, Helvetica;
text-decoration: none
}
a:active
{
color: #a1a1a1
}
a:link
{
color: #a1a1a1
}
a:visited
{
color: #a1a1a1
}
a:hover
{
color: #cccccc;
text-decoration: none;
}
.orange
{
background-color: #ff7f00;
}
.dark_orange
{
background-color: #ff5500;
}
a.navigation_links
{
font-family: Arial, Helvetica, sans serif;
font-size:10px;
color: #fadada;
font-weight: 600;
}
a:hover.navigation_links
{
font-family: Arial, Helvetica, sans serif;
font-size:10px;
color:white;
font-weight: 600;
}
.content
{
font-family: Arial, Helvetica, sans serif;
background-color: #ffffff;
color: #000000;
font-size: 12px;
}
-->
</style>
<!-- Browser.js -->
<script language="javascript">
// created by: Andre Dietisheim (dietisheim@sphere.ch)
// created: 2001-31-12
// modified by: Andre Dietisheim (dietisheim@sphere.ch)
// modified: 2004-01-28
// version: 0.8.0
function Browser( browsers )
{
this.browsers = browsers; // browser detection array
this.createBooleans();
}
Browser.prototype.createBooleans = function()
{
var name = navigator.appName;
var cname = navigator.appCodeName;
var usragt = navigator.userAgent;
var ver = navigator.appVersion;
for ( i = 0; i < this.browsers.length; i++ )
{
var browserArray = this.browsers[ i ]; // browsers-array
var sCheck = browserArray[ 1 ]; // 'logical expr' that detects the browser
var sCurrentVersion = browserArray[ 2 ]; // 'regexp' that gets current version
var sBrand = browserArray[ 0 ]; // browser-obj 'property' (is.xx)
var availableVersions = browserArray[ 3 ]; // 'versions' to check for
if ( eval( sCheck ) )
{ // browser recognized
eval( "this." + sBrand + " = true" ); // browser-obj property (is.xx)
var regexp, ver, sMinorVersion, sMajorVersion;
regexp = new RegExp( sCurrentVersion );
regexp.exec( usragt ); // parse navigator.userAgent
var sMajorVersion = RegExp.$1;
var sMinorVersion = RegExp.$2;
for ( j = 0; j < availableVersions.length; j++ )
{
if ( parseFloat(availableVersions[ j ]) <= eval( sMajorVersion + "." + sMinorVersion ) )
{ // upper versions
eval( "this." + sBrand + availableVersions[ j ].substr( 0, 1 ) + availableVersions[ j ].substr( 2, 1 ) + "up = true" );
}
if ( parseFloat(availableVersions[ j ]) == eval( sMajorVersion + "." + sMinorVersion ) )
{ /// current version
eval( "this." + sBrand + availableVersions[ j ].substr( 0, 1 ) + availableVersions[ j ].substr( 2, 1 ) + "= true" );
}
}
}
}
}
is = new Browser (
[
// Internet Explorer Windows ---
[ "iewin",
"cname.indexOf( 'Mozilla' ) >= 0 && name.indexOf( 'Microsoft Internet Explorer' ) >= 0 && usragt.indexOf( 'MSIE' ) >= 0 && usragt.indexOf( 'Opera' ) < 0 && usragt.indexOf( 'Windows' ) >= 0", // IE detection expression
"MSIE.([0-9]).([0-9])", // regexpr for version (in navigator.userAgent)
[ "5", "5.5", "6" ] ], // published versions
// Internet Explorer Macintosh ---
[ "iemac",
"cname.indexOf( 'Mozilla' ) >= 0 && name.indexOf( 'Microsoft Internet Explorer' ) >= 0 && usragt.indexOf( 'MSIE' ) >= 0 && usragt.indexOf('Opera') < 0 && usragt.indexOf('Mac') >= 0",
"MSIE.([0-9]).([0-9])",
[ "5", "5.1", "5.2" ] ],
// Gecko (Mozilla, Galeon, Firebird, Netscape >=6.x) ---
[ "gk",
"cname.indexOf( 'Mozilla' ) >= 0 && name.indexOf( 'Netscape' ) >= 0 && usragt.indexOf( 'Gecko' ) >= 0 && usragt.indexOf( 'Safari' ) < 0",
"[rv[:| ]*([0-9]).([0-9])|Galeon\/([0-9]).([0-9])]",
[ "0.7", "0.8", "0.9", "1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6" ] ],
// Netscape Navigator ---
[ "nn",
"cname.indexOf( 'Mozilla' ) >= 0 && name.indexOf( 'Netscape' ) >=0 && parseInt( ver ) <= 4",
"([0-9]).([0-9])",
[ "4", "4.5", "4.7", "4.8" ] ],
// Opera ---
[ "op",
"cname.indexOf( 'Mozilla' ) >= 0 && ( name.indexOf( 'Microsoft Internet Explorer' ) >=0 || name.indexOf( 'Opera' ) >= 0 ) && usragt.indexOf( 'Opera' ) >= 0",
"Opera.([0-9]).([0-9])",
[ "5", "5.1", "6", "7", "7.1", "7.2" ] ],
// Safari ---
[ "sf",
"cname.indexOf( 'Mozilla' ) >= 0 && name.indexOf( 'Netscape' ) >=0 && usragt.indexOf('AppleWebKit' ) >= 0 && usragt.indexOf('Safari') >= 0",
"AppleWebKit\/([0-9])",
"Konqueror\/([0-9]\.[0-9])",
[ "48", "85" ] ],
// Konqueror ---
[ "kq",
"cname.indexOf( 'Mozilla' ) >= 0 && name.indexOf( 'Konqueror' ) >= 0 && usragt.indexOf( 'Konqueror' ) >= 0",
"Konqueror\/([0-9]).([0-9]*)",
[ "2.2", "3", "3.1" ] ]
] );
</script>
<!-- XlayerParent.js -->
<script language="javascript">
// created by: Andre Dietisheim (dietisheim@sphere.ch)
// created: 2001-12-20
// modified by: Andre Dietisheim (dietisheim@sphere.ch)
// modified: 2004-02-06
// version: 1.4.0
function XlayerParent( sLayerId, sImg, sDesc, iWidth, iHeight, sContent )
{
// static var --------
if( !XlayerParent.prototype.instances ) XlayerParent.prototype.instances = new Array();
XlayerParent.prototype.instances[ XlayerParent.prototype.instances.length ] = this;
this.sId = this.create( sLayerId, sImg, sDesc, iWidth, iHeight )
}
XlayerParent.prototype.create = function( sLayerId, sImg, sDesc, iWidth, iHeight )
{
this.sParentLayerId = sLayerId;
this.sParentLayerXlayerId = sLayerId + "Xlayer"
var sLayer = "";
var content_str = '';
if ( sImg )
sContent = '<img src="' + sImg + '" width="' + iWidth + '" height="' + iHeight + '" border="0" >';
else if ( sDesc )
sContent = sDesc;
// nn4up ----------
if ( is.nn4up )
{
var sLayer = '<ilayer id="' + sLayerId + '" top=0 left=0 width=' + iWidth + ' height=' + iHeight + ' >' + ( ( sContent )? sContent : "" ) + '</ilayer>';
document.write( sLayer );
return sLayerId;
}
// iewin5up, iemac5up, gk --------
else if ( is.iewin5up || is.iemac5up || is.gk || is.sf || is.kq3up || is.op6up )
{
var sLayer = '<div id="' + sLayerId + '" style="position:relative; width: ' + iWidth + 'px; height: ' + iHeight + 'px; ">' + ( ( sContent )? sContent : "" ) + '</div>';
document.write( sLayer );
return sLayerId;
}
else
{
return null;
}
}
XlayerParent.prototype.getLayer = function( sLayerId )
{
var layer = null;
if ( sLayerId )
{ // id supplied
if ( is.iewin5up || is.iemac5up || is.gk || is.sf || is.kq3up || is.op6up )
return document.getElementById( sLayerId );
else if ( is.nn4up )
return document.layers[ sLayerId ];
}
else if ( !sLayerId )
{ // null supplied
if ( is.iewin5up || is.iemac5up || is.gk || is.sf || is.kq3up || is.op6up )
return document.body;
else if ( is.nn4up )
return window;
}
}
XlayerParent.prototype.getX = function( layer )
{
var x = 0;
if ( is.nn4up )
{
if ( layer != window )
x = layer.pageX;
}
else if ( is.gk || is.iemac5up || is.iewin5up || is.sf || is.kq3up || is.op6up )
{
if ( layer != document.body )
{
currentX = 0;
object = layer;
while ( object )
{
currentX += object.offsetLeft;
object = object.offsetParent;
}
x = currentX;
}
if ( is.iemac5up )
x += parseInt( "0" + document.body.currentStyle.marginLeft, 10 );
}
return x;
}
XlayerParent.prototype.getY = function( layer )
{
var y = 0;
if ( is.nn4up )
{
if ( layer != window ) y = layer.pageY;
}
else if ( is.gk || is.iewin || is.iemac5up || is.sf || is.kq3up || is.op6up )
{
if ( layer != document.body )
{
currentY = 0;
object = layer;
while ( object )
{
currentY += object.offsetTop;
object = object.offsetParent;
}
y = currentY;
}
if ( is.iemac5up )
y += parseInt( "0" + document.body.currentStyle.marginTop, 10 );
}
return y;
}
XlayerParent.prototype.getW = function( layer )
{
var w = 0;
if ( is.nn4up )
{
if ( layer == window )
return window.innerWidth;
else
return layer.clip.width;
}
else if ( is.gk || is.iemac5up || is.sf || is.kq3up || is.op6up )
{
if ( layer == document.body )
return window.innerWidth;
else
return layer.offsetWidth;
}
else if ( is.iewin5up )
{
if ( layer == document.body )
return document.body.clientWidth;
else
return layer.offsetWidth;
}
}
XlayerParent.prototype.getH = function( layer )
{
var h = 0;
if ( is.nn4up )
{
if ( layer == window )
return window.innerHeight;
else
return layer.clip.height;
}
else if ( is.gk || is.iemac5up || is.sf || is.kq3up || is.op6up )
{
if ( layer == document.body )
return window.innerHeight;
else
return layer.offsetHeight;
}
else if ( is.iewin5up )
{
if ( layer == document.body )
return document.body.clientHeight;
else
return layer.offsetHeight;
}
}
</script>
<!-- Xlayer.js -->
<script language="javascript">
// created by: Andre Dietisheim (dietisheim@sphere.ch)
// created: 2001-12-20
// modified by: Andre Dietisheim (dietisheim@sphere.ch)
// modified: 2004-02-21
// version: 2.5.3
function Xlayer( sParent, xlayerParent, x, y, offsetX, offsetY, w, h, iClipTop, iClipRight, iClipBottom, iClipLeft, iZindex, bVisibility, sBgcolor, fading, events, sText, bBold, sAlign, iTopTextBorder, iRightTextBorder, iBottomTextBorder, iLeftTextBorder, sFgcolor, sHref, sIcon, iIconWidth, iIconHeight, iconBorder, sFontface, iFontsize, src , sSpacer )
{
if ( !Xlayer.prototype.instances )
Xlayer.prototype.instances = new Array();
Xlayer.prototype.instances[ Xlayer.prototype.instances.length ] = this; // Store this Instance In static array
this.index = Xlayer.prototype.instances.length - 1;
this.sParent = sParent;
this.parent = null;
this.xlayerParent = xlayerParent;
this.lyr = null;
this.id = this.id || "Xlayer" + this.index;
this.x = x || 0;
this.y = y || 0;
this.offsetX = offsetX || 0;
this.offsetY = offsetY || 0;
this.w = w || 0;
this.h = h || 0;
this.iClipTop = iClipTop || 0;
this.iClipRight = iClipRight || w;
this.iClipBottom = iClipBottom || h;
this.iClipLeft = iClipLeft || 0;
this.iZindex = iZindex || 0;
this.bVisibility = bVisibility;
this.sBgcolor = sBgcolor || "black";
this.iOpacity = 0;
this.sSpacer = sSpacer;
// caption ---
this.sText = sText || null;
this.bBold = bBold || false;
this.sAlign = sAlign || "center";
this.iTopTextBorder = iTopTextBorder;
this.iRightTextBorder = iRightTextBorder;
this.iBottomTextBorder = iBottomTextBorder;
this.iLeftTextBorder = iLeftTextBorder;
this.sFgcolor = sFgcolor || "white";
this.sHref = ( is.nn4up && !sHref )? "#" : sHref; // nn4 always need a href to process clicks
this.sFontface = sFontface || "Helvetica";
this.iFontsize = iFontsize || 2;
this.sIcon = sIcon || null;
this.iIconWidth = iIconWidth || 0;
this.iIconHeight = iIconHeight || 0;
this.iconBorder = iconBorder || 0;
// iframe ----
this.iframe = null;
this.scrollbars = null;
this.src = src || null;
this.events = events || null; // array: event, func, event, func, ...
this.fading = fading || null; // array: start, stop, steps, delay
if ( is.op6up && !is.op7up ) // opera can't create dynamically
this.writeDiv();
}
Xlayer.prototype.MOUSEOVER = "onmouseover";
Xlayer.prototype.MOUSEOUT = "onmouseout";
Xlayer.prototype.CLICK = "onclick";
Xlayer.prototype.create = function()
{
this.parent = XlayerParent.prototype.getLayer( this.sParent ); // parent = another layer or document.body
this.parentCoordsOnly = XlayerParent.prototype.getLayer( this.xlayerParent.sId );
if ( is.nn4up )
{
if ( this.w == "100%" )
this.lyr = new Layer( this.parent.innerWidth, this.parent );
else
this.lyr = new Layer( this.w, this.parent );
}
else if ( is.iewin5up || is.iemac5up || is.gk || is.sf || is.kq3up || is.op7up )
{
this.lyr = document.createElement( "DIV" ); // create layer
this.lyr.style.position = "absolute";
this.lyr.style.overflow = "hidden";
this.lyr.id = this.id;
this.parent.appendChild( this.lyr ); // insert into DOM
}
else if ( is.op6up && !is.op7up )
{ // already created on instanciation (no dynamic creation possible)
this.lyr = document.getElementById( this.id );
}
this.setVisibility( this.bVisibility );
this.setSize( this.w, this.h );
this.setEvents( this.events );
if ( !( is.op6up && !is.op7up ) )
this.setBody( this.getCaption( this.sText, this.bBold, this.sIcon, this.iIconWidth, this.iIconHeight, this.iconBorder ) );
this.setBgColor( this.sBgcolor );
this.setFgColor( this.sFgcolor );
this.setPos( this.x, this.y, this.offsetX, this.offsetY );
this.setZindex( this.iZindex );
this.fade( this.fading );
}
Xlayer.prototype.writeDiv = function()
{
document.writeln( '<div id="' + this.id + '" style="position:absolute;">' + this.getCaption( this.sText, this.bBold, this.sIcon, this.iIconWidth, this.iIconHeight, this.iconBorder ) + '</div>' );
}
Xlayer.prototype.kill = function()
{
if ( is.nn4up )
{
for ( i = 0; i < document.layers.length ; i++ ) // scan trough layers-array in NN-DOM
{
this.setVisibility( false );
if ( document.layers[ i ].id == this.lyr.id )
{
index = i;
//document.layers.splice(i, 1)
//delete document.layers[i]
document.layers[ i ] = null;
break;
}
}
}
else if ( is.iewin5up || is.iemac5up || is.gk || is.sf || is.kq3up || is.op7up )
{
var lyr;
lyr = document.getElementById( this.lyr.id );
document.body.removeChild( lyr );
}
this.iOpacity = 0;
}
Xlayer.prototype.setFgColor = function( color )
{
if ( this.sText )
{
this.sFgcolor = color;
if ( is.nn4up )
this.setBody( this.getCaption( this.sText, this.bBold, this.sIcon, this.iIconWidth, this.iIconHeight, this.iconBorder ) );
else if ( is.iewin5up || is.iemac5up || is.gk || is.sf || is.kq3up || is.op6up )
{
if ( this.sText )
{
document.getElementById( this.id+"d" ).style.color = color;
//this.setCaption( this.sText, this.bBold, this.sIcon, this.iIconWidth, this.iIconHeight, this.iconBorder );
}
}
}
}
Xlayer.prototype.setBgColor = function( color )
{
this.sBgcolor = color;
if ( is.nn4up )
this.lyr.document.bgColor = color;
else if ( is.iewin5up || is.iemac5up || is.gk || is.sf || is.kq3up || is.op6up )
this.lyr.style.backgroundColor = color;
}
Xlayer.prototype.setSize = function( w, h )
{
var iOldWidth = this.w; // store old values
var iOldHeight = this.h;
this.w = w; // store new values
this.h = h;
if ( is.nn4up )
{
if ( w == "100%" )
this.lyr.resizeTo( window.innerWidth, h );
else
this.lyr.resizeTo( w, h );
}
else if ( is.iewin5up || is.iemac5up || is.gk || is.sf || is.kq3up || is.op7up )
{
if ( w == "100%" )
{
this.lyr.style.width = "100%";
this.lyr.style.height = h + 'px';
}
else
{
this.lyr.style.width = w + 'px';
this.lyr.style.height = h + 'px';
}
this.setClipping( this.iClipTop, ( this.iClipRight + w - iOldWidth ), ( this.iClipBottom + h - iOldHeight ), this.iClipLeft );
if ( is.iewin5up && this.iframe ) // recreate iframe on resize
this.setIframe( this.src );
}
else if ( is.op6up && !is.op7up )
{
if ( w == "100%" )
{
this.lyr.style.pixelWidth = "100%";
this.lyr.style.pixelHeight = h;
}
else
{
this.lyr.style.pixelWidth = w;
this.lyr.style.pixelHeight = h;
}
}
}
Xlayer.prototype.setPos = function( x, y, offsetX, offsetY )
{
var parent;
if ( this.parentCoordsOnly )
parent = this.parentCoordsOnly;
else
parent = this.parent;
// calc x, y ---
if ( x == "centered" )
x = XlayerParent.prototype.getX( parent ) + ( XlayerParent.getW( parent ) / 2 ) - this.w / 2;
else if ( x == "left" )
x = this.xlayerParent.getX( parent );
else if ( x == "right" )
x = XlayerParent.prototype.getX( parent ) + XlayerParent.prototype.getW( parent ) - this.w;
if ( y == "centered" )
y = XlayerParent.prototype.getY( parent ) + ( XlayerParent.prototype.getH( parent ) / 2 ) - this.h / 2;
else if ( y == "top" )
y = XlayerParent.prototype.getY( parent );
else if ( y == "bottom" )
y = XlayerParent.prototype.getY( parent ) + XlayerParent.prototype.getH( parent ) - this.h;
if ( offsetX )
x += offsetX;
if ( offsetY )
y += offsetY;
this.x = x;
this.y = y;
// set position ---
if ( is.nn4up )
{
this.lyr.moveTo( this.x, this.y );
}
else if ( is.iewin5up || is.iemac5up || is.gk || is.sf || is.kq3up || is.op6up )
{
this.lyr.style.top = this.y + "px";
this.lyr.style.left = this.x + "px";
}
}
Xlayer.prototype.setVisibility = function( bVisibility )
{
this.bVisibility = bVisibility;
if ( this.lyr )
{
if ( is.nn4up )
{
this.lyr.visibility = ( bVisibility )? "show" : "hide";
}
else if ( is.iewin5up || is.iemac5up || is.gk || is.sf || is.kq3up || is.op6up )
{
this.lyr.style.visibility = ( bVisibility )? "visible" : "hidden";
}
}
}
Xlayer.prototype.isVisible = function()
{
return this.bVisibility;
}
Xlayer.prototype.setFontsize = function( iFontsize )
{
this.iFontsize = iFontsize;
}
Xlayer.prototype.setFontface = function( sFontface )
{
this.sFontface = sFontface;
}
Xlayer.prototype.setClipping = function( top, right, bottom, left )
{
if ( is.iewin5up || is.iemac5up || is.gk || is.sf || is.kq3up || is.op7up )
{
this.lyr.style.clip = "rect(" + top + "px " + right + "px " + bottom + "px " + left + "px)";
}
else if ( is.nn4up )
{
this.lyr.clip.top = top;
this.lyr.clip.right = right;
this.lyr.clip.bottom = bottom;
this.lyr.clip.left = left;
}
this.iClipTop = top;
this.iClipRight = right;
this.iClipBottom = bottom;
this.iClipLeft = left;
}
Xlayer.prototype.setZindex = function( iZindex )
{
this.iZindex = iZindex;
if ( is.iewin5up || is.iemac5up || is.gk || is.sf || is.kq3up || is.op6up )
{
this.lyr.style.zIndex = iZindex;
}
else if ( is.nn4up )
{
this.lyr.zIndex = iZindex;
}
}
Xlayer.prototype.setEvents = function( events )
{
if( events )
{
for ( i = 0; i < events.length; )
{
var e = events[ i++ ];
var func = events[ i++ ];
if ( is.gk || is.sf || is.kq3up || is.op7up ) this.lyr.addEventListener( e.substring( 2, e.length ), this.onEvent( e, func, this.lyr ), false );
else if ( is.iewin5up || is.iemac5up || is.op6up ) this.lyr[ e.toLowerCase() ] = this.onEvent( e, func, this.lyr );//new Function( func );
else if ( is.nn4up )
{
this.lyr.captureEvents( Event[ e.toUpperCase().substring( 2 ) ] );
this.lyr[ e.toLowerCase() ] = new Function( func );
}
}
}
}
Xlayer.prototype.onEvent = function( event, func, xlayer )
{
return function( e )
{
var e = arguments[ 0 ];
if ( event == Xlayer.prototype.MOUSEOVER || event == Xlayer.prototype.MOUSEOUT )
{
if ( !e ) var e = window.event; //ie
if ( e.target && e.relatedTarget )
{
var target = e.target;
var relatedTarget = e.relatedTarget;
}
else if ( e.fromElement && e.toElement )
{
var target = e.toElement;
var relatedTarget = e.fromElement;
}
if ( Xlayer.prototype.isChildNode( relatedTarget, xlayer ) && Xlayer.prototype.isChildNode( target, xlayer ) )
return false; // ignore events of inner html-entities
}
return eval( func );
};
}
Xlayer.prototype.isChildNode = function( node, parentNode )
{
if ( node == parentNode )
{
return true;
}
else if ( node && node.parentNode )
return Xlayer.prototype.isChildNode( node.parentNode, parentNode );
else
return false;
}
Xlayer.prototype.setBody = function( sHtml )
{
if ( is.iewin5up || is.iemac || is.op7up || is.kq3up )
this.lyr.innerHTML = sHtml;
else if ( is.gk || is.sf )
{
while ( this.lyr.hasChildNodes() )
this.lyr.removeChild( this.lyr.firstChild );
var range = this.lyr.ownerDocument.createRange();
range.selectNodeContents( this.lyr );
range.deleteContents();
var contextualFrag = range.createContextualFragment( sHtml );
this.lyr.appendChild( contextualFrag );
}
else if( is.nn4up )
{
this.lyr.document.open()
this.lyr.document.write( sHtml );
this.lyr.document.close();
}
else if ( is.op6up && !is.op7up )
this.sBody = sHtml;
}
Xlayer.prototype.scroll = function( orientation, step )
{
this.orientation = orientation;
this.step = step;
// scrolling possible (clipping present)
if ( ( this.iClipRight < this.w ) || ( this.iClipTop != 0 ) || ( this.iClipLeft > 0 ) || ( this.iClipBottom < this.h ) )
{ // scrolling possible
if ( orientation == "horiz" )
{
if ( this.iClipLeft + step > 0 && this.iClipRight + step < this.w )
{ // border reached?
this.setPos(this.x - step, this.y);
this.setClipping(this.iClipTop, this.iClipRight + step, this.iClipBottom, this.iClipLeft + step);
}
}
else if ( orientation == "vert" )
{
if ( this.iClipTop + step > 0 && this.iClipBottom + step < this.h )
{ // border reached?
this.setPos( this.x, this.y - step );
this.setClipping( this.iClipTop + step, this.iClipRight, this.iClipBottom + step, this.iClipLeft );
}
}
}
}
Xlayer.prototype.setOpacity = function( iOpac )
{
if ( is.iewin5up || is.iemac5up )
this.lyr.style.filter = "alpha(opacity=" + iOpac + ")";
else if ( is.gk )
{
this.lyr.style.MozOpacity = iOpac / 100;//opac + "%";
}
/* not tested yet
else if ( is.kq3up )
{
this.lyr.style.KhtmlOpacity = iOpac / 100;
}
*/}
Xlayer.prototype.fade = function( fading )
{
if ( fading )
{
start = fading[ 0 ]; // opacity start value
stop = fading[ 1 ]; // stop
steps = fading[ 2 ]; // number of steps
delay = fading[ 3 ]; // delay in ms
this.iOpacity = this.iOpacity + parseInt( ( stop - start ) / steps );
this.setOpacity( this.iOpacity );
if ( this.iOpacity < stop )
setTimeout( "Xlayer.prototype.instances[" + this.index + "].fade( Xlayer.prototype.instances[" + this.index + "].fading )", delay);
this.fading = fading;
return true;
}
}
Xlayer.prototype.setIframe = function( src, scrollbars )
{
this.src = src;
if ( scrollbars != null )
{
this.scrollbars = ( scrollbars )? "yes" : "no";
}
else if ( this.scrollbars == null )
{
this.scrollbars = "yes"; // default for scrollbars: 'yes'
}
if ( is.nn4up )
{
this.lyr.src = src;
}
else if ( is.iewin5 )
{ // ugly workaround: ie5 basically cannot create dynamically : frame, iframe
this.lyr.innerHTML = "<iframe width='100%' height='100%' frameborder='0' scrolling='" + this.scrollbars + "' id='" + this.id + "_iframe" + "'></iframe>";
this.lyr.contentWindow = new Object();
this.lyr.contentWindow.location = new Object();
this.iframe = document.getElementById(this.id + "_iframe"); // store iframe
this.lyr.contentWindow.location.iframe = this.iframe;
this.lyr.contentWindow.location.iframe.id = "";
this.lyr.contentWindow.location.iframe.src = src
}
else if ( is.iewin55up || is.iemac5up || is.gk || is.sf || is.kq3up || is.op7up )
{
var iframe;
iframe = document.createElement( "IFRAME" ); // create iframe
iframe.src = src;
iframe.name = this.id + "_iframe";
iframe.scrolling = this.scrollbars;
iframe.frameBorder = "0px";
iframe.style.visibility = "inherit";
if ( is.iewin55up )
{
iframe.style.width = this.w + "px";
iframe.style.height = this.h + "px";
}
else if ( is.iemac5up || is.gk || is.sf || is.kq3up || is.op7up )
{
iframe.style.width = "inherit";
iframe.style.height = "inherit";
}
while ( this.lyr.hasChildNodes() )
{ // remove existing layer child-nodes
this.lyr.removeChild( this.lyr.lastChild );
}
this.lyr.appendChild( iframe ) // insert iframe into layer
this.iframe = iframe;
}
}
Xlayer.prototype.getCaption = function( sText, bBold, sIcon, iIconWidth, iIconHeight, iIconBorder )
{
this.sText = sText;
this.sIcon = sIcon;
this.iIconWidth = iIconWidth;
this.iIconHeight = iIconHeight;
var tab_head = '<table style="' + ( ( is.iewin5up )? 'cursor: hand;' : 'cursor: pointer;" ' ) + 'width="' + this. w + '" height="' + this.h + '" border="0" cellpadding="0" cellspacing="0">';
var tab_foot = '</table>';
if ( sText || sIcon )
{
// content ---
var img = "", desc = "", html ="", tab_body = "", sTextCell = "";
if ( sIcon )
img = '<img src="' + sIcon + '" width="' + iIconWidth + '" height="' + iIconHeight + '">';
if ( sText )
{
if ( is.nn4up )
sTextCell = '<font id="' + this.id + 'd" color="' + this.sFgcolor + '" size="' + ( parseInt( "0" + ( this.iFontsize / 5 ), 10 ) ) + '" face="' + this.sFontface + '">' + ( ( bBold )? '<b>' : '' ) + sText + ( ( bBold )? '</b>' : '' ) + '</font>';
else if ( is.iewin5up || is.gk || is.sf || is.kq3up || is.iemac5up || is.op6up )
sTextCell = '<span id="' + this.id + 'd" style="' + 'color:' + this.sFgcolor + ';' + 'font-size:' + this.iFontsize + 'px;' + 'font-family:' + this.sFontface + ';' + ( ( bBold )? ' font-weight:bold;' : '' ) + 'height:' + this.iFontsize + 'px">' + sText + '</span>';
}
if ( this.sHref && is.nn4up ) // nn4 always needs a <a href...
sTextCell = "<a href='" + this.sHref + "' style='text-decoration: none;'>" + sTextCell + "</a>";
// text cell -----
var iTextCellWidth = this.w - iIconWidth - iIconBorder;
var iTextCellHeight = this.h - this.iTopTextBorder - this.iBottomTextBorder;
desc += '<table width="' + iTextCellWidth + '" height="' + this.h + '" cellpadding="0" cellspacing="0" border="0">';
// top text border
if ( this.iTopTextBorder > 0 )
desc += '<tr style="line-height: ' + this.iTopTextBorder + 'px"><td colspan="3" height="' + this.iTopTextBorder + '"><img src="' + this.sSpacer + '" width="1" height="' + this.iTopTextBorder + '" border="0"></td></tr>';
desc += '<tr style="line-height: ' + this.iFontsize + 'px">';
// left border
if ( this.iLeftTextBorder > 0 )
desc += '<td><img src="' + this.sSpacer + '" width="' + this.iLeftTextBorder + '" height="1" border="0"></td>';
// text cell
desc += '<td valign="middle" align="' + this.sAlign + '">' + sTextCell + '</td>';
// right border
if ( this.iRightTextBorder > 0 )
desc += '<td><img src="' + this.sSpacer + '" width="' + this.iRightTextBorder + '" height="1" border="0"></td>';
desc += '</tr>';
// bottom text border
if ( this.iBottomTextBorder > 0 )
desc += '<tr style="line-height: ' + this.iBottomTextBorder + 'px"><td colspan="3" height="' + this.iBottomTextBorder + '"><img src="' + this.sSpacer + '" width="1" height="' + this.iBottomTextBorder + '" border="0"></td></tr>';
// right border
desc += '</table>';
// text & icons ---
if ( sIcon && sText )
{
tab_body =
'<tr>' +
'<td nowrap ';
if ( is.iemac5 )
{
tab_body += 'style="position: absolute; top: 0px; height: ' + this.iFontsize + 'px; width: ' + ( this.w - iIconWidth - iIconBorder ) + 'px; vertical-align: middle;" ';
}
tab_body +=
'width="' + ( this.w - iIconWidth - iIconBorder ) + '" height="' + this.h + '" align="' + this.sAlign + '" valign="middle">' +
desc +
'</td>' +
'<td ';
if ( is.iemac5 )
{
tab_body += 'style="position: absolute; top: ' + ( ( this.h - iIconHeight ) / 2 ) + 'px; left: ' + ( this.w - iIconWidth - iIconBorder ) + 'px; bottom: ' + iIconHeight + 'px; right:' + ( iIconWidth + iIconBorder ) + 'px;height: ' + iIconHeight + 'px; width: ' + ( iIconWidth + iIconBorder ) + 'px" ';
}
tab_body +=
'width="' + ( iIconWidth + iIconBorder ) + '" height="' + this.h + '" align="center" valign="middle" >' +
img +
'</td>' +
'</tr>';
}
// text only ---
else if ( sText && !sIcon )
{
tab_body = '<tr><td ';
if ( is.iemac5 )
{
tab_body += 'style="position: absolute; top: 0; left: 0" ';
}
tab_body +=
'width="' + this.w + '" height="' + this.h + '" align="' + this.sAlign + '" valign="middle">' + desc + '</td></tr>';
}
// icon only ---
else if ( sIcon && !sText )
{
tab_body = '<tr><td nowrap ';
if ( is.iemac5 )
{
tab_body += 'style="position: absolute; top: 0; left: 0" ';
}
tab_body += 'width="' + this.w + '" height="' + this.h + '" align="' + this.sAlign + '" valign="middle">' + sIcon + '</td></tr>';
}
var html = tab_head + tab_body + tab_foot;
return html;
}
}
</script>
<!-- Xmenu.js -->
<script language="javascript">
/**
* @author Andre Dietisheim (dietisheim@sphere.ch)
* @version 2.5.2, 2004-02-10 (created on 2002-04-22)
* Copyright (c) 2001-2004 Andre Dietisheim
*/
function Xmenu( sNavigationName, sNavigation, globals, styles, contents )
{
if( !Xmenu.prototype.instances ) Xmenu.prototype.instances = new Array();
Xmenu.prototype.instances[ Xmenu.prototype.instances.length ] = this; // store this instance in static Array
this.index = Xmenu.prototype.instances.length - 1;
this.sNavigationName = sNavigationName;
this.sNavigation = sNavigation;
this.iType = globals[ 0 ];
this.iCloseDelay = globals[ 1 ] * 1000;
this.bClick = globals[ 2 ];
this.bMenuBelow = globals[ 3 ];
this.bLeftAlign = globals[ 4 ];
this.bKeepExpansionState = globals[ 5 ];
this.bHighlightClickedNodes = globals[ 6 ];
this.sSpacerUrl = globals[ 8 ];
this.styles = styles;
this.contents = contents;
this.iContent = 0;
this.tree = null;
this.overNode = null;
this.outNode = null;
this.lastNode = null;
this.absY = 0;
this.timeout = null;
this.bOpened = false;
iParentLayerWidth = ( is.iemac5up )? 0 : globals[ 7 ][ 0 ]; // XparentLayer disturbs Xlayer-events on iemac5
iParentLayerHeight = ( is.iemac5up )? 0 : globals[ 7 ][ 1 ];
this.xlayerParent = new XlayerParent( "XlayerParent" + this.index, this.sSpacerUrl, null, iParentLayerWidth, iParentLayerHeight, null );
this.tree = this.buildTree( 0, 0, false, null, "tree" );
this.nodeFound = null;
this.navigationNode = null;
if ( this.findNode( this.sNavigation, this.tree ) )
{ // node indicated in request found
this.navigationNode = eval( "this." + this.nodeFound );
}
}
Xmenu.prototype.VERTICAL = 0;
Xmenu.prototype.HORIZONTAL = 1;
Xmenu.prototype.COLLAPSING = 2;
Xmenu.prototype.buildTree = function( iAbsX, iAbsY, bSibling, sParent, sPath )
{
var node = this.buildNode( iAbsX, iAbsY, bSibling, sParent, sPath );
this.iContent++;
if ( this.iContent < this.contents.length && node.iLevel < this.contents[ this.iContent ][ 2 ] )
{ // child
node.child = this.buildTree( node.absX, node.absY, false, "this." + node.sPath, node.sPath + ".child" );
}
if ( this.iContent < this.contents.length && node.iLevel == this.contents[ this.iContent ][ 2 ] )
{ // sibling
node.sibling = this.buildTree( node.absX, node.absY, true, node.sParent, node.sPath + ".sibling" );
}
node.xlayer = this.addXlayer( this.xlayerParent, node, this.styles )
return node;
}
Xmenu.prototype.buildNode = function( iAbsX, iAbsY, bSibling, sParent, sPath )
{
var node = new Object();
node.child = null;
node.sibling = null;
node.sParent = sParent;
node.sPath = sPath;
node.sText = this.contents[ this.iContent ][ 0 ];
node.target = this.contents[ this.iContent ][ 1 ];
node.iLevel = this.contents[ this.iContent ][ 2 ];
if ( this.iType == this.VERTICAL )
{
if ( !bSibling )
{ // child
if ( node.iLevel > 1 || ( node.iLevel == 1 && !this.bMenuBelow ) ) // menu below: level 2,3,... || menu right: 1, 2, ...
node.absX = iAbsX + this.styles[ node.iLevel ][ 2 ] + this.styles[ node.iLevel + 1 ][ 0 ];
else // menu below: level 0, 1 || menu right: level 0
node.absX = iAbsX + this.styles[ node.iLevel + 1 ][ 0 ];
if ( node.iLevel != 1 || ( node.iLevel == 1 && !this.bMenuBelow ) ) // level 0, 2, 3, ... : add yOffset
node.absY = iAbsY + this.styles[ node.iLevel + 1 ][ 1 ];
else // level 1: add height of last node + yOffset
node.absY = iAbsY + this.styles[ node.iLevel + 1 ][ 1 ] + this.styles[ node.iLevel ][ 3 ];
}
else
{ // sibling
node.absX = iAbsX;
node.absY = iAbsY + this.styles[ node.iLevel + 1 ][ 3 ];
}
}
else if ( this.iType == this.HORIZONTAL )
{
if ( !bSibling )
{ // child
if ( node.iLevel > 1 || ( this.bMenuBelow && node.iLevel == 1 ) )
{ // ( level 1 && menu below ), level 2, 3, 4, ...
node.absY = iAbsY + this.styles[ node.iLevel + 1 ][ 1 ] + this.styles[ node.iLevel ][ 3 ];
if ( !this.bLeftAlign ) // add height of last + yOffset, add xOffset
node.absX = iAbsX + this.styles[ node.iLevel + 1 ][ 0 ];
else
node.absX = this.styles[ node.iLevel + 1 ][ 0 ] + this.cumulateOffsets( 0, node.iLevel ) + ( ( node.iLevel > 0 && !this.bMenuBelow )? this.styles[ 1 ][ 2 ] : 0 );
}
else
{ // level 0, ( level 1 && menu on the right )
node.absY = iAbsY + this.styles[ node.iLevel + 1 ][ 1 ];
if ( !this.bLeftAlign ) // add yOffset, add width of last + xOffset
node.absX = iAbsX + this.styles[ node.iLevel + 1 ][ 0 ] + ( ( node.iLevel > 0 )? this.styles[ node.iLevel + 1 ][ 2 ] : 0 );
else
node.absX = this.styles[ node.iLevel + 1 ][ 0 ] + this.cumulateOffsets( 0, node.iLevel ) + ( ( node.iLevel > 0 && !this.bMenuBelow )? this.styles[ 1 ][ 2 ] : 0 );
}
}
else
{ // sibling
node.absY = iAbsY;
node.absX = iAbsX + this.styles[ node.iLevel + 1 ][ 2 ];
}
}
else if ( this.iType == this.COLLAPSING )
{
if ( !bSibling )
{ // child
node.absX = iAbsX + this.styles[ node.iLevel + 1 ][ 0 ];
node.absY = iAbsY + this.styles[ node.iLevel + 1 ][ 1 ];
}
else
{ // sibling
node.absX = iAbsX;
node.absY = iAbsY + this.styles[ node.iLevel + 1 ][ 3 ];
}
}
return node;
}
Xmenu.prototype.cumulateOffsets = function( iStyleIndex, iMaxLevel )
{
var iOffset = 0;
for ( i = 0; i < iMaxLevel; i++ )
{
iOffset += this.styles[ i + 1 ][ iStyleIndex ];
}
return iOffset;
}
Xmenu.prototype.addXlayer = function( xparentLayer, node, styles )
{
var parent = null;
var x = "left";
var y = "top";
var offsetX = node.absX;
var offsetY = node.absY;
var w = styles[ node.iLevel + 1 ][ 2 ];
var h = styles[ node.iLevel + 1 ][ 3 ];
var clipTop = 0;
var clipRight = w;
var clipBottom = h;
var clipLeft = 0;
var zIndex = node.iLevel;
var visibility = false;
var fading = styles[ node.iLevel + 1 ][ 4 ];
var events =
[
Xlayer.prototype.MOUSEOVER, "Xmenu.prototype.instances[" + this.index + "].onmouseover( Xmenu.prototype.instances[" + this.index + "]." + node.sPath + ")",
Xlayer.prototype.MOUSEOUT, "Xmenu.prototype.instances[" + this.index + "].onmouseout( Xmenu.prototype.instances[" + this.index + "]." + node.sPath + ")",
Xlayer.prototype.CLICK, "Xmenu.prototype.instances[" + this.index + "].onclick( Xmenu.prototype.instances[" + this.index + "]." + node.sPath + ")"
];
var sText = node.sText;
var bgcolor = styles[ node.iLevel + 1 ][ 5 ][ 0 ];
var fgcolor = styles[ node.iLevel + 1 ][ 5 ][ 1 ];
var align = styles[ node.iLevel + 1 ][ 5 ][ 2 ];
var iTopTextBorder = styles[ node.iLevel + 1 ][ 5 ][ 3 ]
var iRightTextBorder = styles[ node.iLevel + 1 ][ 5 ][ 4 ]
var iBottomTextBorder = styles[ node.iLevel + 1 ][ 5 ][ 5 ]
var iLeftTextBorder = styles[ node.iLevel + 1 ][ 5 ][ 6 ]
var href = null;
var bold = styles[ node.iLevel + 1 ][ 5 ][ 7 ];
var fontface = styles[ node.iLevel + 1 ][ 5 ][ 8 ];
var fontsize = styles[ node.iLevel + 1 ][ 5 ][ 9 ];
if ( styles[ node.iLevel + 1 ][ 5 ][ 11 ] )
{ // icon defined
var icon = ( node.child || styles[ node.iLevel + 1 ][ 5 ][ 10 ] )? styles[ node.iLevel + 1 ][ 5 ][ 11 ] : this.sSpacerUrl;
var icon_w = styles[ node.iLevel + 1 ][ 5 ][ 12 ];
var icon_h = styles[ node.iLevel + 1 ][ 5 ][ 13 ];
var iconBorder = styles[ node.iLevel + 1 ][ 5 ][ 14 ];
}
else
{ // icon not defined
var icon = null;
var icon_w = 0;
var icon_h = 0;
var iconBorder = 0;
}
var src = null; // iframe: src
return new Xlayer( parent, xparentLayer, x, y, offsetX, offsetY, w, h, clipTop, clipRight, clipBottom, clipLeft, zIndex, visibility, bgcolor, fading, events, sText, bold, align, iTopTextBorder, iRightTextBorder, iBottomTextBorder, iLeftTextBorder, fgcolor, href, icon, icon_w, icon_h, iconBorder, fontface, fontsize, src, this.sSpacerUrl );
}
Xmenu.prototype.create = function()
{
this.createXlayers( null );
this.setVisibSiblings( this.tree, true );
}
Xmenu.prototype.createXlayers = function( tree )
{
if ( !tree )
{ // call without param -> take root node
tree = this.tree;
}
if ( tree.child )
{
this.createXlayers( tree.child );
}
if ( tree.sibling )
{
this.createXlayers( tree.sibling );
}
tree.xlayer.create();
}
Xmenu.prototype.setOpenListener = function( openListener )
{
this.openListener = openListener;
}
Xmenu.prototype.setCloseListener = function( closeListener )
{
this.closeListener = closeListener;
}
Xmenu.prototype.setLinkClickListener = function( linkClickListener )
{
this.linkClickListener = linkClickListener;
}
Xmenu.prototype.open = function()
{
if ( this.navigationNode != null )
{
this.openLastClicked();
}
else
{
this.setVisibSiblings( this.tree, true );
}
this.bOpened = true;
this.openListener.onMenuOpen( this );
}
Xmenu.prototype.openLastClicked = function()
{
node = this.navigationNode;
this.lastNode = node;
if ( node.child != null )
this.setVisibSiblings( node.child, true );
while ( node != null )
{
this.highlightClickedNode( node );
if ( node.sParent != null )
{
this.setVisibSiblings( eval( node.sParent ).child, true );
node = eval( node.sParent );
}
else
{
this.setVisibSiblings( this.tree, true );
node = null;
}
}
}
Xmenu.prototype.findNode = function( sText, node )
{
if ( this.nodeFound )
return true;
if ( node.child )
this.findNode( sText, node.child );
if ( node.sibling )
this.findNode( sText, node.sibling );
if ( sText == node.sText )
this.nodeFound = node.sPath;
if ( this.nodeFound )
return true;
else
return false;
}
Xmenu.prototype.close = function()
{
if ( this.bOpened && !this.bKeepExpansionState )
{
this.setVisibChildren( this.tree, false );
this.setVisibSiblings( this.tree, true );
if ( this.iType == this.COLLAPSING )
this.setCollapsePos( this.tree );
// if ( this.bClick && this.lastNode )
// {
this.clearHighlightChildren( this.tree );
this.lastNode = null;
// }
this.bOpened = false;
this.closeListener.onMenuClose( this );
}
}
Xmenu.prototype.onmouseover = function( node )
{
this.overNode = node;
if ( ( this.iType == this.VERTICAL || this.iType == this.HORIZONTAL ) && !this.bClick )
{
if ( !this.bOpened )
{ // this menu will open
this.bOpened = true;
this.openListener.onMenuOpen( this );
}
if ( this.outNode )
var outNode = this.outNode;
else
var outNode = this.tree;
if ( outNode.iLevel > node.iLevel )
{
this.showBranch( node, this.outNode );
// this.setVisibSiblings( eval( outNode.sParent + ".child" ), false );
// this.setVisibSiblings( outNode.child, false );
}
else if ( outNode.iLevel == node.iLevel )
{
this.setVisibSiblings( outNode.child, false );
}
this.setVisibSiblings( node.child, true );
}
if ( this.checkClickPath( node ) )
{ // current node is not the node that was clicked (or its parents)
this.highlight( node, true );
}
return false;
}
Xmenu.prototype.onmouseout = function( node )
{
if ( this.checkClickPath( node ) )
this.highlight( node, false );
var timeout = this.timeout;
if ( ( this.iType == this.VERTICAL || this.iType == this.HORIZONTAL ) && !this.bClick ) // close menu if no onmouseover until timeout
{
this.timeout = setTimeout( "Xmenu.prototype.instances[" + this.index + "].checkOnmouseout()", this.iCloseDelay );
}
this.outNode = node;
clearTimeout( timeout );
return false;
}
Xmenu.prototype.checkClickPath = function( node )
{
if ( this.bHighlightClickedNodes )
{
lastNode = this.lastNode;
while ( lastNode != null )
{
if ( lastNode == node ) // node clicked found
return false;
else // continue looking for it
lastNode = eval( lastNode.sParent );
}
return true;
}
else
{
return true;
}
}
Xmenu.prototype.checkOnmouseout = function()
{
if ( this.overNode == this.outNode && !( this.bKeepExpansionState && this.bClick ) )
{ // onmouseover executed since delay?
this.close();
}
}
Xmenu.prototype.onclick = function( node )
{
if ( node.target )
{ // follow href
node.target.open( node.sText, this.sNavigationName, this.sNavigation );
this.sNavigation = node.sText;
this.navigationNode = node; // store navigation node
this.clearHighlightChildren( this.tree );
this.linkClickListener.onLinkClick( this ); // inform controller
}
else if (
( ( this.iType == this.VERTICAL || this.iType == this.HORIZONTAL ) && this.bClick ) ||
this.iType == this.COLLAPSING )
{
this.highlight( node, true );
if ( !this.bOpened )
{ // this menu will open
this.bOpened = true;
this.openListener.onMenuOpen( this );
}
if ( this.iType == this.COLLAPSING )
this.collapse( node );
else if ( ( this.iType == this.VERTICAL || this.iType == this.HORIZONTAL ) && this.bClick )
this.showBranch( node, this.lastNode );
this.lastNode = node;
}
return false;
}
Xmenu.prototype.showBranch = function( node, hideNode )
{
// if ( this.bClick && hideNode == node && node.child && node.child.xlayer.isVisible() )
if ( this.bClick && node.child && node.child.xlayer.isVisible() )
{ // reclose branch
this.setVisibChildren( node.child, false );
this.clearHighlightChildren( node, false );
}
else
{
if ( hideNode )
{ // hide old nodes
this.setVisibChildren( this.tree, false );
this.clearHighlightChildren( this.tree, false );
}
if ( node.child ) this.setVisibSiblings( node.child, true );
while ( node )
{ // show new nodes
if ( this.bClick )
this.highlightClickedNode( node, true );
if ( node.sParent )
this.setVisibSiblings( eval( node.sParent ).child, true );
else
this.setVisibSiblings( this.tree, true );
node = eval( node.sParent );
}
}
}
Xmenu.prototype.clearHighlightChildren = function( node )
{
if ( node )
{
if ( node.child )
this.clearHighlightChildren( node.child );
if ( node.sibling )
this.clearHighlightChildren( node.sibling );
this.highlight( node, false );
}
}
Xmenu.prototype.collapse = function( node )
{
this.showBranch( node, this.lastNode );
this.setCollapsePos( this.tree );
}
Xmenu.prototype.setCollapsePos = function( node )
{
if ( node == this.tree ) // start looping
this.absY = this.tree.xlayer.y;
if ( node.xlayer.isVisible() )
{
node.xlayer.setPos( node.xlayer.x, this.absY );
this.absY += node.xlayer.h;
}
if ( node.child )
this.setCollapsePos( node.child );
if ( node.sibling )
this.setCollapsePos( node.sibling );
}
Xmenu.prototype.highlight = function( node, bHighlight )
{
var index = ( bHighlight )? 6 : 5; // style for mouseover or mouseout ?
node.xlayer.setBgColor( this.styles[ node.iLevel + 1 ][ index ][ 0 ] );
// nn4 crashes, iemac stops rendering
if ( !is.nn4up && !is.iemac5up ) node.xlayer.setFgColor( this.styles[ node.iLevel + 1 ][ index ][ 1 ] );
}
Xmenu.prototype.highlightClickedNode = function( node )
{
if ( node && this.bHighlightClickedNodes )
{
node.xlayer.setBgColor( this.styles[ 0 ][ 0 ] );
if ( !is.nn4up && !is.iemac5up )
node.xlayer.setFgColor( this.styles[ 0 ][ 1 ] );
}
}
Xmenu.prototype.setVisibSiblings = function( node, bVisibility )
{
if ( node )
{
if ( node.sibling )
this.setVisibSiblings( node.sibling, bVisibility );
node.xlayer.setVisibility( bVisibility );
}
}
Xmenu.prototype.setVisibChildren = function( node, bVisibility )
{
if ( node )
{
if ( node.child )
this.setVisibChildren( node.child, bVisibility );
if ( node.sibling )
this.setVisibChildren( node.sibling, bVisibility );
node.xlayer.setVisibility( bVisibility );
}
}
Xmenu.prototype.isNavigationNodeFound = function()
{
return this.navigationNode != null;
}
</script>
<!-- Xmenus.js -->
<script language="javascript">
// created by: Andre Dietisheim (dietisheim@sphere.ch)
// created: 2002-05-11
// modified by: Andre Dietisheim (dietisheim@sphere.ch)
// modified: 2004-01-17
// version: 2.1.0
function Xmenus( sNavigationName, sNavigation )
{
if( !Xmenus.prototype.instances ) Xmenus.prototype.instances = new Array();
Xmenus.prototype.instances[ Xmenus.prototype.instances.length ] = this;
this.index = Xmenus.prototype.instances.length - 1;
this.bCompatibleBrowser = ( is.iewin5up || is.iemac5up || is.gk || is.sf || is.kq3up || is.nn4up || is.op6up );
this.iCloseDelay = 1;
this.xmenus = new Array();
this.sNavigationName = sNavigationName;
this.sNavigation = sNavigation;
this.navigationMenu = null;
this.lastMenu = null;
this.timeout = null;
this.bReopenDisabled = false;
}
Xmenus.prototype.add = function( xmenuConfig )
{
if ( this.bCompatibleBrowser )
this.xmenus[ this.xmenus.length ] = new Xmenu( this.sNavigationName, this.sNavigation, xmenuConfig[ 0 ], xmenuConfig[ 1 ], xmenuConfig[ 2 ] );
// else
// this.writeDegradationHtml( xmenuConfig );
}
Xmenus.prototype.create = function()
{
if ( !this.bCompatibleBrowser ) return;
for ( j = 0; j < this.xmenus.length; j++ )
{
this.xmenus[ j ].setOpenListener( this );
this.xmenus[ j ].setCloseListener( this );
this.xmenus[ j ].setLinkClickListener( this );
this.xmenus[ j ].create();
if ( this.xmenus[ j ].isNavigationNodeFound() )
{
this.openNavigationMenu( this.xmenus[ j ] );
}
}
}
Xmenus.prototype.openNavigationMenu = function( xmenu )
{
this.navigationMenu = xmenu;
this.lastMenu = xmenu;
xmenu.open();
}
Xmenus.prototype.onMenuOpen = function( xmenu )
{ // fired by Xmenu on menu open
if ( this.lastMenu != null && this.lastMenu != xmenu )
{
this.bReopenDisabled = true;
this.lastMenu.close();
this.bReopenDisabled = false;
}
this.bOpened = true;
this.lastMenu = xmenu;
}
Xmenus.prototype.onMenuClose = function( xmenu )
{ // fired by Xmenu on menu close
if ( !this.bReopenDisabled )
{
this.timeout = setTimeout( "Xmenus.prototype.instances[" + this.index + "].reopenAfterClose()", this.iCloseDelay * 1000 );
}
this.bOpened = false;
}
Xmenus.prototype.reopenAfterClose = function()
{
if ( !this.bOpened && this.navigationMenu != null )
{ //no other menu is opened -> open navigation menu
this.navigationMenu.open();
}
}
Xmenus.prototype.onLinkClick = function( xmenu )
{ // fired by Xmenu on click on a link
// this.navigationMenu.clearHighlightChildren( this.navigationMenu.tree );
this.openNavigationMenu( xmenu );
}
Xmenus.prototype.writeDegradationHtml = function( xmenuConfig )
{
var content = xmenuConfig[ 2 ];
for ( i = 0; i < content.length; i++ )
{
if ( content[ i ][ 2 ] == 0 && content[ i ][ 1 ] )
document.write( '<a href="' + content[ i ][ 1 ].sSrc + '">' + content[ i ][ 0 ] + '</a><br>' );;
}
}
</script>
<!-- Debug.js -->
<script language="javascript">
function Debug()
{
this.outputElementName = "debug";
this.sText = "";
}
debug = new Debug();
Debug.prototype.writeHtml = function( iColumns, iRows )
{
sTextAreaHtml =
"<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">" +
"<tr>" +
"<td colspan=\"3\">" +
"<form>" +
"<textarea type=\"text\" name=\"" + this.outputElementName + "\" id=\"debug\" cols=\"" + iColumns + "\" rows=\"" + iRows + "\">" +
"</textarea><br>" +
"<input type=\"button\" value=\"select all\" onClick=\"javascript:document.getElementById( 'debug' ).select()\">" +
"<input type=\"reset\" value=\"clear\">" +
"</form>" +
"</td>" +
"</tr>" +
"</table>";
document.write( sTextAreaHtml );
}
Debug.prototype.flushBuffer = function()
{
var outputElement = this.getOutput();
if ( outputElement )
{
outputElement.value = this.sText + "\n" + outputElement.value ;
}
}
Debug.prototype.bufferedWrite = function( sText )
{
this.sText = sText + "\n" + this.sText;
}
Debug.prototype.write = function( sText )
{
var outputElement = this.getOutput();
if ( outputElement )
{
outputElement.value = sText + "\n" + outputElement.value;
}
}
Debug.prototype.getOutput = function()
{
var outputElement = null;
if ( is.nn4up )
{
outputElement = document.forms[ "\"" + this.outputElementName + "\"" ];
}
else if ( is.gk || is.iewin5up || is.iemac5up || is.sf )
{
outputElement = document.getElementById( this.outputElementName );
}
return outputElement;
}
</script>
<!-- XmenuConfig.js -->
<script language="javascript">
function WinTarget( sSrc )
{
this.sSrc = sSrc;
}
WinTarget.prototype.createHref = function( sSrc, sText, sNavigationName, sNavigation )
{
if ( sSrc == "#" )
{ // create link to same page poping up current menu-entry
sSrc = location + ""; // window.document.URL
sSrc = sSrc.replace( new RegExp( sNavigationName + "=[^&]*", "" ), sNavigationName + "=" + escape( sText ) );
if ( sSrc.indexOf( sNavigationName + "=" ) < 0 )
sSrc = sSrc + "?" + sNavigationName + "=" + escape( sText );
}
return sSrc;
}
WinTarget.prototype.open = function( sText, sNavigationName, sNavigation )
{
window.location = this.createHref( this.sSrc, sText, sNavigationName, sNavigation );
}
function NewWinTarget( sSrc, iX, iY, iWidth, iHeight )
{
this.win = null;
this.sSrc = sSrc;
this.iX = iX;
this.iY = iY;
this.iWidth = iWidth;
this.iHeight = iHeight;
}
NewWinTarget.prototype.open = function()
{
var sOpts = "toolbar=yes,location=yes,status=yes,menubar=yes,resizable=yes,scrollbars=yes";
if ( document.body && document.body.offsetWidth )
sOpts += ",width=" + this.iWidth;
else if ( window.innerWidth )
sOpts += ",innerWidth=" + this.iWidth + ",";
if ( document.body && document.body.offsetHeight )
sOpts += ",height=" + this.iHeight
else if ( window.innerHeight )
sOpts += ",innerHeight=" + this.iHeight
sOpts +=",top=" + this.iY;
sOpts += ",left=" + this.iX;
this.win = top.open( this.sSrc, "", sOpts );
}
function FrameTarget( sSrc, sId )
{
this.sSrc = sSrc;
this.sId = sId;
}
FrameTarget.prototype.open = function()
{
var target = top.frames[ this.sId ];
if ( target )
target.document.location.href = this.sSrc;
}
function IframeTarget( sSrc, sId )
{
this.sSrc = sSrc;
this.sId = sId;
}
IframeTarget.prototype.open = function()
{
if ( !this.ns47up )
{
var target = top.frames[ this.sSrc ];
if ( target )
target.src = this.sSrc;
}
}
</script>
<!-- XmenusConf.js -->
<script language="javascript">
var pastaVertical = [
// globals -----------------
[ Xmenu.prototype.VERTICAL,
1, // delay in sec. before closing menu
false, // onclick / onmouseover
true, // horizontal & vertical menu: menu appears below/right of the root-node
false, // horizontal menu: each hierarchy starts on same X
false, // keep expansion state
true, // highlight clicked nodes
[ 20, 1 ], // XlayerParent width, height
"img/spacer.gif" // spacer url
],
// styles ------------------
[ [ "#ff4400", "#ffaaaa" ], // onclick-menu: color of clicked node
[ 0, 8, 100, 25, null, [ "#ef6f00", "white", "center", 0, 0, 0, 0, true, "Arial, Helvetica, sans serif", 14, false, "img/arrow_horiz.gif", 3, 5, 10 ],[ "#ff5500", "#ffbbaa", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 2, null, 1, 20, 0 ] ], // xlayer style: [xOffset, yOffset, width, height, fading: [start_val, stop_val, steps, delay(ms)], style onmouseout: [bgcolor, fgcolor, align, bold, fontFace, fontSize, img, img_width, img_height, tile(horiz/vert)], onmouseover: [ bgcolor, fgcolor, align, fontFace, fontSize ]]
[ 0, 1, 100, 30, null, [ "#ef7f00", "white", "left", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 12, false, "img/arrow_horiz.gif", 3, 5, 10 ],[ "#ff8e00", "#ffbbaa", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 1, "img/spacer.gif", 1, 1, 0 ] ],
[ -8, 0, 100, 20, null, [ "#ff8e00", "white", "left", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 10, false, "img/arrow_horiz.gif", 3, 5, 10 ],[ "#ffa000", "#ffbbaa", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 1, "img/spacer.gif", 1, 1, 0 ] ],
[ -4, 0, 100, 20, null, [ "#ffb200", "white", "left", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 10, false, "img/arrow_horiz.gif", 3, 5, 10 ],[ "#ffc400", "#ffccbb", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 1, "img/spacer.gif", 1, 1, 0 ] ]
],
// content ----------
[ [ "pasta", null, 0 ], // content: [text, href, hierarchyLevel]
[ "spaghetti", null, 1 ],
[ "bolognese", null, 2 ],
[ "formaggio", new WinTarget( "#" ), 3 ],
[ "carbonara", new WinTarget( "#" ), 2 ],
[ "pesto", null, 2 ],
[ "rosso", new WinTarget( "#" ), 3 ],
[ "tortelloni", new WinTarget( "#" ), 1 ],
[ "tagliatelle", null, 1 ],
[ "alla panna", null, 2 ],
[ "arrabiato", new WinTarget( "#" ), 2 ],
[ "formaggio", new WinTarget( "#" ), 3 ]
]
];
var pastaHorizontal = [
// globals -----------------
[ Xmenu.prototype.HORIZONTAL,
1, // delay in sec. before closing menu
false, // classic menu: onclick / onmouseover
true, // horizontal & vertical menu: menu appears below/right of the root-node
false, // horizontal menu: each hierarchy starts on same X
false, // keep expansion state
true, // highlight clicked nodes
[ 20, 1 ], // XlayerParent width, height
"img/spacer.gif" // spacer url
],
// styles ------------------
[ [ "#ff4400", "#ffaaaa" ], // onclick-menu: color of clicked node
[ 0, 8, 100, 25, null, [ "#ef6f00", "white", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 14, false, "img/arrow_vert.gif", 5, 3, 10 ],[ "#ff5500", "#ffbbaa", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 2, null, 1, 20, 0 ] ], // xlayer style: [xOffset, yOffset, width, height, fading: [start_val, stop_val, steps, delay(ms)], style onmouseout: [bgcolor, fgcolor, align, bold, fontFace, fontSize, img, img_width, img_height, tile(horiz/vert)], onmouseover: [ bgcolor, fgcolor, align, fontFace, fontSize ]]
[ 0, 1, 100, 30, null, [ "#ef7f00", "white", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 12, false, "img/arrow_vert.gif", 5, 3, 10 ],[ "#ff8e00", "#ffbbaa", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 1, "img/spacer.gif", 1, 1, 0 ] ],
[ 0, 0, 100, 20, null, [ "#ff8e00", "white", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 10, false, "img/arrow_vert.gif", 5, 3, 10 ],[ "#ffa000", "#ffbbaa", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 1, "img/spacer.gif", 1, 1, 0 ] ],
[ 0, 0, 100, 20, null, [ "#ffa000", "white", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 10, false, "img/arrow_vert.gif", 5, 3, 10 ],[ "#ffb200", "#ffccbb", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 1, "img/spacer.gif", 1, 1, 0 ] ]
],
// content ----------
[ [ "pasta", null, 0 ], // content: [text, href, hierarchyLevel]
[ "spaghetti", null, 1 ],
[ "bolognese", null, 2 ],
[ "formaggio", new WinTarget( "#" ), 3 ],
[ "carbonara", new WinTarget( "#" ), 2 ],
[ "pesto", null, 2 ],
[ "rosso", new WinTarget( "#" ), 3 ],
[ "tortelloni", new WinTarget( "#" ), 1 ],
[ "tagliatelle", null, 1 ],
[ "alla panna", null, 2 ],
[ "arrabiato", null, 2 ],
[ "formaggio", new WinTarget( "#" ), 3 ]
]
];
var pastaVerticalOnclickHighlight = [
// globals -----------------
[ Xmenu.prototype.VERTICAL,
1, // delay in sec. before closing menu
true, // classic menu: onclick / onmouseover
true, // horizontal & vertical menu: menu appears below/right of the root-node
false, // horizontal menu: each hierarchy starts on same X
false, // keep expansion state
true, // onclick menu: highlight clicked nodes
[ 20, 1 ], // XlayerParent width, height
"img/spacer.gif" // spacer url
],
// styles ------------------
[ [ "#ff4400", "#ffaaaa" ], // onclick-menu: color of clicked node
[ 0, 8, 100, 25, null, [ "#ef6f00", "white", "center", 0, 0, 0, 0, true, "Arial, Helvetica, sans serif", 14, false, "img/arrow_vert.gif", 5, 3, 10 ],[ "#ff5500", "#ffbbaa", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif, sans serif", 2, null, 1, 20, 0 ] ], // xlayer style: [xOffset, yOffset, width, height, fading: [start_val, stop_val, steps, delay(ms)], style onmouseout: [bgcolor, fgcolor, align, bold, fontFace, fontSize, img, img_width, img_height, tile(horiz/vert)], onmouseover: [ bgcolor, fgcolor, align, fontFace, fontSize ]]
[ 0, 1, 150, 24, null, [ "#ff7f00", "white", "left", 0, 0, 0, 0, true, "Arial, Helvetica, sans serif", 12, false, "img/arrow_vert.gif", 5, 3, 10 ],[ "#ff8e00", "#ffbbaa", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif, sans serif", 1, "img/spacer.gif", 1, 1, 0 ] ],
],
// content ----------
[ [ "gallery", null, 0 ], // content: [text, href, hierarchyLevel]
[ " face-art.ch", new NewWinTarget( "http://www.face-art.ch", 50, 50, 1024, 768 ), 1 ],
[ " swissbusinesshub.org", new NewWinTarget( "http://www.swissbusinesshub.org", 50, 50, 800, 600 ), 1 ],
[ " ensta.fr", new NewWinTarget( "http://www.ensta.fr/uer/uei/fr/index.html", 50, 50, 800, 600 ), 1 ]
]
];
var pastaCollapsingFading = [
// globals -----------------
[ Xmenu.prototype.COLLAPSING,
1, // delay in sec. before closing menu
true, // vertical or horizontal menu: onclick / onmouseover
true, // horizontal & vertical menu: menu appears below/right of the root-node
true, // horizontal menu: each hierarchy starts on same X
false, // keep expansion state
true, // highlight clicked nodes
[ 20, 1 ], // XlayerParent width, height
"img/spacer.gif" // spacer url
],
// styles ------------------
[ [ "#ff4400", "#ffaaaa" ], // onclick-menu: color of clicked node
[ 11, 8, 100, 25, null, [ "#ff7f00", "white", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 12, false, "img/arrow_vert.gif", 5, 3, 10 ],[ "#ff7c00", "#ffbbaa", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 1, "img/spacer.gif", 1, 1, 0 ] ],
[ 0, 0, 100, 20, null, [ "#ff8e00", "white", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 10, false, "img/arrow_vert.gif", 5, 3, 10 ],[ "#ffa000", "#ffbbaa", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 1, "img/spacer.gif", 1, 1, 0 ] ],
[ 0, 0, 100, 20, null, [ "#ffa000", "white", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 10, false, "img/arrow_vert.gif", 5, 3, 10 ],[ "#ffb200", "#ffccbb", "center", 0, 0, 0, 10, true, "Arial, Helvetica, sans serif", 1, "img/spacer.gif", 1, 1, 0 ] ]
],
// content ----------
[ [ "spaghetti", null, 0 ],
[ "bolognese", null, 1 ],
[ "formaggio", new WinTarget( "#" ), 2 ],
[ "carbonara", new WinTarget( "#" ), 1 ],
[ "pesto", null, 1 ],
[ "rosso", new WinTarget( "#" ), 2 ],
[ "tortelloni", new WinTarget( "#" ), 0 ],
[ "tagliatelle", null, 0 ],
[ "alla panna", null, 1 ],
[ "formaggio", new WinTarget( "#" ), 2 ],
[ "arrabiato", new WinTarget( "#" ), 1 ]
]
];
</script>
<script language="javascript">
var menus = new Xmenus( 'sNavigation', '' );
function onLoad()
{
menus.create()
}
function onResize()
{
window.location.reload();
}
</script></head>
<body onload="onLoad()" onresize="onResize()">
<table border="0" cellpadding="0" cellspacing="0" height="33" width="553">
<tbody><tr>
<td class="orange" height="33" valign="top" width="100">
<script language="javascript">
menus.add( pastaHorizontal );
</script>
</td>
<td class="orange" height="33" valign="top" width="100">
<script language="javascript">
menus.add( pastaVertical );
</script>
<td class="orange" height="33" valign="top" width="100">
<script language="javascript">
menus.add( pastaVerticalOnclickHighlight );
</script>
</tbody>
</table>
<b>Xmenu-xlayer</b> is a versatile, javascript driven DHTML menu that works on
<ul class="content"><li>Internet Explorer Windows 5 and later (5, 5.5, 6)<br></li>
<li>Gecko (Mozilla, Mozilla-Firebird, Galeon, Netscape 6, 7, etc.)<br></li>
<li>Opera 6, 7<br></li><li>Internet Explorer Macintosh 5 and later (5, 5.1, 5.2)<br></li>
<li>Safari<br></li><li>Konqueror 3.x<br></li><li>Netscape 4.x<br></li>
</ul>
It comes in 3 basic modes:
<ul class="content">
<li>horizontal<br></li>
<li>vertical<br></li>
<li>collapsing<br></li>
</ul>
and may be configured to fold/unfold on clicks or mouseovers. There are
plenty of other configuration options that allow you to change colors,
fonts, sizes, offsets, behaviours, etc. <b>Xmenu-xlayer</b> is very easy to
implement, it doesn't need any absolute coordinates - just add it to
your layout and it calculates its positon on its own. The whole code is
released into the community under LGPL and may be freely distributed.
<script language="javascript">
menus.add( pastaCollapsingFading );
</script>
</body></html>
Related examples in the same category