/* =================================================================================================
 * Dropdown for www.ibt-gmbh.de
 *
 * Javascript library responsible for multi-level DHTML dropdown menus with transparency.
 * Copyright 2003-2004, Aaron Boodman (www.youngpup.net)
 * =================================================================================================
 * Use of this library is governed by the Creative Commons Attribution 2.0 License.
 * =================================================================================================
 * updates:
 * 04.19.04 fixed cascade problem with menus nested greater than two levels.
 * 12.23.03 added hideCurrent for menu actuators with no menus.
 * 04.18.03 fixed render bug in IE 5.0 Mac by removing that browser from compatibility table ;)
 *	    also made gecko check a little more strict by specifying build no.
 * 02.20.05 positioning of the dropdown-menu adapted to my sites (boehnert.com)
 * 14.09.05 bug fix for select-tag and others
 * 09.03.06 2 versions of the funcion toString() to avoid error messages in mozilla (MB)
 * =================================================================================================
 * Used by Marcel Boehnert with thanks to Aaron for a pretty good job.
 * =================================================================================================
 */
dd_.spacerGif="../img/dd-x.gif"; dd_.dingbatOn="../img/dd-on.gif"; dd_.dingbatOff="../img/dd-off.gif"; dd_.dingbatSize=14; dd_.menuPadding=10; dd_.itemPadding=3; dd_.shadowSize=2; dd_.shadowOffset= 3; dd_.shadowColor="#666";dd_.shadowPng="../img/dd-grey40.png"; dd_.backgroundColor="#F9FAF7"; dd_.backgroundPng="../img/dd-white90.png"; dd_.hideDelay=600; dd_.slideTime=400; dd_.reference={topLeft:1,topRight:2,bottomLeft:3,bottomRight:4}; dd_.direction={down:1,right:2}; dd_.registry=[]; dd_._maxZ=100; 
dd_.isSupported = function() { var ua = navigator.userAgent.toLowerCase(); var pf = navigator.platform.toLowerCase(); var an = navigator.appName; var r  = false; if (ua.indexOf("gecko") > -1 && navigator.productSub >= 20020605) r = true; else if (an == "Microsoft Internet Explorer") { if (document.getElementById) { if (pf.indexOf("mac") == 0) { r = /msie (\d(.\d*)?)/.test(ua) && Number(RegExp.$1) >= 5.1;} else r = true; }  } return r; }
dd_.initialize = function() { for (var i = 0, menu = null; menu = this.registry[i]; i++) { menu.initialize(); }  }
dd_.renderAll = function() { var aMenuHtml = []; for (var i = 0, menu = null; menu = this.registry[i]; i++) { aMenuHtml[i] = menu.toString(); } document.write(aMenuHtml.join("")); }

function dd_(oActuator, iDirection, iLeft, iTop, iReferencePoint, parentMenuSet) { this.addItem = addItem; this.addMenu = addMenu; this.toString = toString; this.initialize = initialize; this.isOpen = false; this.show = show; this.hide = hide; this.items = []; this.onactivate = new Function(); this.ondeactivate = new Function(); this.onmouseover = new Function(); this.onqueue = new Function(); this.ondequeue = new Function(); this.index = dd_.registry.length; dd_.registry[this.index] = this; var id = "dd_" + this.index; var contentHeight = null; var contentWidth = null; var childMenuSet = null; var animating = false; var childMenus = [];  var slideAccel = -1; var elmCache = null; var ready = false; var _this = this; var a = null; var pos = iDirection == dd_.direction.down ? "top" : "left"; var dim = null; 
function addItem(sText, sUrl) { var item = new dd_Item(sText, sUrl, this); item._index = this.items.length; this.items[item._index] = item; }
function addMenu(oMenuItem) { if (!oMenuItem.parentMenu == this) throw new Error("Cannot add a menu here"); if (childMenuSet == null) childMenuSet = new dd_Set(dd_.direction.right, -2, -6, dd_.reference.topRight); var m = childMenuSet.addMenu(oMenuItem); childMenus[oMenuItem._index] = m; m.onmouseover=child_mouseover; m.ondeactivate=child_deactivate; m.onqueue=child_queue; m.ondequeue=child_dequeue; return m; } 
function initialize() { initCache(); initEvents(); initSize(); ready = true; } 
function hideShowCovered(hidden) { var ua = navigator.userAgent.toLowerCase(); if (ua.indexOf("msie") == -1 && ua.indexOf("opera") == -1) return; function getVisib(obj) { var value = obj.style.visibility; if (!value) { if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { value = document.defaultView.getComputedStyle(obj, "").getPropertyValue("visibility"); } else if (obj.currentStyle) { value = obj.currentStyle.visibility; } else value = ''; } return value; }; function getAbsolutePos(el) { var r = { x: el.offsetLeft, y: el.offsetTop }; if (el.offsetParent) { var tmp = getAbsolutePos(el.offsetParent); r.x += tmp.x; r.y += tmp.y; } return r; } var tags = new Array("applet", "iframe", "select"); var p = getAbsolutePos(elmCache["clip"]); var EX1 = p.x; var EX2 = elmCache["clip"].offsetWidth + EX1; var EY1 = p.y; var EY2 = elmCache["clip"].offsetHeight + EY1; for (var k = tags.length; k > 0; ) { var ar = document.getElementsByTagName(tags[--k]); var cc = null; for (var i = ar.length; i > 0;) { cc = ar[--i]; var p = getAbsolutePos(cc); var CX1 = p.x; var CX2 = cc.offsetWidth + CX1; var CY1 = p.y; var CY2 = cc.offsetHeight + CY1; if (hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) { if (!cc.__msh_save_visibility) { cc.__msh_save_visibility = getVisib(cc); } cc.style.visibility = cc.__msh_save_visibility; } else { if (!cc.__msh_save_visibility) { cc.__msh_save_visibility = getVisib(cc); } cc.style.visibility = "hidden"; } } } } function show() { if (ready) { _this.isOpen = true; animating = true; setContainerPos(); elmCache["clip"].style.visibility = "visible"; elmCache["clip"].style.zIndex = dd_._maxZ++; slideStart(); _this.onactivate(); hideShowCovered(false); } }
function hide() { if (ready) { _this.isOpen = false; animating = true; for (var i = 0, item = null; item = elmCache.item[i]; i++) dehighlight(item); if (childMenuSet) childMenuSet.hide(); slideStart(); _this.ondeactivate(); hideShowCovered(true); } }
function setContainerPos() { var sub = oActuator.constructor == dd_Item; var act = sub ? oActuator.parentMenu.elmCache["item"][oActuator._index] : oActuator; var el  = act; var x = 0; var y = 0; var minX = 0; var maxX = (window.innerWidth ? window.innerWidth : document.body.clientWidth) - parseInt(elmCache["clip"].style.width); var minY = 0; var maxY = (window.innerHeight ? window.innerHeight : document.body.clientHeight) - parseInt(elmCache["clip"].style.height); while (sub ? el.parentNode.className.indexOf("DDM") == -1 : el.offsetParent) { x += el.offsetLeft; y += el.offsetTop; if (el.scrollLeft) x -= el.scrollLeft; if (el.scrollTop)  y -= el.scrollTop; el = el.offsetParent; } if (oActuator.constructor == dd_Item) { x += parseInt(el.parentNode.style.left); y += parseInt(el.parentNode.style.top); } else { if( document.getElementById("horizon") ) y -= document.getElementById("horizon").offsetTop; } switch (iReferencePoint) { case dd_.reference.topLeft: break; case dd_.reference.topRight: x += act.offsetWidth; break; case dd_.reference.bottomLeft: y += act.offsetHeight; break; case dd_.reference.bottomRight: x += act.offsetWidth; y += act.offsetHeight; break; } x += iLeft; y += iTop; x = Math.max(Math.min(x, maxX), minX); y = Math.max(Math.min(y, maxY), minY); elmCache["clip"].style.left = x + "px"; elmCache["clip"].style.top = y + "px"; } function slideStart() { var x0 = parseInt(elmCache["ddcontent"].style[pos]); var x1 = _this.isOpen ? 0 : -dim; if (a != null) a.stop(); a = new Accelimation(x0, x1, dd_.slideTime, slideAccel);  a.onframe = slideFrame; a.onend = slideEnd; a.start(); }
function slideFrame(x) { elmCache["ddcontent"].style[pos] = x + "px"; }
function slideEnd() { if (!_this.isOpen) elmCache["clip"].style.visibility = "hidden"; animating = false; }
function initSize() { var ow = elmCache["items"].offsetWidth; var oh = elmCache["items"].offsetHeight; var ua = navigator.userAgent.toLowerCase(); elmCache["clip"].style.width  = ow + dd_.shadowSize + 2 + "px"; elmCache["clip"].style.height = oh + dd_.shadowSize + 2 + "px"; elmCache["ddcontent"].style.width  = ow + dd_.shadowSize + "px"; elmCache["ddcontent"].style.height = oh + dd_.shadowSize + "px"; contentHeight = oh + dd_.shadowSize; contentWidth  = ow + dd_.shadowSize; dim = iDirection == dd_.direction.down ? contentHeight : contentWidth; elmCache["ddcontent"].style[pos] = -dim - dd_.shadowSize + "px"; elmCache["clip"].style.visibility = "hidden"; if (ua.indexOf("mac") == -1 || ua.indexOf("gecko") > -1) { elmCache["background"].style.width  = ow + "px"; elmCache["background"].style.height = oh + "px"; elmCache["background"].style.backgroundColor = dd_.backgroundColor; elmCache["shadowRight"].style.left   = ow + "px"; elmCache["shadowRight"].style.height = oh - (dd_.shadowOffset - dd_.shadowSize) + "px"; elmCache["shadowRight"].style.backgroundColor = dd_.shadowColor; elmCache["shadowBottom"].style.top   = oh + "px"; elmCache["shadowBottom"].style.width = ow - dd_.shadowOffset + "px";  elmCache["shadowBottom"].style.backgroundColor = dd_.shadowColor; }  else { elmCache["background"].firstChild.src = dd_.backgroundPng; elmCache["background"].firstChild.width = ow; elmCache["background"].firstChild.height = oh; elmCache["shadowRight"].firstChild.src = dd_.shadowPng; elmCache["shadowRight"].style.left = ow + "px"; elmCache["shadowRight"].firstChild.width  = dd_.shadowSize; elmCache["shadowRight"].firstChild.height = oh - (dd_.shadowOffset - dd_.shadowSize);  elmCache["shadowBottom"].firstChild.src = dd_.shadowPng; elmCache["shadowBottom"].style.top = oh + "px"; elmCache["shadowBottom"].firstChild.height = dd_.shadowSize; elmCache["shadowBottom"].firstChild.width  = ow - dd_.shadowOffset; } }
function initCache() { var menu = document.getElementById(id); var all = menu.all ? menu.all : menu.getElementsByTagName("*"); elmCache = {}; elmCache["clip"] = menu; elmCache["item"] = []; for (var i = 0, elm = null; elm = all[i]; i++) { switch (elm.className) { case "items": case "ddcontent": case "background": case "shadowRight": case "shadowBottom": elmCache[elm.className] = elm; break; case "item": elm._index = elmCache["item"].length; elmCache["item"][elm._index] = elm; break; } } _this.elmCache = elmCache; }
function initEvents() { for (var i = 0, item = null; item = elmCache.item[i]; i++) { item.onmouseover = item_mouseover; item.onmouseout = item_mouseout; item.onclick = item_click; } if (typeof oActuator.tagName != "undefined") { oActuator.onmouseover = actuator_mouseover; oActuator.onmouseout = actuator_mouseout; } elmCache["ddcontent"].onmouseover = content_mouseover; elmCache["ddcontent"].onmouseout = content_mouseout; }
function highlight(oRow) { oRow.className = "item hover"; if (childMenus[oRow._index])oRow.lastChild.firstChild.src = dd_.dingbatOn; }
function dehighlight(oRow) { oRow.className = "item"; if (childMenus[oRow._index]) oRow.lastChild.firstChild.src = dd_.dingbatOff; }
function item_mouseover() { if (!animating) { highlight(this); if (childMenus[this._index]) childMenuSet.showMenu(childMenus[this._index]); else if (childMenuSet) childMenuSet.hide(); } }
function item_mouseout() { if (!animating) { if (childMenus[this._index]) childMenuSet.hideMenu(childMenus[this._index]); else dehighlight(this); } }
function item_click() { if (!animating) { if (_this.items[this._index].url) location.href = _this.items[this._index].url; } }
function actuator_mouseover() { parentMenuSet.showMenu(_this); }
function actuator_mouseout() { parentMenuSet.hideMenu(_this); }
function content_mouseover() { if (!animating) { parentMenuSet.showMenu(_this); _this.onmouseover(); } }
function content_mouseout() { if(!animating) { parentMenuSet.hideMenu(_this); } }
function child_mouseover() { if (!animating) { parentMenuSet.showMenu(_this); } }
function child_deactivate() { for (var i = 0; i < childMenus.length; i++) { if (childMenus[i] == this) { dehighlight(elmCache["item"][i]); break; } } }
function child_queue() { parentMenuSet.hideMenu(_this); }
function child_dequeue() { parentMenuSet.showMenu(_this); }
function toString() { var aHtml = []; var sClassName = "DDM" + (oActuator.constructor != dd_Item ? " top" : ""); for (var i = 0, item = null; item = this.items[i]; i++) { aHtml[i] = item.toString(childMenus[i]); } if (window.attachEvent) { return '<div id="' + id + '" class="' + sClassName + '">' + '<div class="ddcontent"><table class="items" cellpadding="0" cellspacing="0" border="0">' + '<tr><td colspan="2" height="'+ dd_.menuPadding +'"></td></tr>' + aHtml.join('') + '<tr><td colspan="2"  height="'+ dd_.menuPadding +'"></td></tr></table>' + '<div class="shadowBottom" style="filter:alpha(opacity=40);"><img src="' + dd_.spacerGif + '" width="1" height="1"></div>' + '<div class="shadowRight" style="filter:alpha(opacity=40);"><img src="' + dd_.spacerGif + '" width="1" height="1"></div>' + '<div class="background" style="filter:alpha(opacity=80);"><img src="' + dd_.spacerGif + '" width="1" height="1"></div>' + '</div></div>'; } else { return '<div id="' + id + '" class="' + sClassName + '">' + '<div class="ddcontent"><table class="items" cellpadding="0" cellspacing="0" border="0">' + '<tr><td colspan="2" height="'+ dd_.menuPadding +'"></td></tr>' + aHtml.join('') + '<tr><td colspan="2"  height="'+ dd_.menuPadding +'"></td></tr></table>' + '<div class="shadowBottom" style="-moz-opacity:0.4;"><img src="' + dd_.spacerGif + '" width="1" height="1"></div>' + '<div class="shadowRight" style="-moz-opacity:0.4;"><img src="' + dd_.spacerGif + '" width="1" height="1"></div>' + '<div class="background" style="-moz-opacity:0.8;"><img src="' + dd_.spacerGif + '" width="1" height="1"></div>' + '</div></div>'; } } } dd_Set.registry = [];
function dd_Set(iDirection, iLeft, iTop, iReferencePoint) { this.addMenu = addMenu; this.showMenu = showMenu; this.hideMenu = hideMenu; this.hide = hide; this.hideCurrent = hideCurrent; var menus = []; var _this = this; var current = null; this.index = dd_Set.registry.length; dd_Set.registry[this.index] = this; 
function addMenu(oActuator) { var m = new dd_(oActuator, iDirection, iLeft, iTop, iReferencePoint, this); menus[menus.length] = m; return m; }
function showMenu(oMenu) { if (oMenu != current) { if (current != null) hide(current); current = oMenu; oMenu.show(); } else { cancelHide(oMenu); } }
function hideMenu(oMenu) { if (current == oMenu && oMenu.isOpen) { if (!oMenu.hideTimer) scheduleHide(oMenu); } }
function scheduleHide(oMenu) { oMenu.onqueue(); oMenu.hideTimer = window.setTimeout("dd_Set.registry[" + _this.index + "].hide(dd_.registry[" + oMenu.index + "])", dd_.hideDelay); }
function cancelHide(oMenu) { if (oMenu.hideTimer) { oMenu.ondequeue(); window.clearTimeout(oMenu.hideTimer); oMenu.hideTimer = null; } }
function hide(oMenu) { if (!oMenu && current) oMenu = current; if (oMenu && current == oMenu && oMenu.isOpen) { hideCurrent(); } }
function hideCurrent() { if (null != current) { cancelHide(current); current.hideTimer = null; current.hide(); current = null; } } }
function dd_Item(sText, sUrl, oParent) { this.toString 	= toString; this.text = sText; this.url = sUrl; this.parentMenu = oParent;
function toString(bDingbat) { var sDingbat = bDingbat ? dd_.dingbatOff : dd_.spacerGif; var iEdgePadding = dd_.itemPadding + dd_.menuPadding; var sPaddingLeft = "padding:" + dd_.itemPadding + "px; padding-left:" + iEdgePadding + "px;"; var sPaddingRight = "padding:" + dd_.itemPadding + "px; padding-right:" + iEdgePadding + "px;"; return '<tr class="item"><td nowrap style="' + sPaddingLeft + '">' + sText + '</td><td width="14" style="' + sPaddingRight + '">' + '<img src="' + sDingbat + '" width="14" height="14"></td></tr>'; } }
function Accelimation(from, to, time, zip) { if (typeof zip  == "undefined") zip = 0; if (typeof unit == "undefined") unit = "px"; this.x0 = from; this.x1	= to; this.dt = time; this.zip = -zip; this.unit = unit; this.timer = null; this.onend = new Function(); this.onframe = new Function(); }

Accelimation.prototype.start = function() { this.t0 = new Date().getTime(); this.t1 = this.t0 + this.dt; var dx  = this.x1 - this.x0; this.c1 = this.x0 + ((1 + this.zip) * dx / 3); this.c2 = this.x0 + ((2 + this.zip) * dx / 3);   Accelimation._add(this); }
Accelimation.prototype.stop = function() { Accelimation._remove(this); }
Accelimation.prototype._paint = function(time) { if (time < this.t1) { var elapsed = time - this.t0; this.onframe( Accelimation._getBezier( elapsed/this.dt, this.x0, this.x1, this.c1, this.c2 ) ); } else this._end(); }
Accelimation.prototype._end = function() { Accelimation._remove(this); this.onframe(this.x1); this.onend(); }
Accelimation._add = function(o) { var index = this.instances.length; this.instances[index] = o; if (this.instances.length == 1) { this.timerID = window.setInterval("Accelimation._paintAll()", this.targetRes); } }
Accelimation._remove = function(o) { for (var i = 0; i < this.instances.length; i++) { if (o == this.instances[i]) { this.instances = this.instances.slice(0,i).concat( this.instances.slice(i+1) ); break; } } if (this.instances.length == 0) { window.clearInterval(this.timerID); this.timerID = null; } }
Accelimation._paintAll = function() { var now = new Date().getTime(); for (var i = 0; i < this.instances.length; i++) { this.instances[i]._paint(now); } }
Accelimation._B1 = function(t) { return t*t*t };
Accelimation._B2 = function(t) { return 3*t*t*(1-t) };
Accelimation._B3 = function(t) { return 3*t*(1-t)*(1-t) };
Accelimation._B4 = function(t) { return (1-t)*(1-t)*(1-t) };
Accelimation._getBezier = function( percent, startPos, endPos, control1, control2 ) { return endPos * this._B1(percent) + control2 * this._B2(percent) + control1 * this._B3(percent) + startPos * this._B4(percent); } 
Accelimation.instances = []; Accelimation.targetRes = 10; Accelimation.timerID = null; 
if (window.attachEvent) { var cearElementProps = [ 'data', 'onmouseover', 'onmouseout', 'onmousedown', 'onmouseup', 'ondblclick', 'onclick', 'onselectstart', 'oncontextmenu' ]; window.attachEvent( "onunload", function() { var el; for( var d = document.all.length ; d--; ) { el = document.all[d]; for( var c = cearElementProps.length ; c--; ) { el[ cearElementProps[c] ] = null; } } } ); }
