var isDOM = document.getElementById?true:false;
var isOpera = window.opera&&isDOM&&document.readyState;
var isMSIE = document.all&&document.all.item&&!isOpera;
var currentD = null;

jsc= {
  tt: document.createElement('div'),
  c: null,
  g: false,
  ttCoords: function (e) {
    if (jsc.g) {
      var x,y;
      if (e.pageY) {
        x = e.pageX;
        y = e.pageY;
      } else if (window.event && document.documentElement && document.documentElement.scrollTop) {
        x = event.clientX + document.documentElement.scrollLeft;
        y = event.clientY + document.documentElement.scrollTop;
      } else if (window.event && document.body) {
        x = event.clientX + document.body.scrollLeft;
        y = event.clientY + document.body.scrollTop;
      } else {
        x = 800;
        y = 600;
      }
      jsc.ttMove(x,y);
    }
  },
  ttInit: function () {
    jsc.tt.setAttribute('id', 'tooltip');
    document.getElementsByTagName('body')[0].appendChild(jsc.tt);
    jsc.addEvent(window, 'scroll', jsc.ttHide);
    jsc.addEvent(window, 'click', jsc.ttHide);

    // begin, Georg Engist
    tagList = new Array('a', 'img', 'area');
    for(i=0; i<tagList.length; i++) {
      singleTagArr = document.getElementsByTagName(tagList[i]);
      for(j=0; j<singleTagArr.length; j++) {
        jsc.addEvent(singleTagArr[j], 'mousemove', jsc.ttCoords);
        jsc.addEvent(singleTagArr[j], 'contextmenu', jsc.ttHide);
        jsc.addEvent(singleTagArr[j], 'mouseover', jsc.ttShow);
      }
    }
    // end, Georg Engist

    // Georg Engist has commented out:
    // jsc.addEvent(document.getElementsByTagName('body')[0], 'mousemove', jsc.ttCoords);
    // jsc.addEvent(document.getElementsByTagName('body')[0], 'contextmenu', jsc.ttHide);
    // jsc.addEvent(document.getElementsByTagName('body')[0], 'mouseover', jsc.ttShow);

    jsc.ttMove(-99,-99);
  },
  ttShow: function (e) {
    e=e||window.event;
    if (!e || typeof(window.currentD)=='undefined') return;
    var d=e.target||e.srcElement;

    var ttitleCont=d.getAttribute('ttitle');
    if (!ttitleCont) {
      var titleCont=d.getAttribute('title');
      var parTitleCont=d.parentNode.getAttribute('title');
      var parTtitleCont=d.parentNode.getAttribute('ttitle');
      if (parTtitleCont) parTitleCont=parTtitleCont;
      if (titleCont && parTitleCont && titleCont!=parTitleCont) titleCont=parTitleCont+'. '+titleCont;
      if (titleCont) {
        // jsc.tt.appendChild(document.createTextNode(titleCont));
        jsc.ttChangeElementsTextNode(jsc.tt, titleCont);

        d.setAttribute('ttitle', titleCont);
        if (isMSIE) d.setAttribute('title','');
        else d.removeAttribute('title');
        if (parTitleCont && !parTtitleCont) {
            d.parentNode.setAttribute('ttitle',parTitleCont);
            if (isMSIE)
              d.parentNode.setAttribute('title','');
            else
              d.parentNode.removeAttribute('title');
        }
        if (isMSIE && d.getAttribute('alt') && d.complete)
          d.setAttribute('alt','');
      }
    } else {
      // jsc.tt.appendChild(document.createTextNode(ttitleCont));
      jsc.ttChangeElementsTextNode(jsc.tt, ttitleCont);
    }

    var hrefCont=d.getAttribute('href');
    var parHrefCont=d.parentNode.getAttribute('href');
    if (parHrefCont && !hrefCont)
      hrefCont=parHrefCont;

    if (hrefCont) {
/*
        if (hrefCont.indexOf('ftp://')!=-1) ahrefCont='ftp-link';
        else if (hrefCont.indexOf('irc://')!=-1) ahrefCont='irc-link';
        else if (hrefCont.indexOf('mailto:')!=-1) ahrefCont='email-link';
        else if (hrefCont.indexOf('javascript:')!=-1) ahrefCont='local link';
        else
*/
      ahrefCont=false;
      if (ahrefCont) {
        var ahrefEl=document.createElement('div');
        ahrefEl.setAttribute('id','ahref');
        ahrefEl.appendChild(document.createTextNode(ahrefCont));
        jsc.tt.appendChild(ahrefEl);
      }
    }

    var isBlank=false;
    if (d.getAttribute('target')=='_blank' || d.parentNode.getAttribute('target')=='_blank')
      isBlank=true;
    else {
/*
      if (hrefCont && (hrefCont.match(/(?:http|ftp):\/\//)!=null && hrefCont.indexOf('')==-1)) {
        if (!parHrefCont) d.target='_blank';
        else d.parentNode.target='_blank';
        isBlank=true;
      }
*/
    }
    if (isBlank) {
      var blankEl=document.createElement('div');
      blankEl.setAttribute('id','blank');
      // îòêðîåòñÿ â íîâîì îêíå
      // = es wird in einem neuen Fenster geöffnet
      //blankEl.appendChild(document.createTextNode('Die Seite wird in einem neuen Fenster geöffnet'));
      //jsc.tt.appendChild(blankEl);
    }

    if (jsc.tt.firstChild) {
      jsc.addEvent(d, 'mouseout', jsc.ttHide);
      currentD=d;
      jsc.c=setTimeout("jsc.tt.style.visibility='visible';", '50');
      jsc.g=true;
    } else
      return;
  },
  ttHide: function () {
    if (currentD) {
      jsc.tt.style.visibility='hidden';
      jsc.removeEvent(currentD, 'mouseout', jsc.ttHide);
      while (child=jsc.tt.firstChild) jsc.tt.removeChild(child);
      clearTimeout(jsc.c);
      currentD=null;
      jsc.g=false;
      jsc.ttMove(-99,-99);
    }
  },
  addEvent: function (o, e, a) {
    if (o.addEventListener)
      o.addEventListener (e, a, false);
    else if (o.attachEvent)
      o.attachEvent ('on' + e, a);
    else
      return null;
  },
  removeEvent: function (o, e, a) {
    if (o.removeEventListener) o.removeEventListener
      (e, a, false);
    else if (o.detachEvent)
      o.detachEvent ('on' + e, a);
    else
      return null;
  },
  ttMove: function (x, y) {
    var w_width, w_height;
    if (self.innerHeight) {
      w_width = self.innerWidth+self.pageXOffset;
      w_height = self.innerHeight+self.pageYOffset;
    } else if (document.documentElement.clientHeight || document.documentElement.scrollTop) {
      w_width = document.documentElement.clientWidth+document.documentElement.scrollLeft;
      w_height = document.documentElement.clientHeight+document.documentElement.scrollTop;
    } else if (document.body.clientHeight || document.body.scrollTop) {
      w_width = document.body.clientWidth+document.body.scrollLeft;
      w_height = document.body.clientHeight+document.body.scrollTop;
    } else {
      w_width=800;
      w_height=600;
    }

    if (isMSIE)
      jsc.tt.style.width='auto';
    if (isMSIE && jsc.tt.offsetWidth>300)
      jsc.tt.style.width= 300 + 'px';

    jsc.tt.style.left = ((w_width/2)<x) ? (x-jsc.tt.offsetWidth+'px') : (x+12+'px');
    jsc.tt.style.top = ((w_height/2)<y) ? (y-jsc.tt.offsetHeight-4+'px') : (y+10+'px');
  },
  // begin, added by Georg Engist
  ttChangeElementsTextNode: function (aElement,text) {
    // source: http://blogs.warwick.ac.uk/sjones/tag/computery_stuff/
    if (aElement) {
      if (aElement.childNodes) {
        for (var i = aElement.childNodes.length-1;i >= 0;i--) {
          aElement.removeChild(aElement.childNodes[i]);
        }
        //  &#10;&#13; is equal to backslash n backslash r
        var textarr = text.split(" \n\r");
        for (var i=0; i<textarr.length; i++) {
          var aNode = document.createTextNode(textarr[i]);
          aElement.appendChild(aNode);
          if (i != textarr.length-1) {
            var aNode = document.createElement('br');
            aElement.appendChild(aNode);
          }
        }
      }
    }
  }
  // end, added by Georg Engist
}
if (document.getElementById &&
    document.createElement &&
    document.getElementsByTagName) {

      jsc.addEvent(
        window,
        'load',
        function() {
          if (isMSIE) {
            // method against flickering of background images when mouse hovers
            try {
              document.execCommand('BackgroundImageCache', false, true);
            } catch(e) {
            }
          }
          jsc.ttInit();
        }
      );
}

