// Umwandlung von Kommaseparierten Zahlen in Punkt-separieten Zahlen
function jsChangeFormat( object_value )
{
	var n = "";
	var nRet = 0;

	for (var i = 0; i < object_value.length; i++)
	{
		if( object_value.charAt(i) == ",")
			n = n + ".";
		else if( object_value.charAt(i) == " ")
			n = n;
		else
			n = n + object_value.charAt(i);
	}

	return n;
}

function MM_setTextOfLayer(objName,x,newText) { //v4.01

  if ((obj=MM_findObj(objName))!=null) with (obj)

    if (document.layers) {document.write(unescape(newText)); document.close();}

    else innerHTML = unescape(newText);

}


function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_nbGroup(event, grpName) { //v6.0
  var i,img,nbArr,args=MM_nbGroup.arguments;
  if (event == "init" && args.length > 2) {
    if ((img = MM_findObj(args[2])) != null && !img.MM_init) {
      img.MM_init = true; img.MM_up = args[3]; img.MM_dn = img.src;
      if ((nbArr = document[grpName]) == null) nbArr = document[grpName] = new Array();
      nbArr[nbArr.length] = img;
      for (i=4; i < args.length-1; i+=2) if ((img = MM_findObj(args[i])) != null) {
        if (!img.MM_up) img.MM_up = img.src;
        img.src = img.MM_dn = args[i+1];
        nbArr[nbArr.length] = img;
    } }
  } else if (event == "over") {
    document.MM_nbOver = nbArr = new Array();
    for (i=1; i < args.length-1; i+=3) if ((img = MM_findObj(args[i])) != null) {
      if (!img.MM_up) img.MM_up = img.src;
      img.src = (img.MM_dn && args[i+2]) ? args[i+2] : ((args[i+1])? args[i+1] : img.MM_up);
      nbArr[nbArr.length] = img;
    }
  } else if (event == "out" ) {
    for (i=0; i < document.MM_nbOver.length; i++) {
      img = document.MM_nbOver[i]; img.src = (img.MM_dn) ? img.MM_dn : img.MM_up; }
  } else if (event == "down") {
    nbArr = document[grpName];
    if (nbArr)
      for (i=0; i < nbArr.length; i++) { img=nbArr[i]; img.src = img.MM_up; img.MM_dn = 0; }
    document[grpName] = nbArr = new Array();
    for (i=2; i < args.length-1; i+=2) if ((img = MM_findObj(args[i])) != null) {
      if (!img.MM_up) img.MM_up = img.src;
      img.src = img.MM_dn = (args[i+1])? args[i+1] : img.MM_up;
      nbArr[nbArr.length] = img;
  } }
}


function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

// MouseOver-Funktion für Tabellenzeilen
function mOvrOut(zelle,bgfarbe,bfarbe) {
	if (document.layers) zelle = document.zelle;
	else if (document.all) zelle = zelle.style;
	zelle.backgroundColor = bgfarbe;
	zelle.borderColor = bfarbe;
}

// Layersteuerung für Iconnavigation
function MM_showHideLayers() { //v3.0
  var i,p,v,obj,args=MM_showHideLayers.arguments;
  for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
    if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v='hide')?'hidden':v; }
    obj.visibility=v; }
}


// ToolTip Version 1 ====================================================================================================
var ie = document.all ? 1 : 0
var ns = document.layers ? 1 : 0

if(ns){doc = "document."; sty = ""}
if(ie){doc = "document.all."; sty = ".style"}



var initialize = 0
var Ex, Ey, topColor, subColor, ContentInfo


if(ie){
Ex = "event.x"
Ey = "event.y";

subColor = "##ffffff"
}

if(ns){
Ex = "e.pageX"
Ey = "e.pageY"
window.captureEvents(Event.MOUSEMOVE)
window.onmousemove=overhere

subColor = "##DAE6C4"
}



function MoveToolTip(layerName, FromTop, FromLeft, e){
if(ie){eval(doc + layerName + sty + ".top = "  + ((eval(FromTop)-60) + document.body.scrollTop))}
if(ns){eval(doc + layerName + sty + ".top = "  +  eval(FromTop))}
eval(doc + layerName + sty + ".left = " + (eval(FromLeft) + 15))
}

function ReplaceContent(layerName){

if(ie){document.all[layerName].innerHTML = ContentInfo}


if(ns){

with(document.layers[layerName].document) 
{ 
   open(); 
   write(ContentInfo); 
   close(); 
}

}


}



function Activate(){initialize=1}
function deActivate(){initialize=0}


function overhere(e){
if(initialize){

MoveToolTip("ToolTip", Ey, Ex, e)
eval(doc + "ToolTip" + sty + ".visibility = 'visible'")
}

else{
MoveToolTip("ToolTip", 0, 0)
eval(doc + "ToolTip" + sty + ".visibility = 'hidden'")
}


}

function EnterContent(layerName, TTeaser, TContent){

ContentInfo = '<table border="0" width="250" cellspacing="0" cellpadding="2" class="frametable">'+
'<tr><td class="formdescription">'+ TTeaser+'</td></tr>'+
'<tr><td class="whitetd">'+TContent+'</td></tr></table>';


ReplaceContent(layerName)

}

// ToolTip Version domTT ====================================================================================================

var domTT_offsetX = 10;
var domTT_offsetY = -20;
var domTT_direction = 'southeast';
var domTT_mouseHeight = 20;
var domTT_closeLink = 'X';
var domTT_screenEdgePadding = 5;
var domTT_activateDelay = 100;
var domTT_maxWidth = 300;
var domTT_dragStickyTips = true;
var domTT_useGlobalMousePosition = true;
var domTT_prefix = 'domTT';
var domTT_fade = 'neither';
var domTT_lifetime = 0;
var domTT_grid = 0;
var domTT_onClose = 'hide';

// }}}
// {{{ Global constants

/**
 * Global constants (DO NOT EDIT)
 */
var domTT_userAgent = navigator.userAgent.toLowerCase();
var domTT_isOpera = domTT_userAgent.indexOf('opera 7') != -1 ? 1 : 0;
var domTT_isKonq = domTT_userAgent.indexOf('konq') != -1 ? 1 : 0;
var domTT_isIE = !domTT_isKonq && !domTT_isOpera && document.all ? 1 : 0;
var domTT_isGecko = domTT_userAgent.indexOf('gecko') != -1 ? 1 : 0;
var domTT_useLibrary = domTT_isOpera || domTT_isKonq || domTT_isIE || domTT_isGecko ? 1 : 0;
var domTT_autoID = 1;
var domTT_zIndex = 100;
var domTT_scrollbarWidth = 14;
var domTT_hidePosition = '-1000px';
var domTT_cssFloat = domTT_isIE ? 'float' : 'cssFloat';
var domTT_eventTarget = domTT_isIE ? 'srcElement' : 'currentTarget';
var domTT_eventButton = domTT_isIE ? 'button' : 'which';
var domTT_eventTo = domTT_isIE ? 'toElement' : 'relatedTarget';
var domTT_styleOpacity = domTT_isIE ? 'filter' : 'MozOpacity';
var domTT_stylePointer = domTT_isIE ? 'hand' : 'pointer';
var domTT_predefined = new domTT_Hash();
var domTT_selectElements;
var domTT_activateTimeouts = new domTT_Hash();
var domTT_dragMouseDown;
var domTT_dragOffsetLeft;
var domTT_dragOffsetTop;
var domTT_currentDragTarget;
var domTT_fadeInterval = domTT_isIE ? 10 : 40;
var domTT_fadeTimeouts = new domTT_Hash();

// }}}
// {{{ Global onmousemove

if (domTT_useGlobalMousePosition) {
    document.onmousemove = function(in_event) {
        var eventObj = domTT_isIE ? event : in_event;
        domTT_currentMousePosition = domTT_getEventPosition(eventObj);    
        domTT_dragUpdate(in_event);
    }
}

// }}}
// {{{ class domTT_Hash()

function domTT_Hash()
{
    this.length = 0;
    this.undefined;
    this.items = new Array();
    for (var i = 0; i < arguments.length; i += 2) {
        if (arguments[i + 1] != this.undefined) {
            this.items[arguments[i]] = arguments[i + 1];
            this.length++;
        }
    }

    this.getItem = function(in_key)
    {
        return this.items[in_key];
    }

    this.removeItem = function(in_key)
    {
        if (this.items[in_key] != this.undefined) {
            this.length--;
            var tmp_value = this.items[in_key];
            delete this.items[in_key];
            return tmp_value;
        }
    }

    this.setItem = function(in_key, in_value)
    {
        if (in_value != this.undefined) {
            if (this.items[in_key] == this.undefined) {
                this.length++;
            }
            
            return this.items[in_key] = in_value;
        }
    }
    
    this.hasItem = function(in_key)
    {
        return this.items[in_key] != this.undefined;
    }
}

// }}}
// {{{ domTT_activate()

function domTT_activate(in_this, in_event)
{
    if (!domTT_useLibrary) { return true; }

    // get the unified event object and necessary event variables
    // since IE does not support the currentTarget, we have to use the 'this' reference
    var eventObj = domTT_isIE ? event : in_event;
    var triggerObj = domTT_isIE ? in_this : (eventObj.currentTarget.nodeType == 9 ? document.body : eventObj.currentTarget);

    // preserve the original mouseout event for this target object since we are overwriting it
    if (triggerObj.getAttribute('domTT_onmouseout') === '') {
        var tmp_mouseout = triggerObj.onmouseout ? triggerObj.onmouseout.toString().replace(/\n/g, ' ').replace(/^ *function .*?\{(.*)\} *$/, '$1') : null;
        triggerObj.setAttribute('domTT_onmouseout', tmp_mouseout);
    }

    var eventType = eventObj.type;
    var activeTip = triggerObj.getAttribute('domTT_activeTip');

    // if the tip is already active and this is a mouseover, don't react
    if (eventType == 'mouseover' && activeTip == 'greasy') {
        return true;
    }

    // setup the options hash from the arguments
    var options = new domTT_Hash(
        'caption',    '',
        'content',    '',
        'closeLink',  domTT_closeLink,
        'parent',     document.body,
        'position',   'absolute',
        'type',       'greasy',
        'direction',  domTT_direction,
        'delay',      domTT_activateDelay,
        'prefix',     domTT_prefix,
        'onClose',    domTT_onClose,
        'lifetime',   domTT_lifetime,
        'grid',       domTT_grid,
        'fade',       domTT_fade
    );

    // load in the predefined options if specified
    if (arguments[2] == 'predefined' && domTT_predefined.hasItem(arguments[3])) {
        var predefinedOptions = domTT_predefined.items[arguments[3]];
        for (var i in predefinedOptions.items) {
            options.setItem(i, predefinedOptions.items[i]);
        }
    }

    // load in the options from the function call
    for (var i = 2; i < arguments.length; i += 2) {
        options.setItem(arguments[i], arguments[i + 1]);
    }

    // add the event items into the hash
    options.setItem('triggerObj', triggerObj);
    options.setItem('eventType', eventType);

    // don't do anything if sticky tip is active and this is not a sticky tip
    // or if this is a greasy tip and another tip (like velcro) is active
    if ((activeTip == 'sticky' && options.items['type'] != 'sticky') ||
        (activeTip && activeTip != 'greasy' && options.items['type'] == 'greasy')) {
        return true;
    }

    // immediately set the status text if provided
    if (options.hasItem('status')) {
        window.status = options.items['status'];
    }

    // if we didn't give content...assume we just wanted to change the status and return
    if (options.items['content'] == '') {
        triggerObj.onmouseout = function() { domTT_mouseout(triggerObj); };
        return true;
    }

    // make sure we have a unique id, and handle case when there isn't one
    var tmp_uniqueID
    if (!(tmp_uniqueID = triggerObj.id)) {
        triggerObj.id = tmp_uniqueID = 'domTT__id' + domTT_autoID++;
    }

    // set the id option in the hash which will be used to label our tip
    var tmp_prefix = 'domTT:' + options.items['type'] + ':';
    options.setItem('id', tmp_prefix + tmp_uniqueID);

    // check for a cached tooltips on this object (can't have two at a time)
    var tipIsActive = (activeTip == options.items['type']);
    var tipObj = document.getElementById(options.items['id']);
    var altTipIsActive = (!tipIsActive && activeTip);
    var altTipObj = altTipIsActive ? document.getElementById('domTT:' + activeTip + ':' + tmp_uniqueID) : false;

    // if there is a delay to create, we have to make sure we cancel that tip creation
    // if we mouseout before it happens **this must be here**
    triggerObj.onmouseout = function(in_event) { domTT_mouseout(triggerObj, this, in_event, tipObj); };

    // set the update delay, which is 0 if tip exists or this is a mouse button event
    options.items['delay'] = (tipIsActive || eventType.match(/click|mousedown|contextmenu/i)) ? 0 : parseInt(options.items['delay']);

    // get the mouse x and y coordinates as the bottom right edge of target for Konq
    var eventPositionSet = false;
    if (options.items['position'] == 'absolute') {
        if (options.hasItem('x') && options.hasItem('y')) {
            eventPositionSet = true;
            var mouse_x = parseInt(options.items['x']);
            var mouse_y = parseInt(options.items['y']);
        }
        else if (domTT_isKonq && eventType == 'click') {
            var tmp_position = domTT_getOffsets(triggerObj);
            eventPositionSet = true;
            var mouse_x = tmp_position.items['right'];
            var mouse_y = tmp_position.items['bottom'];
        }
        // get the event location unless mouseover, then later
        else if (options.items['delay'] == 0 || !domTT_useGlobalMousePosition) {
            var eventPosition = domTT_getEventPosition(eventObj);
            eventPositionSet = true;
            var mouse_x = eventPosition.items['x'];
            var mouse_y = eventPosition.items['y'];
        }
    }
    // we don't need a mouse_x, mouse_y for relative positioning
    else {
        eventPositionSet = true;
        var mouse_x;
        var mouse_y;
    }

    // {{{ create tip if not exists

    // either there is no tooltip for this id, or we are changing our tooltip type
    // and we are going to need to recreate the tooltip with the new type
    if (!tipObj) {
        // we check if tipObj already exists and hide it in the case where we are changing type
        if (domTT_isKonq || options.items['delay'] == 0) {
            domTT_deactivate(altTipObj, false); 
            domTT_create(mouse_x, mouse_y, options); 
        }
        else {
            domTT_activateTimeouts.setItem(domTT_activateTimeouts.length, setTimeout(function() { 
                domTT_deactivate(altTipObj, false);
                // if this is a delay, get the current mouse position
                if (!eventPositionSet) {
                    mouse_x = domTT_currentMousePosition.items['x'];
                    mouse_y = domTT_currentMousePosition.items['y'];
                }
                domTT_create(mouse_x, mouse_y, options); 
            }, options.items['delay']));
        }

        return options.items['id'];
    }

    // }}}
    // {{{ show tip if exists

    if (options.items['delay'] == 0 || domTT_isKonq || tipIsActive) {
        domTT_deactivate(altTipObj, false);
        domTT_show(mouse_x, mouse_y, options, tipObj, tipIsActive);
    }
    else {
        domTT_activateTimeouts.setItem(domTT_activateTimeouts.length, setTimeout(function() {
            domTT_deactivate(altTipObj, false);
            // if this is a delay, get the coordinates after the delay
            if (!eventPositionSet) {
                mouse_x = domTT_currentMousePosition.items['x'];
                mouse_y = domTT_currentMousePosition.items['y'];
            }
            domTT_show(mouse_x, mouse_y, options, tipObj, tipIsActive);
        }, options.items['delay']));
    }
    
    return options.items['id'];
    
    // }}}
}

// }}}
// {{{ domTT_create()

function domTT_create(in_x, in_y, in_options)
{
    var tipObj = document.createElement('div');
    tipObj.className = in_options.items['prefix'];
    tipObj.id = in_options.items['id'];
    tipObj.style.position = in_options.items['position'];
    tipObj.style.visibility = 'hidden';
    // give tooltip plenty of room to render if we are absolutely placing it
    if (in_options.items['position'] == 'absolute') {
        tipObj.style.left = 0;
        tipObj.style.top = 0;
    }

    tipObj.setAttribute('domTT_onClose', in_options.items['onClose']);
    tipObj.setAttribute('domTT_eventX', in_x);
    tipObj.setAttribute('domTT_eventY', in_y);
    tipObj.setAttribute('domTT_fade', in_options.items['fade']);
    tipObj.setAttribute('domTT_triggerID', in_options.items['triggerObj'].id);
    if (in_options.items['caption'] || (in_options.items['type'] == 'sticky' && in_options.items['caption'] !== false)) {
        var tmp_captionBox = document.createElement('div');
        tmp_captionBox.className = in_options.items['prefix'] + 'Caption';
        var tmp_caption = document.createElement('span');
        if (in_options.items['type'] == 'sticky') {
            tmp_caption.style[domTT_cssFloat] = 'left';
        }

        tmp_caption.appendChild(document.createTextNode(in_options.items['caption']));
        tmp_captionBox.appendChild(tmp_caption);
        if (in_options.items['type'] == 'sticky') {
            tmp_close = document.createElement('span');
            if (!domTT_isIE) {
                tmp_close.style[domTT_cssFloat] = 'right';
            }

            tmp_close.style.cursor = domTT_stylePointer;
            if (typeof(in_options.items['closeLink']) == 'string') {
                tmp_close.appendChild(document.createTextNode(in_options.items['closeLink']));
            }
            else {
                tmp_close.appendChild(in_options.items['closeLink'].cloneNode(1));
            }

            tmp_close = tmp_captionBox.appendChild(tmp_close);
            // this will get lost in the IE hack, so don't waste time here
            if (!domTT_isIE) {
                tmp_close.onclick = function() { domTT_deactivate(tipObj); };
                tmp_close.onmousedown = function(in_event) { in_event.cancelBubble = true; };
            }

            tmp_break = document.createElement('br');
            tmp_break.style.clear = 'both';
            tmp_captionBox.appendChild(tmp_break);
        }
        tipObj.appendChild(tmp_captionBox);
    }

    var tmp_content = document.createElement('div');
    if (in_options.items['content'].nodeType) {
        tmp_content.appendChild(in_options.items['content']);
    }
    else {
        tmp_content.innerHTML = in_options.items['content'];
    }

    tmp_content.className = in_options.items['prefix'] + 'Content';
    tipObj.appendChild(tmp_content);
    tipObj = in_options.items['parent'].appendChild(tipObj);

    // {{{ IE workarounds for float

    // ** nasty hack for IE to get the float working right **
    if (domTT_isIE && in_options.items['caption'] !== false) {
        var tmp_oldWidth = tipObj.offsetWidth;
        if (in_options.items['type'] == 'sticky') {
            tipObj.firstChild.firstChild.nextSibling.style[domTT_cssFloat] = 'right';
        }

        tipObj.innerHTML = tipObj.innerHTML;
        tipObj.style.width = tmp_oldWidth + 'px';
        if (in_options.items['type'] == 'sticky') {
            var tmp_close = tipObj.firstChild.firstChild.nextSibling;
            tmp_close.onclick = function() { domTT_deactivate(tipObj); };
            tmp_close.onmousedown = function() { event.cancelBubble = true; };
        }
    }

    // }}}

    // adjust the width if specified (override the max-width here)
    if (in_options.hasItem('width')) {
        tipObj.style.maxWidth = 'none';
        tipObj.style.width = parseInt(in_options.items['width']) + 'px';
    }
    // ** fix lack of maxWidth in CSS for Konq and IE **
    else if (domTT_maxWidth && (domTT_isIE || domTT_isKonq)) {
        if (tipObj.offsetWidth > domTT_maxWidth) {
            tipObj.style.width = domTT_maxWidth + 'px';
        }
    }

    if (in_options.items['type'] == 'sticky') {
        if (in_options.items['position'] == 'absolute' && domTT_dragStickyTips) {
            if (domTT_isIE) {
                tipObj.firstChild.onselectstart = function() { return false; };
            }

            // no drag for konqueror yet
            if (!domTT_isKonq) {
                tipObj.firstChild.onmousedown = function(in_event) { domTT_dragStart(in_event);  };
                tipObj.firstChild.onmousemove = function(in_event) { domTT_dragUpdate(in_event); };
                tipObj.firstChild.onmouseup = function(in_event) { domTT_dragStop(in_event); };
            }
        }
    }
    else if (in_options.items['type'] == 'velcro') {
        tipObj.onmouseout = function(in_event) { domTT_mouseout(false, tipObj, in_event, tipObj); };
    }
    else {
        tipObj.onmouseover = function() { domTT_deactivate(tipObj); };
    }
    
    domTT_show(in_x, in_y, in_options, tipObj, false);
}

// }}}
// {{{ domTT_show()

function domTT_show(in_x, in_y, in_options, in_tipObj, in_visible)
{
    // if the tip is visible and we are using the grid, then make sure we have moved to
    // the next grid slot before we move the tooltip
    if (!in_visible || !in_options.items['grid'] || Math.abs(in_tipObj.getAttribute('domTT_eventX') - in_x) > in_options.items['grid'] || Math.abs(in_tipObj.getAttribute('domTT_eventY') - in_y) > in_options.items['grid']) {
        in_tipObj.setAttribute('domTT_eventX', in_x);
        in_tipObj.setAttribute('domTT_eventY', in_y);
    }
    else {
        return;
    }

    if (in_options.items['position'] == 'absolute') {
        // if konqueror does a click, don't use the offset since we are using the right edge
        // of the target element to place the tootip
        if (domTT_isKonq && in_options.items['eventType'] == 'click') {
            var tmp_offsetX = 0;
            var tmp_offsetY = 0;
        }
        else {
            var tmp_offsetX = domTT_offsetX;
            var tmp_offsetY = domTT_offsetY;
        }

        // place the tip in the direction relative to the pointer
        switch (in_options.items['direction']) {
            case 'northeast':
                var tip_x = in_x + tmp_offsetX;
                var tip_y = in_y - in_tipObj.offsetHeight - tmp_offsetY;
            break;
            case 'northwest':
                var tip_x = in_x - in_tipObj.offsetWidth - tmp_offsetX;
                var tip_y = in_y - in_tipObj.offsetHeight - tmp_offsetY;
            break;
            case 'southwest':
                var tip_x = in_x - in_tipObj.offsetWidth - tmp_offsetX;
                var tip_y = in_y + domTT_mouseHeight + tmp_offsetY;
            break;
            case 'southeast':
                var tip_x = in_x + tmp_offsetX;
                var tip_y = in_y + domTT_mouseHeight + tmp_offsetY;
            break;
        }

        var tipCoordinates = domTT_correctEdgeBleed(in_tipObj.offsetWidth, in_tipObj.offsetHeight, tip_x, tip_y, tmp_offsetX, tmp_offsetY, in_options.items['type']);

        // update the position
        in_tipObj.style.left = tipCoordinates[0] + 'px';
        in_tipObj.style.top = tipCoordinates[1] + 'px';
    }

    // increase the tip zIndex so it goes over previously shown tips
    in_tipObj.style.zIndex = domTT_zIndex++;

    // specify that this tip is now active and show the tip
    in_options.items['triggerObj'].setAttribute('domTT_activeTip', in_options.items['type']);
    in_tipObj.style.visibility = 'visible';

    // check to see if we are fading the tip
    if (domTT_isIE || domTT_isGecko) {
        var tmp_fade = in_options.items['fade'];
        if (tmp_fade == 'out' || tmp_fade == 'both') {
            clearTimeout(domTT_fadeTimeouts.items[in_options.items['id']]);
        }

        if (tmp_fade == 'in' || tmp_fade == 'both') {
            if (!in_visible) {
                in_tipObj.style[domTT_styleOpacity] = domTT_isIE ? 'alpha(opacity=0)' : '0%';
            }

            domTT_fadeTimeouts.setItem(in_options.items['id'], setTimeout(function() { domTT_doFade(in_tipObj, 'in'); }, domTT_fadeInterval));
        }
        else {
            in_tipObj.style[domTT_styleOpacity] = domTT_isIE ? 'alpha(opacity=100)' : '100%';
        }
    }

    // update the mouseout for sticky tips
    if (in_options.items['type'] == 'sticky') {
        in_options.items['triggerObj'].onmouseout = function() { domTT_mouseout(in_options.items['triggerObj']); };
    }
    else if (in_options.items['type'] == 'velcro') {
        in_options.items['triggerObj'].onmouseout = function() { domTT_mouseout(in_options.items['triggerObj']); };
    }
    else {
        in_options.items['triggerObj'].onmouseout = function(in_event) { domTT_mouseout(in_options.items['triggerObj'], this, in_event, in_tipObj); };
        if (in_options.items['lifetime']) {
            clearTimeout(in_tipObj.getAttribute('domTT_lifetime'));
            in_tipObj.setAttribute('domTT_lifetime', setTimeout(function() { domTT_deactivate(in_tipObj); }, in_options.items['lifetime']));
        }
    }

    if (in_options.items['position'] == 'absolute') {
        domTT_detectCollisions(in_tipObj);
    }
}

// }}}
// {{{ domTT_doFade()

function domTT_doFade(in_object, in_direction) {
    var matches = in_object.style[domTT_styleOpacity].match(/[0-9]+/);
    var opacity = new Number(matches[0]);
    if (in_direction == 'in') {
        if (opacity < 100) {
            var nextOpacity = Math.min(100, opacity + 10);
        }
        else {
            return;
        }
    }
    else {
        if (opacity > 0) {
            var nextOpacity = Math.max(0, opacity - 10);
        }
        else {
            in_object.style.visibility = 'hidden';
            return;
        }
    }

    in_object.style[domTT_styleOpacity] = domTT_isIE ? 'alpha(opacity=' + nextOpacity + ')' : nextOpacity + '%';
    domTT_fadeTimeouts.setItem(in_object.id, setTimeout(function() { domTT_doFade(in_object, in_direction); }, domTT_fadeInterval));
}

// }}}
// {{{ domTT_mouseout()

function domTT_mouseout(in_triggerObj, in_this, in_event, in_tipObj)
{
    if (typeof(in_this) != 'undefined') {
        var triggerObj = domTT_isIE || !in_triggerObj ? in_this : in_event.currentTarget;
        var eventRelatedTarget = domTT_isIE ? event.toElement : in_event.relatedTarget;
        // check to see if the target we are entering is a descendant of the trigger element
        if (!domTT_isDescendantOf(eventRelatedTarget, triggerObj)) {
            domTT_deactivate(in_tipObj);
        }
    }
    
    if (in_triggerObj) {
        eval(in_triggerObj.getAttribute('domTT_onmouseout'));
    }
    
    window.status = window.defaultStatus;
}

// }}}
// {{{ domTT_deactivate()

function domTT_deactivate(in_tipObj, in_recoverState)
{
    if (typeof(in_recoverState) == 'undefined') {
        in_recoverState = true;
    }

    // clear any scheduled tooltip activations
    for (var i in domTT_activateTimeouts.items) {
        clearTimeout(domTT_activateTimeouts.items[i]);
        domTT_activateTimeouts.removeItem(i);
    }

    if (in_tipObj) {
        // [!] hack to disable IFRAME content in opera, since it won't hide it [!]
        if (domTT_isOpera && in_tipObj.lastChild.firstChild.tagName == 'IFRAME') {
            in_tipObj.style.top = domTT_hidePosition;
        }

        // clear the activeTip type
        document.getElementById(in_tipObj.getAttribute('domTT_triggerID')).setAttribute('domTT_activeTip', '');
        if (in_tipObj.getAttribute('domTT_onClose') == 'hide') {
            if ((domTT_isIE || domTT_isGecko) && (in_tipObj.getAttribute('domTT_fade') == 'out' || in_tipObj.getAttribute('domTT_fade') == 'both')) {
                clearTimeout(domTT_fadeTimeouts.items[in_tipObj.id]);
                domTT_fadeTimeouts.setItem(in_tipObj.id, setTimeout(function() { domTT_doFade(in_tipObj, 'out'); }, domTT_fadeInterval));
            }
            else {
                in_tipObj.style.visibility = 'hidden';
            }
        }
        else {
            // [!] might want warning here if contents are an IFRAME [!]
            in_tipObj.parentNode.removeChild(in_tipObj);
        }
        
        // unhide all of the selects if recover selects is true or not give
        // recover selects is the second option to domTT_deactivate()
        // don't need to do it if we are opera
        if (!domTT_isOpera && in_recoverState) {
            domTT_selectElements = document.getElementsByTagName('select');
            for (var cnt = 0; cnt < domTT_selectElements.length; cnt++) {
                if (domTT_isGecko && domTT_selectElements[cnt].size <= 1 && !domTT_selectElements[cnt].multiple) {
                    continue;
                }

                domTT_selectElements[cnt].style.visibility = 'visible';
            }
        }
    }
}

// }}}
// {{{ domTT_isActive()

function domTT_isActive(in_id)
{
    if (!in_id) {
        return false;
    }

    var tooltipObj = typeof(in_id) == 'object' ? in_id : document.getElementById(in_id);
    if (tooltipObj && tooltipObj.style.visibility == 'visible') {
        return tooltipObj;
    }
    else {
        return false;
    }
}

// }}}
// {{{ domTT_addPredefined()

function domTT_addPredefined(in_id)
{
    var options = new domTT_Hash();
    for (var i = 1; i < arguments.length; i += 2) {
        options.setItem(arguments[i], arguments[i + 1]);
    }

    domTT_predefined.setItem(in_id, options);
}

// }}}
// {{{ domTT_correctEdgeBleed()

function domTT_correctEdgeBleed(in_width, in_height, in_x, in_y, in_offsetX, in_offsetY, in_type)
{
    var bleedRight;
    var bleedBottom;
    var pageYOffset = domTT_isIE ? document.body.scrollTop : window.pageYOffset;
    var pageXOffset = domTT_isIE ? document.body.scrollLeft : window.pageXOffset;
    // we are bleeding off the right, move tip over to stay on page
    if ((bleedRight = (in_x - pageXOffset) + in_width - (document.body.clientWidth - domTT_screenEdgePadding)) > 0) {
        in_x -= bleedRight;
    }

    // we are bleeding to the left, move tip over to stay on page
    // we don't want an 'else if' here, because if it doesn't fit we will bleed off the right
    if ((in_x - pageXOffset) < domTT_screenEdgePadding) {
        in_x = domTT_screenEdgePadding + pageXOffset;
    }
    
    // ** top/bottom corrections depends on type, because we can't end up with the mouse over
    // the tip if this is a greasy **
    // if we are bleeding off the bottom, flip to north
    if ((bleedBottom = (in_y - pageYOffset) + in_height - (document.body.clientHeight - domTT_screenEdgePadding)) > 0) {
        if (in_type == 'sticky') {
            in_y -= bleedBottom;
        }
        else {
            in_y -= in_height + (2 * in_offsetY) + domTT_mouseHeight;
        }
    }

    // if we are bleeding off the top, flip to south
    // we don't want an 'else if' here, because if we just can't fit it, bleed off the bottom
    if ((in_y - pageYOffset) < domTT_screenEdgePadding) {
        if (in_type == 'sticky') {
            in_y = domTT_screenEdgePadding + pageYOffset;
        }
        else {
            in_y += in_height + (2 * in_offsetY) + domTT_mouseHeight;
        }
    }
    
    return new Array(in_x, in_y);
}

// }}}
// {{{ domTT_detectCollisions()

function domTT_detectCollisions(in_tipObj)
{
    // no need to do anything for opera
    if (domTT_isOpera) {
        return;
    }

    if (typeof(domTT_selectElements) == 'undefined') {
        domTT_selectElements = document.getElementsByTagName('select');
    }
    
    var tipOffsets = domTT_getOffsets(in_tipObj);

    for (var cnt = 0; cnt < domTT_selectElements.length; cnt++) {
        var thisSelect = domTT_selectElements[cnt];
        // mozilla doesn't have a problem with regular selects
        if (domTT_isGecko && thisSelect.size <= 1 && !thisSelect.multiple) {
            continue;
        }

        var selectOffsets = domTT_getOffsets(thisSelect); 
        // for mozilla we only have to worry about the scrollbar itself
        if (domTT_isGecko) {
            selectOffsets.setItem('left', selectOffsets.items['left'] + thisSelect.offsetWidth - domTT_scrollbarWidth);
            selectOffsets.setItem('leftCenter', selectOffsets.items['left'] + domTT_scrollbarWidth/2);
            selectOffsets.setItem('radius', Math.max(thisSelect.offsetHeight, domTT_scrollbarWidth/2));
        }

        var center2centerDistance = Math.sqrt(Math.pow(selectOffsets.items['leftCenter'] - tipOffsets.items['leftCenter'], 2) + Math.pow(selectOffsets.items['topCenter'] - tipOffsets.items['topCenter'], 2));
        var radiusSum = selectOffsets.items['radius'] + tipOffsets.items['radius'];
        // the encompassing circles are overlapping, get in for a closer look
        if (center2centerDistance < radiusSum) {
            // tip is left of select
            if (tipOffsets.items['leftCenter'] <= selectOffsets.items['leftCenter'] && tipOffsets.items['right'] < selectOffsets.items['left']) {
                thisSelect.style.visibility = 'visible';
            }
            // tip is right of select
            else if (tipOffsets.items['leftCenter'] > selectOffsets.items['leftCenter'] && tipOffsets.items['left'] > selectOffsets.items['right']) {
                thisSelect.style.visibility = 'visible';
            }
            // tip is above select
            else if (tipOffsets.items['topCenter'] <= selectOffsets.items['topCenter'] && tipOffsets.items['bottom'] < selectOffsets.items['top']) {
                thisSelect.style.visibility = 'visible';
            }
            // tip is below select
            else if (tipOffsets.items['topCenter'] > selectOffsets.items['topCenter'] && tipOffsets.items['top'] > selectOffsets.items['bottom']) {
                thisSelect.style.visibility = 'visible';
            }
            else {
                thisSelect.style.visibility = 'hidden';
            }
        }
    }
}

// }}}
// {{{ domTT_getOffsets()

function domTT_getOffsets(in_object)
{
    var originalObject = in_object;
    var originalWidth = in_object.offsetWidth;
    var originalHeight = in_object.offsetHeight;
    var offsetLeft = 0;
    var offsetTop = 0;

    while (in_object) {
        offsetLeft += in_object.offsetLeft;
        offsetTop += in_object.offsetTop;
        in_object = in_object.offsetParent;
    }
    
    return new domTT_Hash(
        'left',       offsetLeft,
        'top',        offsetTop,
        'right',      offsetLeft + originalWidth,
        'bottom',     offsetTop + originalHeight,
        'leftCenter', offsetLeft + originalWidth/2,
        'topCenter',  offsetTop + originalHeight/2,
        'radius',     Math.max(originalWidth, originalHeight) 
    );
}

// }}}
// {{{ domTT_getEventPosition()

function domTT_getEventPosition(in_eventObj)
{
    var eventPosition = new domTT_Hash();

    if (domTT_isKonq) {
        eventPosition.setItem('x', in_eventObj.x);
        eventPosition.setItem('y', in_eventObj.y);
    }
    else if (domTT_isIE) {
        eventPosition.setItem('x', in_eventObj.clientX + document.body.scrollLeft);
        eventPosition.setItem('y', in_eventObj.clientY + document.body.scrollTop);
    }
    else {
        eventPosition.setItem('x', in_eventObj.pageX);
        eventPosition.setItem('y', in_eventObj.pageY);
    }
    
    return eventPosition;
}

// }}}
// {{{ domTT_isDescendantOf()

function domTT_isDescendantOf(in_object, in_ancestor) {
    if (in_object == in_ancestor) {
        return true;
    }

    // [!] maybe use the documentElement or document.body [!]
    while (in_object) {
        try {
            if (in_ancestor == (in_object = in_object.parentNode)) {
                return true;
            }
        }
        // in case we get some wierd error, just assume we haven't gone out yet
        catch(e) {
            return true;
        }
    }

    return false;
}

// }}}
// {{{ domTT_dragStart()

function domTT_dragStart(in_event)
{
    var eventObj = domTT_isIE ? event : in_event;
    var eventButton = eventObj[domTT_eventButton];
    if (eventButton != 1) {
        return;
    }
    
    var eventTarget = eventObj[domTT_eventTarget];
    eventTarget.style.cursor = 'move';

    while (eventTarget.id.indexOf('domTT:') !== 0) {
        eventTarget = eventTarget.parentNode;
    }

    // upgrade our z-index
    eventTarget.style.zIndex = ++domTT_zIndex;
    domTT_currentDragTarget = eventTarget;

    var eventPosition = domTT_getEventPosition(eventObj);

    var targetPosition = domTT_getOffsets(eventTarget);
    domTT_dragOffsetLeft = eventPosition.items['x'] - targetPosition.items['left'];
    domTT_dragOffsetTop = eventPosition.items['y'] - targetPosition.items['top'];
    domTT_dragMouseDown = true;
}

// }}}
// {{{ domTT_dragUpdate()

function domTT_dragUpdate(in_event)
{
    if (domTT_dragMouseDown) {
        if (domTT_isGecko) {
            window.getSelection().removeAllRanges()
        }

        var eventObj = domTT_isIE ? event : in_event;
        var eventTarget = domTT_currentDragTarget;
        var eventPosition = domTT_getEventPosition(eventObj);

        eventTarget.style.left = eventPosition.items['x'] - domTT_dragOffsetLeft;
        eventTarget.style.top = eventPosition.items['y'] - domTT_dragOffsetTop;

        // update the collision detection
        domTT_detectCollisions(eventTarget);
    }
}

// }}}
// {{{ domTT_dragStop()

function domTT_dragStop(in_event)
{
    if (domTT_dragMouseDown) {
        domTT_dragMouseDown = false; 
        domTT_currentDragTarget = null;
        var eventObj = domTT_isIE ? event : in_event;
        var eventTarget = eventObj[domTT_eventTarget];
        eventTarget.style.cursor = 'default';
        if (domTT_isGecko) {
            window.getSelection().removeAllRanges()
        }
    }
}

// }}}
// {{{ domTT_true()

function domTT_true() {
    return true;
}

// }}}
// {{{ domTT_false()

function domTT_false() {
    return false;
}

// }}}
