

      // Webseiten Navigation (JavaScript- Klasse)
      // -------------------------------------------------------
      function knoten(id, selbstreferenz, text, url)
      {
        this.id = id;
        this.selbstreferenz = selbstreferenz;
        this.text = text;
        this.url = url;
        this.status = false;
        this.hatkinder = false;
        this.istselektiert = false;
        this.istzwilling = false;
        this.istletzterzwilling = false;
        return this;
      }



      function webseiten(instanz)
      {
        this.symbol = { symbol_plus       : 'kategorien_01_01.png',
                        symbol_minus      : 'kategorien_01_02.png',
                        symbol_plusunten  : 'kategorien_01_03.png',
                        symbol_minusunten : 'kategorien_01_04.png',
                        symbol_linie      : 'kategorien_01_05.png',
                        symbol_liniemitte : 'kategorien_01_06.png',
                        symbol_linieunten : 'kategorien_01_07.png',
                        symbol_leer       : 'kategorien_01_08.png',
                        symbol_ordnerauf  : 'kategorien_01_09.png',
                        symbol_ordnerzu   : 'kategorien_01_10.png',
                        symbol_alleauf    : 'kategorien_01_11.png',
                        symbol_allezu     : 'kategorien_01_12.png'}

        this.konfiguration = { verwende_cookies         : true,
                               verwende_symbole         : true,
                               verwende_statustext      : true,
                               verwende_highlight       : false,
                               verwende_ordnerlinks     : true}
        this.instanz = instanz;
        this.alle = [];
        this.einzug = [];


        this.zweig = function(id, selbstreferenz, text, url)
        {
          this.alle[this.alle.length] = new knoten(id, selbstreferenz, text, url);
        }


        this.knoten_rekursiv = function(vid)
        {
          var html = '';
          for(var i=0;i<this.alle.length;i++)
          {
            if(this.alle[i].selbstreferenz == vid)
            {
              var k = this.alle[i];

              var tmpid;
              for(var kk=0;kk<this.alle.length;kk++)
              {
                if(this.alle[kk].selbstreferenz == k.id) k.hatkinder = true;
                if(this.alle[kk].selbstreferenz == k.selbstreferenz) tmpid = this.alle[kk].id;
              }
              if(tmpid == k.id) k.istletzterzwilling = true;

              if(k.hatkinder && !k.status && this.konfiguration.verwende_cookies) k.status = this.ist_offen(k.id);
              if(!this.konfiguration.verwende_ordnerlinks && k.hatkinder) k.url = null;
              if(this.konfiguration.verwende_highlight) k.istselektiert = this.ist_selektiert(k.id);
              html+= this.knoten_html(k, i);
              if(k.istletzterzwilling) break;
            }
          }
          return html;
        }


        this.knoten_html = function(knoten, knoten_id)
        {
          var html = '<div class="kategorien_mit_javascript">' + this.einrueckung(knoten, knoten_id);
          if(this.konfiguration.verwende_symbole)
          {
            if(!knoten.symbol_zu)  knoten.symbol_zu  = this.symbol.symbol_ordnerzu;
            if(!knoten.symbol_auf) knoten.symbol_auf = this.symbol.symbol_ordnerauf;
            html+= '<img id="symbol_' + this.instanz + knoten_id + '" src="' + ((knoten.istselektiert) ? knoten.symbol_auf : knoten.symbol_zu) + '" alt="" />';
          }
          if(knoten.url)
          {
            html+= '<a class="knoten" href="' + knoten.url + '"';
            if(this.konfiguration.verwende_statustext)
            {
              html+= ' onmouseover="window.status=\'' + knoten.text + '\';return true;"';
              html+= ' onmouseout="window.status=\'\';return true;"';
            }
            html+= ' onclick="javascript:' + this.instanz + '.selektieren(' + knoten_id + ');';
            
            html+= '">';
            html+= knoten.text;     //  html+= '[this.einzug:' + this.einzug + ']';
            html+= '</a>';
          }
          else
          {
            if((!this.konfiguration.verwende_ordnerlinks || !knoten.url) && knoten.hatkinder)
            {
              html+= '<a class="knoten" href="javascript:' + this.instanz + '.klappen(' + knoten_id + ');">';
              html+= knoten.text;   //  html+= '[this.einzug:' + this.einzug + ']';
              html+= '</a>';
            }
            else
            {
              html+= knoten.text;   //  html+= '[this.einzug:' + this.einzug + ']';
            }
          }

          html+= '</div>';
          if(knoten.hatkinder)
          {
            html+= '<div id="klappen_' + this.instanz + knoten_id + '"  style="display:' + ((knoten.status) ? 'block' : 'none') + ';">';
            html+= this.knoten_rekursiv(knoten.id);
            html+= '</div>';
          }
          this.einzug.pop();
          return html;
        }


        this.toString = function()  // Überladen der Standard toString- Funktion, siehe http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Object:toString
        {
          var html = '<div class="kategorien_mit_javascript">' + this.knoten_rekursiv(0) + '</div>\n';
          return html;
        }


        this.einrueckung = function(knoten, knoten_id)
        {
          var html = '';
          for(var i=0;i<this.einzug.length;i++)
          {
            html+= '<img src="' + ((this.einzug[i] == 1) ? this.symbol.symbol_linie : this.symbol.symbol_leer) + '" alt="" />';
          }
          (knoten.istletzterzwilling) ? this.einzug.push(0) : this.einzug.push(1);

          if(knoten.hatkinder)
          {
            html+= '<a href="javascript:' + this.instanz + '.klappen(' + knoten_id + ');"><img id="plusminus_' + this.instanz + knoten_id + '" src="';
            html+= ((knoten.status) ? ((knoten.istletzterzwilling) ? this.symbol.symbol_minusunten : this.symbol.symbol_minus) : ((knoten.istletzterzwilling) ? this.symbol.symbol_plusunten : this.symbol.symbol_plus ));
            html+= '" alt="" /></a>';
          }
          else
          {
            html+= '<img src="' + ((knoten.istletzterzwilling) ? this.symbol.symbol_linieunten : this.symbol.symbol_liniemitte) + '" alt="" />';
          }
          return html;
        }


        this.klappen = function(id)
        {
          var k = this.alle[id];
          this.knoten_einausblenden(!k.status, id, k.istletzterzwilling);
          k.status = !k.status;
          if(this.konfiguration.verwende_cookies) this.aktualisiere_cookie();
        }


        this.selektieren = function(id)
        {
          for(var i=0;i<this.alle.length;i++)
          {
            element = document.getElementById('symbol_' + this.instanz + id);
            element.src = this.alle[i].symbol_zu;
            this.alle[i].istselektiert = false;
          }
          element = document.getElementById('symbol_' + this.instanz + id);
          element.src = this.alle[id].symbol_auf;
          this.alle[id].istselektiert = true;
          if(this.konfiguration.verwende_cookies) this.aktualisiere_cookie();
        }


        this.knoten_einausblenden = function(status, id, unten)
        {
          element = document.getElementById('plusminus_' + this.instanz + id);
          if(element == null) return;
          element.src = ((status) ? ((unten) ? this.symbol.symbol_minusunten : this.symbol.symbol_minus) : ((unten) ? this.symbol.symbol_plusunten : this.symbol.symbol_plus));
          element = document.getElementById('klappen_' + this.instanz + id);
          element.style.display = (status) ? 'block':'none';
        }


        this.alleauf = function() { this.alles(true);  }
        this.allezu  = function() { this.alles(false); }
        this.alles = function(status)
        {
          for(var i=0;i<this.alle.length;i++)
          {
            if(this.alle[i].hatkinder)
            {
              this.knoten_einausblenden(status, i, this.alle[i].istletzterzwilling);
              this.alle[i].status = status;
            }
          }
          if(this.konfiguration.verwende_cookies) this.aktualisiere_cookie();
        }


        this.setze_cookie = function(schluessel, wert, verfallsdatum)
        {
          var tmp = '';
          tmp+= escape(schluessel) + '=' + escape(wert)
          tmp+= (verfallsdatum ? '; expires=' + verfallsdatum.toGMTString() : '')
          document.cookie = tmp;
        }


        this.lese_cookie = function(schluessel)
        {
          var wert = '';
          var pos = document.cookie.indexOf(escape(schluessel) + '=');
          if(pos != -1)
          {
            var pos_a = pos + (escape(schluessel) + '=').length;
            var pos_e = document.cookie.indexOf(';', pos_a);
            if(pos_e != -1)
            {
              wert = unescape(document.cookie.substring(pos_a, pos_e));
            }
            else
            {
              wert = unescape(document.cookie.substring(pos_a));
            }
          }
          return (wert);
        }


        this.aktualisiere_cookie = function()
        {
          var tmp1 = '';
          var tmp2 = '';
          for(var i=0;i<this.alle.length;i++)
          {
            if(this.alle[i].status)
            {
              if(tmp1) tmp1+= '_';
              tmp1+= this.alle[i].id;
            }
            if(this.alle[i].istselektiert)
            {
              if(tmp2) tmp2+= '_';
              tmp2+= this.alle[i].id;
            }
          }
          this.setze_cookie('kategorien_' + this.instanz + '_offen', tmp1);
          this.setze_cookie('kategorien_' + this.instanz + '_selektiert', tmp2);
        }


        this.ist_offen = function(id)
        {
          var tmp = this.lese_cookie('kategorien_' + this.instanz + '_offen').split('_');
          for(var i=0;i<tmp.length;i++)
          {
            if(tmp[i] == id) return true;
          }
          return false;
        }


        this.ist_selektiert = function(id)
        {
          var tmp = this.lese_cookie('kategorien_' + this.instanz + '_selektiert').split('_');
          for(var i=0;i<tmp.length;i++)
          {
            if(tmp[i] == id) return true;
          }
          return false;
        }
     }
