/////////////////////////////////////////////////////////////////////////
//  Created by Walter Zorn  walter@kreuzotter.de
//                 10. 2001
//  Last modified: 24. 11. 2001
//
//  This script has been developed to work with the following browsers:
//  -  Konqueror 2.2.1 (Linux)
//  -  NN4 (Win, Linux)
//  -  NN6 (Win, Linux)
//  -  Mozilla >= 0.8 (Win, Linux)
//  -  Opera >= 5 (Win, Linux)
//  -  IE >= 4 (Win)
/////////////////////////////////////////////////////////////////////////




/////////////////////  Tooltip Configuration  ///////////////////////////
//  Variables which may be changed to one's desires:

var tooltipWidth        = 350;
var tooltipPadding      = 6;
var tooltipBorderColor  = '#000000';
var tooltipBorderWidth  = 1;
var tooltipBgColor      = '#ffffaa';
var tooltipFontFace     = 'verdana,helvetica,geneva,arial,sans-serif';
var tooltipFontColor    = '#000000';
var tooltipFontSize     = '11px';
var tooltipFontWeight   = 'normal';
var tooltipOffsetX      = 10;
var tooltipOffsetY      = 19;

///////////////////  End Tooltip Configuration  /////////////////////////




/////////////  Don't change anything below this line  ///////////////////

// optional SHOW_TOOLTIP arguments
var OFFSETX = 2;
var OFFSETY = 3;



function CATCH_ERROR()
{
  return true;
}
window.onerror = CATCH_ERROR;




//////////////////////////////////////////////////////////////////////////
//  Global variables:

var nn4 = false, nn6 = false, ie4 = false, ie5 = false, ie55 = false, ie6 = false, op4 = false, op402 = false, op5 = false, op5Linux = false, op6 = false; w3c = false;
var u = 'undefined';
var n = navigator;
var nua = n.userAgent;
var w = window;
var d = document;
var db = (d.compatMode && d.compatMode != 'BackCompat')? d.documentElement : d.body? d.body : false;
var tooltipObj = null;     // ID of activated tooltip
var repose = 0;            // (for NN6 and Konqueror only:) forces a timeout upon the MOVE_TOOLTIP function => prevents/reduces function call overflow => after all speeds up the tooltip movement

// Browser sniffer
if (parseFloat(-1) == 1)
{
  op4 = true;
  if (nua.indexOf('Opera 4.02') != -1) op402 = true;
}
else if (w.opera && d.getElementById)
{
  op5 = true;
  if (nua.toLowerCase().indexOf('opera 5') != -1 && nua.indexOf('Linux') != -1) op5Linux = true;
  if (nua.toLowerCase().indexOf('opera 6') != -1) op6 = true;
}
else if (d.layers) nn4 = true;
else if (d.all && nua.indexOf('MSIE') != -1)
{
  ie4 = true;
  if (d.getElementById) ie5 = true;
  if (parseFloat(nua.substring(nua.indexOf('MSIE ') + 5)) >= 5.5) ie55 = true;
  if (parseFloat(nua.substring(nua.indexOf('MSIE ') + 5)) >= 6.0) ie6 = true;
}
else if (d.getElementById && nua.indexOf('Gecko') != -1) nn6 = true;
else if (d.getElementById) w3c = true;

//  End global variables declaration
//////////////////////////////////////////////////////////////////////////




// Not shure if value is integer, and doubting if "parseInt()" accepts arguments being already integers? Call this!
function TO_INT(arg)
{
  return (arg == null)? 0 : (typeof arg != 'number')? parseInt(arg) : arg;
}



// Force NN4 to reload the page if window is resized (NN4 resize bug)
function N4_RESIZ(arg)
{
  if (arg == true)
  {
    if (nn4)
    {
      d.innerW = innerWidth;
      d.innerH = innerHeight;
      onresize = N4_RESIZ;
    }
  }
  else if (innerWidth != d.innerW || innerHeight != d.innerH) location.reload();
}
N4_RESIZ(true);



// Return complete outer + inner tooltip html
function TOOLTIP_HTML(id, width, txt, bg_color, bg_image)
{
  var y = '<div id="' + id + '" style="position:absolute;left:0px;top:' + (!nn4? '-800' : '0') + 'px;width:' + width + 'px;visibility:hidden;';
  y += '">\n<table bgcolor="' + tooltipBorderColor + '" border="0" cellpadding="0" cellspacing="0" width="' + width + '"><tr><td>\n';
  y += '<table border="0" cellpadding="' + tooltipPadding + '" cellspacing="' + tooltipBorderWidth + '" width="100%"><tr><td bgcolor="' + bg_color + '"' + ((bg_image != null)? ' background="' + bg_image + '"' : '') + (nn6? ' style="line-height:11px;"' : '') + '>\n';
  y += '<small><font style="color:' + tooltipFontColor + ';' + ((typeof tooltipFontFace != u)? ('font-family:' + tooltipFontFace + ';') : '') + ((typeof tooltipFontSize != u)? ('font-size:' + tooltipFontSize + ';') : '') + ((typeof tooltipFontWeight != u)? ('font-weight:' + tooltipFontWeight + ';') : '') + '">' + ((typeof tooltipFontWeight != u && tooltipFontWeight.indexOf('bold') != -1)? '<b>' : '') + txt + ((typeof tooltipFontWeight != u && tooltipFontWeight.indexOf('bold') != -1)? '<\/b>' : '') + '<br><\/font><\/small>\n';
  y += '<\/td><\/tr><\/table>\n<\/td><\/tr><\/table>\n';
  y += '<\/div>\n';
  return y;
}



function WRITE_TOOLTIPS()
{
   if (nn4 || ie4 || d.getElementById)
   {
     var arg = WRITE_TOOLTIPS.arguments;

     var html = nn4? '<div style="position:absolute;">&nbsp;<\/div>' : '';
     for (var i = 0; i < arg.length; i +=2 )
     {
       if (arg[i] != null && arg[i].length > 0)
       {
         html += TOOLTIP_HTML(arg[i], tooltipWidth, arg[i + 1], tooltipBgColor);
       }
     }

     d.write(html);
   }
   return 0;
}



// Start controlling tooltips
if (nn4 || nn6 || ie4 || op4 || op5 || w3c)
{
  d.onmousemove = MOVE_TOOLTIP;
  if (nn4) d.captureEvents(Event.MOUSEMOVE | Event.MOUSEDOWN);
}



// Return Event's coordinates related to document
function EVENT(evt, dim)
{
  if (evt == 0) return 0;

  var y = 0;
  if (evt.pageX) y = TO_INT((dim == 'x')? evt.pageX : evt.pageY);
  else if (evt.clientX) y = TO_INT((dim == 'x')? evt.clientX : evt.clientY);

  if (ie4) y += TO_INT((dim == 'x')? (db.scrollLeft? db.scrollLeft : 0) : (db.scrollTop? db.scrollTop : 0));
  return y;
}




function SHOW_TOOLTIP()
{
  if (nn4 || nn6 || op5 || ie4 || w3c)
  {
    tooltObjOffX = tooltipOffsetX;
    tooltObjOffY = tooltipOffsetY;

    var args = SHOW_TOOLTIP.arguments;
    var id = args[0];

    for (var i = 0; i < args.length; i++)
    {
      if (args[i] == OFFSETX) tooltObjOffX = args[i + 1];
      if (args[i] == OFFSETY) tooltObjOffY = args[i + 1];
    }

    if (nn4) tooltipObj = d.layers[id]? d.layers[id] : null;
    if (ie4) tooltipObj = d.all[id]? d.all[id] : null;
    if (nn6 || op5 || w3c) tooltipObj = d.getElementById(id)? d.getElementById(id) : null;
    if (typeof tooltipObj == u) tooltipObj = null;
  }
  return 0;
}



function MOVE_TOOLTIP(evt)
{
  // to avoid "overflow" of function calls, NN6 and Konqueror have access only if timeout has been expired -> tooltip movement is speeded up after all
  if ((nn6 || w3c) && repose == 1) return 0;

  if (tooltipObj != null)
  {
    var documentWidth = TO_INT((db && db.clientWidth)? db.clientWidth : w.innerWidth);
    var tooltObjWidth = TO_INT(tooltipObj.offsetWidth? tooltipObj.offsetWidth : tooltipObj.clip? tooltipObj.clip.width : (tooltipObj.style && tooltipObj.style.width)? tooltipObj.style.width : (tooltipObj.style && tooltipObj.style.pixelWidth)? tooltipObj.style.pixelWidth : tooltipObj.clientWidth? tooltipObj.clientWidth : tooltipWidth);
    var tooltObjLeft = EVENT(w.event? w.event : evt, 'x');
    var scrollX = TO_INT(w.pageXOffset? w.pageXOffset : ie4? db.scrollLeft : 0);
    tooltObjLeft = (tooltObjLeft > documentWidth - tooltObjWidth +  scrollX - (tooltObjOffX + ((nn4 || nn6)? 20 : 2)))? (documentWidth - tooltObjWidth +  scrollX - (tooltObjOffX + ((nn4 || nn6)? 20 : 2))) : tooltObjLeft;
    tooltObjLeft += tooltObjOffX;

    var tooltObjTop = EVENT(w.event? w.event : evt, 'y') + tooltObjOffY;

    if (nn4)
    {
      tooltipObj.visibility = 'show';
      tooltipObj.top = tooltObjTop;
      tooltipObj.left = tooltObjLeft;
    }
    else
    {
      tooltipObj.style.visibility = 'visible';
      tooltipObj.style.top = '' + tooltObjTop + (!(nn4 || op5)? 'px' : '');
      tooltipObj.style.left = '' + tooltObjLeft + (!(nn4 || op5)? 'px' : '');
    }
  }

  // set timeout for NN6 and Konqueror (see above)
  if (nn6 || w3c)
  {
    repose = 1;
    setTimeout('repose = 0', 1);
  }

  return 0;
}



function HIDE_TOOLTIP()
{
  if (tooltipObj != null)
  {
    if (nn4) tooltipObj.visibility = 'hide';
    else tooltipObj.style.visibility = 'hidden';
    tooltipObj = null;
  }
  return 0;
}

