function bwSniff03(){  /*BrowserSniff object 20020525*/
  var verMajor = "?", verMinor = "?";
  this.ver=navigator.appVersion;
  this.agent=navigator.userAgent;
  this.dom=document.getElementById?1:0;
  var idxMSIE = this.agent.indexOf("MSIE");
  var idxNN6 = this.agent.indexOf("Netscape6");
  var idxOP = this.agent.indexOf("Opera");
  if (idxMSIE>-1) {
    this.name = "IE";
    verMajor = parseInt(this.agent.substring(idxMSIE + 5));
    verMinor = parseInt(this.agent.substring(idxMSIE + 7));
  } else if (idxNN6>-1) {
    this.name = "NN";
    verMajor = parseInt(this.agent.substring(idxNN6 + 10));
    verMinor = parseInt(this.agent.substring(idxNN6 + 12, idxNN6 + 12 + 1));
  } else if (idxOP>-1) {
    this.name = "OP";
    verMajor = parseInt(this.agent.substring(idxOP + 6));
    verMinor = this.agent.substring(idxOP + 8, idxOP + 8 + 2);
  } else {
    this.name = "?";
  }
  // handy vars
  this.ie = (this.name == "IE");
  this.ie50 = this.agent.indexOf("MSIE 5.0")>-1;
  this.nn = (this.name == "NN");
  this.op = (this.name == "OP");
  this.mac = (this.agent.indexOf("Mac")>-1);
  this.platform = this.mac?"Mac":"PC";
  this.bw = this.name + verMajor + verMinor;
  this.bp = this.bw + "-" + this.platform;
  // CSS pixels
  this.px=this.dom&&!this.op?"px":"";
}
var bw = new bwSniff03()
// you can do some configuration here
var closeMenuDelay = 800; //msec delay before menu disappears
var clrOver = "#B4C46E";  //mouseover color
var clrOut = "#FDF9D4";   //mouseout color
// style bits the 'iStyle' parameter in function menOverTR()
var cSkipColoring = 0;    //skip mouseover coloring
var cPopDown = 2;         //pop first popup downwards
// global vars
var elemCurItem;          //current item (TR) where cursor is at
var elemCurMenuAt;        //current menu (DIV) where cursor is at
//note: cursor change not supported in Opera
var handcursor = "pointer";
// note: standard array methods push and pop are NOT supported by IE5-Mac!
var stackMenu = [0];      //currently visible DIVs
var stackItem = [0];      //currently visible TRs (treepath)
var stackColored = [0];   //currently colored items
var curLevelAt = 0;       //current level
var fActive = false;    	//user action flag for delay
var closeTimeoutID = 0;		//for delay

// =================================================================================
// internal functions
var bodyMargin = new getBodyMargin();
function getBodyMargin() {
  // read margins once from CSS styles
  // expects (a) ONE stylesheet, (b) BODY rule to be the FIRST!
  // [this function is needed only by IE5-Mac]
  var theRules = new Array(); //document.styleSheets[0] only
  getTheRules();
  function getTheRules() {
  	if (!document.styleSheets) return;      /*Opera*/
  	if (document.styleSheets[0].cssRules)   /*NN6, IE5/Mac*/
  		theRules = document.styleSheets[0].cssRules
  	else if (document.styleSheets[0].rules) /*IE4+/WinMac*/
  		theRules = document.styleSheets[0].rules
  	else return
  }
  if (theRules.length > 0) {
    this.Left = parseInt(theRules[0].style.marginLeft);
    this.Top = parseInt(theRules[0].style.marginTop);
  } else {
    this.Left = 0;
    this.Top = 0;
  }
}

function getBrowserWindowSize() {
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    this.width = window.innerWidth;
    this.height = window.innerHeight;
  } else if( document.documentElement &&
      ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    this.width = document.documentElement.clientWidth;
    this.height = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    this.width = document.body.clientWidth;
    this.height = document.body.clientHeight;
  }
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    this.scrollY = window.pageYOffset;
    this.scrollX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    this.scrollY = document.body.scrollTop;
    this.scrollX = document.body.scrollLeft;
  } else if( document.documentElement &&
      ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    this.scrollY = document.documentElement.scrollTop;
    this.scrollX = document.documentElement.scrollLeft;
  }
}

function getAbsoluteOffset(id) {
// 20020511: x/y offsets within page
// PC:  +IE55, +NN60, +NN62
// Mac: +IE50, +IE51, +NN60+
  var offsetX = 0, offsetY = 0;
  var sDepthX = "", sDepthY = "";
  var elem = document.getElementById(id);

  if (elem.offsetParent) {
    // IE55, NN60-level 1, NN62: walk up the object hierarchy
		// MacIE55 is here, too
  	while (elem.offsetParent) {
      offsetX += elem.offsetLeft;
      offsetY += elem.offsetTop;
      elem = elem.offsetParent;
    }
    // for NN60-level 1 PC: add body offset (is 0 in other browsers, also on Mac)
  	offsetX += document.body.offsetLeft;
   	offsetY += document.body.offsetTop;

		// MacIE50 and MacIE51 need to add the body style offsets
		if (bw.mac && bw.ie) {
 			offsetX += bodyMargin.Left
 			offsetY += bodyMargin.Top
		}
  } else {
    // NN60-level 2ff: elem.offsetParent is Null for layer 2 ff
    // in this case offsetLeft/Top is all we need
    offsetX += elem.offsetLeft;
    offsetY += elem.offsetTop;
  }
  // build return-struct
  this.x = offsetX;
  this.y = offsetY;
  // for debug only
  this.sDepthX = sDepthX;
  this.sDepthY = sDepthY;
}

// =================================================================================
// event-driven functions
function menOut() {
  fActive = false;
  closeTimeoutID = window.setTimeout("closeMenu()", closeMenuDelay);
}
function menOver() {
    window.clearTimeout(closeTimeoutID);
}
function closeMenu() {
  if (fActive) {
    // keep open
    window.clearTimeout(closeTimeoutID);
  } else {
    //ensure style undo for level 1 TR (happens when we mouseOut there)
    //stackitem.1.style error fix:
    if (stackItem[1]) {
      if (stackColored[1]) stackItem[1].style.backgroundColor = clrOut;
    }
    //close all menus above level 2
    curLevelAt = 1;
    for (i = stackMenu.length - 1; i > curLevelAt; i--) {
      stackMenu[i].style.visibility = "hidden";
      stackMenu.length--; //pop not supported by IE5-Mac
      stackItem.length--;
      // uncolor
      if (stackColored[i]) {stackColored[i].style.backgroundColor = clrOut; stackColored[i] = null;}
    }
    // reinit
    stackMenu = [0];
    stackItem = [0];
  }
}

function menOverTR(id_self,id_layer,iStyle) {
	// id_self        id of current table row (= this.id of event)
	// id_layer       id of child div (the layer to be shown)
	// iStyle         composite of style bits (optional), values see above
	var x = 0, y = 0;
	var elSelf=document.getElementById(id_self);
	var elLayer=document.getElementById(id_layer);
	fActive = true;
	// get cur menu DIV we're at: it's the next parent DIV. Works fine. Mac too.
	var parent = elSelf;
	while (parent.parentNode) {
		parent = parent.parentNode;
		if (parent.tagName == "DIV") {
			elemCurMenuAt = parent;
			break;
		}
	}
	// get cur level we're at: walk the level stack
	var onStack = false;
	curLevelAt++; //assume we go down
	for (i = 1; i < stackMenu.length; i++) {
		if (stackMenu[i] == elemCurMenuAt) {
			// the current menu is on the stack
			onStack = true;
			curLevelAt = i;
			break;
		}
	}
	// happens only on level 1 change
	if (!onStack) {
		curLevelAt = 1;
		stackMenu[curLevelAt] = elemCurMenuAt;
	}
	// cursor
	if (elemCurItem != elSelf) {
		if (elemCurItem) {elemCurItem.style.cursor = "Default";}
		elSelf.style.cursor = handcursor;
		elemCurItem = elSelf;
	}
	// colors
  	// uncolor prev
	if (stackColored[curLevelAt]) stackColored[curLevelAt].style.backgroundColor = clrOut;
  		// color this
		if (iStyle & cSkipColoring) {
			stackColored[curLevelAt] = null;
		} else {
			elSelf.style.backgroundColor = clrOver;
			stackColored[curLevelAt] = elSelf;
		}
		// if we got an item change at the current level
		if (curLevelAt <= stackItem.length) {
			if (typeof stackItem[curLevelAt] == "undefined") {
			  stackItem[curLevelAt] = ""; //is set to elSelf below anyway
			}
			if (stackItem[curLevelAt] != elSelf) {
				for (i = stackMenu.length - 1; i > curLevelAt; i--) {
				stackMenu[i].style.visibility = "hidden";
				stackMenu.length--; //pop not supported by IE5-Mac
				stackItem.length--;
				// uncolor
				if (stackColored[i]) {stackColored[i].style.backgroundColor = clrOut; stackColored[i] = null;}
			}
			if (elLayer) {
				stackMenu[curLevelAt+1] = elLayer; //push not supported by IE5-Mac
			}
		}
	}
	// update item stack
	stackItem[curLevelAt] = elSelf;

	if (elLayer) {
		// page pos of current element
		var offset = new getAbsoluteOffset(id_self);
		var winSize = new getBrowserWindowSize();
		// negotiate position
		// compensate the 1-pixel border of tables (class nav)
		var nav_paddingX = 0;
		var nav_paddingY = 0;
		if (iStyle & cPopDown) {
		  x = offset.x + nav_paddingX;
		  y = offset.y + nav_paddingY + elSelf.offsetHeight;
		} else {
		  x = offset.x + nav_paddingX + elSelf.offsetWidth;
		  y = offset.y + nav_paddingY;
		}
		// mind window right
		var overlapX = x + elLayer.offsetWidth - winSize.width - winSize.scrollX;
		if (overlapX > 0) {
		  //popout left
		  x = offset.x + nav_paddingX - 2 * nav_paddingX - elLayer.offsetWidth;
		  //x -= (elSelf.offsetWidth + elLayer.offsetWidth) + 2 * nav_paddingX;
		}
		// mind window left
		if (x < winSize.scrollX) x = winSize.scrollX;
		// mind window bottom
		var overlapY = y + elLayer.offsetHeight - winSize.height - winSize.scrollY;
		if (overlapY > 0) {
			//move upwards from here
			y = offset.y - nav_paddingY + elSelf.offsetHeight - elLayer.offsetHeight;
		}
		// mind window top
		if (y < winSize.scrollY) y = winSize.scrollY; //but not too far
		// finally realize it
		elLayer.style.zIndex = 20; //ensure on top
		elLayer.style.left = x + bw.px;
		elLayer.style.top = y + bw.px;
		elLayer.style.visibility = "visible";
	} else {
    // no layer
	}
}
function showDIV(id_self, id_layer, id_top){
	var winSize = new getBrowserWindowSize();
	var v=winSize.scrollY;
	var w=0;
	var x=0;
	var y=0;
	var z=0;
	var nav_paddingX = 1;
    var nav_paddingY = 1;
	var elSelf=document.getElementById(id_self);
	var elLayer=document.getElementById(id_layer);
	var elTop = document.getElementById(id_top);
	var offset = new getAbsoluteOffset(id_self);
	var offsetTop = new getAbsoluteOffset(id_top);
	if (!winSize.scrollY) v=0;
	w = offsetTop.y + elTop.offsetHeight;
	x = offset.x - nav_paddingX;
	y = offset.y - nav_paddingY - elLayer.offsetHeight;
	z = v + winSize.height - elLayer.offsetHeight;
	if ((z < y) && (z != 'NaN')) y = winSize.height + v - elLayer.offsetHeight;
	if (y < w) y = w + nav_paddingY;
	elLayer.style.zIndex = 20; //ensure on top
	elLayer.style.left = x + bw.px;
	elLayer.style.top = y + bw.px;
}

