<!--
  
// *************************************************************
//  CLIENT_SIDE SNIFFER CODE
// *************************************************************
// convert all characters to lowercase to simplify testing
var agt=navigator.userAgent.toLowerCase();

// *** BROWSER VERSION ***
// Note: On IE5, these return 4, so use is_ie5up to detect IE5.
var is_major = parseInt(navigator.appVersion);
var is_minor = parseFloat(navigator.appVersion);

// *** BROWSER TYPE ***
var is_nav  = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
            && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
            && (agt.indexOf('webtv') == -1));
var is_nav4up = (is_nav && (is_major >= 4));
var is_nav4   = (is_nav && (is_major == 4));
var is_nav5   = (is_nav && (is_major == 5));
var is_ie   = (agt.indexOf("msie") != -1);
var is_ie3  = (is_ie && (is_major < 4));
var is_ie4  = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.0")==-1) );
var is_ie4up  = (is_ie  && (is_major >= 4));
var is_ie5  = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.0")!=-1) );
var is_ie5up  = (is_ie  && !is_ie3 && !is_ie4);
var is_dom = (document.getElementById);

// *** PLATFORM ***
var is_win   = ( (agt.indexOf("win")!=-1) || (agt.indexOf("16bit")!=-1) );
var is_mac    = (agt.indexOf("mac")!=-1);
var is_sun   = (agt.indexOf("sunos")!=-1);
var is_irix  = (agt.indexOf("irix") !=-1);    // SGI
var is_hpux  = (agt.indexOf("hp-ux")!=-1);
var is_aix   = (agt.indexOf("aix") !=-1);      // IBM
var is_linux = (agt.indexOf("inux")!=-1);
var is_sco   = (agt.indexOf("sco")!=-1) || (agt.indexOf("unix_sv")!=-1);
var is_unixware = (agt.indexOf("unix_system_v")!=-1);
var is_mpras    = (agt.indexOf("ncr")!=-1);
var is_reliant  = (agt.indexOf("reliantunix")!=-1);
var is_dec   = ((agt.indexOf("dec")!=-1) || (agt.indexOf("osf1")!=-1) ||
       (agt.indexOf("dec_alpha")!=-1) || (agt.indexOf("alphaserver")!=-1) ||
       (agt.indexOf("ultrix")!=-1) || (agt.indexOf("alphastation")!=-1));
var is_sinix = (agt.indexOf("sinix")!=-1);
var is_freebsd = (agt.indexOf("freebsd")!=-1);
var is_bsd = (agt.indexOf("bsd")!=-1);
var is_unix  = ((agt.indexOf("x11")!=-1) || is_sun || is_irix || is_hpux ||
             is_sco ||is_unixware || is_mpras || is_reliant ||
             is_dec || is_sinix || is_aix || is_linux || is_bsd || is_freebsd);


  imgArray = new Array();                               // enthaelt die Bilder im Dokument
  bilder_Anzahl = 0;                                    // enthaelt die Anzahl aller Bilder im Dokument
  dontTurnOff = [];
  base2 = "";
  oldHeadlineSrc = "";

// Variablen nur wichtig fuer Debugging...
  debug = false;                                         // debugging einschalten?
  anzahl_der_Durchlaeufe = 0;                           // Anzahl der Durchlaeufe der Updatefunktion
  rekursion_erlauben = true;                            // neuer Aufruf der Updatefunktion erlauben?
  debug_Text = "";                                      // Initialisierung der Text-Variablen
  preLoad_done = false;                                 // enthaelt "true" wenn der PreLoad abgeschlossen ist

  // Funktion cancelPreLoad()
  //
  // Funktion: Bricht die Updatefunktion ab (nur wichtig fuer Debugging)
  // Parameter: keine
  // Rueckgabe: keine
  function cancelPreLoad()
    {
      rekursion_erlauben = false;
  }
  
  // Funktion entry()
  //
  // Funktion: erstellt ein neues Objekt, das zwei Bildobjekte enthaelt; eines fuer den Normalzustand
  //            und eins fuer den Hilitezustand, die durch dir Funktion imgOn / imgOff je nach mouse
  //            event ausgetauscht werden.
  // Parameter: layer (string): Name der Layer, in der sich das Bild befindet
  //            name (string): Name des Bildes; muss mit dem Namen aus dem HTML-Dokument uebereinstimmen
  //            src1 (string): Quelle des Bildes im Normalzustand
  //            src2 (string): Quelle des Bildes im Hilitezustand
  // Rueckgabe: (Objekt): ein Objekt mit zwei Imageobjekten und der passenden Layerangabe
  function entry(layer, name, src1, src2, x, y)
    {
      this.layer = layer;           // Name der Layer speichern
      this.name = name;
      this.normal = new Image();     // neues Bildobjekt fuer den Normalzustand erzeugen
      this.normal.src = src1;       // die Quelle eintragen
      this.hilite = new Image();    // neues Bildobjekt fuer den Hilitezustand erzeugen
      this.hilite.src = src2;       // und noch die zweite Quelle eintragen
      this.x = x;
      this.y = y;
      return (this);
  }
  
  // Funktion isValidImage()
  //
  // Funktion: ueberprueft, ob es sich bei einem angegebenen Dateinamen eines Bildes um ein Bild handelt,
  //            das auch gehilitet werden kann.
  // Parameter: name (string): Name des zu ueberpruefenden Bildes
  // Rueckgabe: (boolean): wahr oder falsch ;)
  function isValidImage(src)
    {
      var ok = src.indexOf("_off.") > 0;
      return(ok);
  }
  
  // Funktion convertToHilite()
  //
  // Funktion: Konvertiert eine Quelle eines Bildes im Normalzustand in die Quelle fuer das gleiche
  //            Bild im Hilitezustand.
  // Parameter: src (string): Quelle des Bildes im Normalzustand
  // Rueckgabe: (string): Quelle des Bildes im Hilitezustand
    function convertToHilite(src)
    {
      var fileType = src.substring(src.lastIndexOf("."), src.length); // Dateiendung speichern
      var endOfPath = src.lastIndexOf("/") + 1;                       // letzten Slash suchen
      var path = src.substring(0, endOfPath);                         // Pfad extrahieren
      var fileName = src.substring(endOfPath, src.length);            // Dateinamen extrahieren
      var fileName2 = fileName;
      var endOfFileName = fileName.lastIndexOf("_");                  // Dateinamen aufsplitten
      fileName = fileName.substring(0, endOfFileName);                // "richtiger" Dateiname
      fileName = path + fileName + "_on" + fileType;                  // "_on" und Dateiendung anhaengen
      return (fileName);
  }
  
  // Funktion searchImages()
  //
  // Funktion: sucht alle Bilder aus dem HTML-Dokument und erstellt fuer jedes ein newImage-Objekt fuer
  //            den RollOver-Effekt. Dabei werden auch die Layers im Netscape (auch in der Version 6)
  //            beruecksichtigt.
  // Parameter: keine
  // Rueckgabe: keine
  function searchImages()
    {
      var anzahl_der_Bilder = document.images.length;
      if (debug) debug_Text += "<table width = '100%' border = '1'>\n<tr><td>pos</td><td>Layer</td><td>Name</td><td>low Quelle</td><td>hi Quelle</td><td colspan = '2'>preLoaded</td></tr>\n";
      for (var img = 0; img < anzahl_der_Bilder; img++)
        {//alert(img);
          var name = document.images[img].name;             // Name des Bildes speichern
          var nsrc = document.images[img].src;              // Quelle des Bildes speichern
          var hsrc = convertToHilite(nsrc);                 // Quelle des Hilite-Bildes speichern
          if (is_nav) { var x = document.images[img].x; var y = document.images[img].y; }
          else { var x = document.images[img].sourceIndex; var y = 0; }
          if (name == "") name = img;         // falls das Bild keinen Namen haben sollte, einfach einen erstellen :=)
          if (isValidImage(nsrc))
            {
              imgArray[bilder_Anzahl] = new entry("", name, nsrc, hsrc, x, y);  // das gefundene Bild in das Array eintragen
              if (debug) if (name != "") debug_Text += "<tr><td align = 'center' bgColor = '#22ff22'>" + bilder_Anzahl + ". </td><td align = 'center' bgColor = '#22ff22'>&nbsp;</td><td bgColor = '#22ff22'>" + name + "</td><td bgColor = '#22ff22'>" + nsrc + "</td><td bgColor = '#22ff22'>" + hsrc + "</td><td bgColor = '#22ff22'><input type = 'Text' value = 'no' size = '3' name = '" + imgArray[bilder_Anzahl].name + "l' /></td><td bgColor = '#22ff22'><input type = 'Text' size = '3' value = 'no' name = '" + imgArray[bilder_Anzahl].name + "h' /></tr>\n";
              bilder_Anzahl++;
          }
          else
            {
              if (debug) debug_Text += "<tr><td colspan = '7'>Not valid: name = " + name + ", src = " + nsrc + "</td></tr>";
          }
      }
      if ((is_nav) && (!is_dom)) searchImagesInLayers();
      if (debug) debug_Text += "<tr><td colspan = '7'>Anzahl der gefundenen Bilder: " + bilder_Anzahl + "</td></tr>\n</table>\n";
  }
  
  // Funktion searchImagesInLayers()
  // 
  // Funktion: sucht alle Bilder aus dem HTML-Dokument in Layers und erstellt fuer jedes ein newImage-Objekt fuer
  //            den RollOver-Effekt.
  // Parameter: keine
  // Rueckgabe: keine
  function searchImagesInLayers()
    {
      var layers = document.layers;
      for (var l = 0; l < layers.length; l++)
        {
          doc2 = layers[l].document;
          if (debug) debug_Text += "<tr><td bgColor = '#ffff00' colspan = '7'>Suche in Layer " + layers[l].name + " (max. " + doc2.images.length + " Bilder)</td></tr>\n";
          for (var d = 0; d < doc2.images.length; d++)
            {
              var name = doc2.images[d].name;
              var nsrc = doc2.images[d].src;
              var hsrc = convertToHilite(nsrc);
              if (is_nav) { x = doc2.images[d].x; y = doc2.images[d].y; }
              if (isValidImage(nsrc))
                {
                  imgArray[bilder_Anzahl] = new entry(layers[l].name, name, nsrc, hsrc, x, y);
                  if (debug) if (name != "") debug_Text += "<tr><td align = 'center' bgColor = '#22ff22'>" + bilder_Anzahl + ". </td><td align = 'center' bgColor = '#ffff22'>" + layers[l].name + "</td><td bgColor = '#22ff22'>" + name + "</td><td bgColor = '#22ff22'>" + nsrc + "</td><td bgColor = '#22ff22'>" + hsrc + "</td><td bgColor = '#22ff22'><input type = 'Text' value = 'no' size = '3' name = '" + imgArray[bilder_Anzahl].name + "l' /></td><td bgColor = '#22ff22'><input type = 'Text' size = '3' value = 'no' name = '" + imgArray[bilder_Anzahl].name + "h' /></tr>\n";
                  bilder_Anzahl++;
              }
          }
      }
  }

  // Funktion getPos()
  //
  // Funktion: Ermittelt die Position eines Bildes im imgArray anhand des Namens und liefert dessen Position zurueck.
  //            Wird das Bild nicht gefunden, liefert die Funktion -1 zurueck.
  // Parameter: name (string): Name des zu suchenden Bildes.
  // Rueckgabe: (int): Position des Bildes.
  function getPos(name)
    {
      var retValue = -1;
      for (var p = 0; p < imgArray.length; p++)
        {
          if (imgArray[p].name == name) retValue = p;
      }
      return (retValue);
  }

  function imgIsOn(name)
    {
      retValue = false;
      var nr = getPos(name);
      if (nr != -1)
        {
          var bild = imgArray[nr];
          if ((is_nav) && (bild.layer != "")) retValue = (document.layers[bild.layer].document.images[name].src.indexOf('_on') != -1);
            else retvalue = (document.images[name].src = bild.hilite.src.indexOf('_on') != -1);
      }
      alert(retValue);
      return(retValue);
  }

  // Funktion imgOn()
  //
  // Funktion: schaltet ein bestimmtes Bild in den Hi-Zustand. Wird ein ungueltiger Name angegeben, so erscheint
  //            keine Fehlermeldung.
  // Parameter: name (string): der Name des zu hilitenden Bildes
  // Rueckgabe: keine
  function imgOn(name, nrec)
    {
      var nr = getPos(name);
      if (nr != -1)
        {
          var bild = imgArray[nr];
          if ((is_nav) && (bild.layer != ""))
            document.layers[bild.layer].document.images[name].src = bild.hilite.src;
          else
            document.images[name].src = bild.hilite.src;

          
      }
  }

  // Funktion imgOff()
  //
  // Funktion: schaltet ein bestimmtes Bild in den Lo-Zustand. Wird ein ungueltiger Name angegeben, so erscheint
  //            keine Fehlermeldung.
  // Parameter: name (string): der Name des zu normalisierenden Bildes
  // Rueckgabe: keine
  function imgOff(name, force, nrec)
    {
      if ((!isIn(dontTurnOff, name)) || (force))
        {
          var nr = getPos(name);
          if (nr != -1)
            {
              var bild = imgArray[nr];
              if ((is_nav) && (bild.layer != ""))
                document.layers[bild.layer].document.images[name].src = bild.normal.src;
              else
                document.images[name].src = bild.normal.src;

              
          }
      }
  }

  function addDTO(name)
    {
      // ist das Element bereits vorhanden?
      for (var i in dontTurnOff)
        if (dontTurnOff[i] == name) return(-1);
      dontTurnOff[dontTurnOff.length] = name;
      return(1);
  }

  function delDTO(name)
    {
      var dummy = [];
      for (var i in dontTurnOff)
        if (dontTurnOff[i] != name) dummy[dummy.length] = dontTurnOff[i];
          else imgOff(name, 1);
      dontTurnOff = dummy;
  }

  function registerMouseEvents()
    {
      if (is_nav)
        {
          document.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
      }
      document.onmouseover = checkForHilite;
      document.onmouseout = checkForHilite;
  }
  
  function isIn(arr, el)
    {
      var retValue = false;
      for (var e in arr) if (arr[e] == el) retValue = true;
      return (retValue);
  }

  function NS_is_visible(divName)
    {
      retValue = false;
      if (divName == '') return(true);
      if ((document.layers) && (document.layers[divName]) && (document.layers[divName].visibility == 'show')) retValue = true;
      return(retValue);
  }

  function getImageFromLink(obj)
    {
      retValue = -1;
      if (is_nav)
        {
          if (((obj.x) || (obj.x == 0)) && ((obj.y) || (obj.y == 0)))
            for (var pic in imgArray)
              if ((obj.x == imgArray[pic].x) && (obj.y == imgArray[pic].y) && (NS_is_visible(imgArray[pic].layer))) return(imgArray[pic]);
      }
      else
        if (obj.sourceIndex)
          for (var pic in imgArray)
            if (obj.sourceIndex == imgArray[pic].x) retValue = imgArray[pic];
      return (retValue);
  }

  function showProps(obj)
    {
      var count = 0;
      var Text = "";
      for (var i in obj)
        {
          Text += i  + " = " + obj[i] + "\n";
          count++; 
          if (count == 25)
            {
              alert(Text);
              count = 0;
              Text = "";
          }
      }
      alert(Text);
  }
  
  function checkForHilite(e)
    {
      if (is_nav) { event = e; }

      quelle = -1;
      if ((is_nav) && (is_dom))
        if (event.target.localName == 'IMG')
          quelle = event.target.id;
      
      if ((is_nav) && (!is_dom))
        if ((event.target.src) || (event.target.href))
          {
            quelle = getImageFromLink(event.target);
            /*if (quelle == -1) */routeEvent(event);
        }
      if (is_ie)
        if (event.srcElement.src)
          {
            var img = event.srcElement;
            quelle = getImageFromLink(event.srcElement);
        }
      if (quelle != -1) 
        {
          action = (event.type.indexOf("ver") != -1) ? "over" : "out";
          if (quelle.name) quelle = quelle.name;
          if (action == "over") imgOn(quelle)
          else imgOff(quelle);
      }
  }
        
  
  // Funktion waitForPreload()
  //
  // Funktion: mit dieser Funktion kann ueberwacht werden, ob der PreLoad abgeschlossen ist.
  //            enthaelt die Variable preLoad_done den Wert "true", sind die mouseOver- und mouseOut-Bilder
  //            vorgeladen.
  //            VORSICHT: Bei Netscape kommt es manchmal vor, dass manche Bilder trotz Anweisung NICHT
  //                      vorgeladen werden!!
  //            Die Funktion benutzt die Timer-Funktion
  // Parameter: keine
  // Rueckgabe: keine
  function waitForPreLoad()
    {
      var per = 0;
      var count = 2 * bilder_Anzahl;
      var interleave = 100;
      anzahl_der_Durchlaeufe++;
      for (var b = 0; b < bilder_Anzahl; b++)
        {
          if (imgArray[b].normal.complete) 
            {
              per++;
              if (debug) debug_win.document.Display.elements[imgArray[b].name + "l"].value = "yes";
          }
          if (imgArray[b].hilite.complete)
            {
              per++;
              if (debug) debug_win.document.Display.elements[imgArray[b].name + "h"].value = "yes";
          }
      }
      if (debug)
        {
          debug_win.document.Display.D.value = Math.floor(100 * per / count) + " % preloaded (" + anzahl_der_Durchlaeufe * interleave + " msec)";
          debug_win.focus();
      }
      if ((per < count) && (rekursion_erlauben)) window.setTimeout("waitForPreLoad();", interleave);
      if (per == count) preLoad_done = true;
  }

  // Funktion mistic()   (Hauptfunktion)
  //
  // Funktion: Diese Funktion muss im body-Tag mit dem onLoad-Event aufgerufen werden. Sie veranlasst, dass das
  //            Dokument nach Bildern durchsucht wird, die fuer einen RollOver-Effekt verwendet werden. Die Funktion
  //            erkennt diese Bilder daran, dass ihre Quelle den Substring "_off." enthaelt.
  //            Mithilfe der Variablen preLoad_done kann festgestellt werden, wann der
  //            Preload fuer die erkannten Bilder abgeschlossen ist.
  //            Die gefundenen Bilder koennen dann ueber die Funktionen imgOn() und imgOff() in die verschiedenen
  //            Zustaende versetzt werden, wobei nur noch der Name des Bildes uebergeben werden muss. Layers in
  //            Netscape werden selbst erkannt und muessen somit nicht angegeben werden.
  // Parameter: keine
  // Rueckgabe: keine
  function mistic()
    {
      if (debug)
        {
          debug_win = window.open("", "", "width=900,height=600,scrollbars=1,resizable=1");
          debug_win.document.open();
          debug_Text += "<html><head><title>Debugger-Fenster f&uuml;r mistic</title></head><body><form name = 'Display'><input type = 'Text' name = 'D' size = '30'/><input type = 'Button' value = 'preLoad abbrechen' onClick = 'window.opener.cancelPreLoad();' /><br />Vor dem Laden:<br />";
      }

      searchImages();
    
      if (debug)
        {
          debug_Text += "</form></body></html>";
          debug_win.document.write(debug_Text);
          debug_win.document.close();
      }
//      waitForPreLoad();
      registerMouseEvents(); 
  }
  
//-->
