// ================================================
// GLlist              (c) by Georg Lewandowski
// Version: 0.3.2                     März 2007
// Fragen, Vorschläge:    gllist@lewandowski.at
// ------------------------------------------------
// GLlist ist freeware. Möge es jeder verwenden
// wie er mag. Verwendung immer auf eigene Gefahr!
// Einzigste Bedingung, die ersten 3 Zeilen des
// Kopfes müssen enthalten bleiben (Urhebervermerk)
// ------------------------------------------------
// Beschreibung: 
//   GlList stellt eine Baumansicht von Einträgen
//   innerhalb eines <div>-Objektes einer HTML-
//   Seite dar. Für jeden Eintrag der Liste wird
//   eine Auswahlfunktion (frei definierbar) auf-
//   gerufen. Einträge werden dynamisch mit einer
//   eigenen Ladefunktion nachgeladen, die bei
//   Klick auf einen Folder aufgerufen wird.
//   Siehe auch Beispielseite.
// Funktionen:
//   Objekt erzeugen:
//      liste = new gllist(<Variable>, <Container>, <Ladefunktion>, <Lademodus>, 
//                         <Auswahlfunktion>, <Bildertyp>, <Bilderpfad>);
//      Beispiel: var d = new gllist("d", "gllist", laden, 1, gewaehlt, 1, "resource/");
//   Element einfügen:
//      liste.add(<Vaterebene>, <id>, <Text>, <Typ>);
//      Beispiel: d.add(0, 1, "Folder 1", 0);
//                d.add(0, 2, "Item 1", 1);
//      nachdem alle Elemente dieser Ebene hinzugefügt wurden:
//      liste.show();
//      
//   Parameter:
//      <Variable>        : Name der Objektvariable (Beispiel: d)
//      <Container>       : <div>-Container Id in der die Liste angezeigt werden soll
//      <Ladefunktion>    : eigene Funktion die die Daten nachläd. Bekommt jeweils die
//                          Id-Nr des gewählten Folders mitgeliefert.
//      <Lademodus>       : 0 = zu öffnende Folder immer Laden, 1 = einmal geöffnete
//                          Folder nicht nachladen
//      <Auswahlfunktion> : Funktion die  bei gewähltem Text (Folder und Nodes)
//                          mit der jeweiligen Id-Nr aufgerufen wird
//      <Bildertyp>       : 1 = Ordnersymbole, alles andere = +/- Symbole, 
//      <Bilderpfad>      : Pfad auf das Bilderverzeichnis (immer mit / am Ende!)
//      <id>              : Eindeutige Id-Nr des Eintrags (Folder/Nodes). Oberste
//                          Ebene ist immer 0 !
//      <Text>            : Text der  zu Folder und Nodes ausgegeben werden soll
//      <Typ>             : 1 = Folder, 0 = Node
// ====================================================================================

function gllist (bez, div, ladefunktion, immerladen, auswahlfunktion, bildertyp, bilderpfad) {
  this.bez    = bez; // unser Variablenname
  this.div    = div; // unser div-Container
  if (immerladen == 1) { // 1: submenüs nach dem ersten laden nicht  neu laden
     this.store  = 1;
  }else{
     this.store  = -1;
  }
  
  if (bildertyp == null) {
     bildertyp = 0;
  }
  this.bildtyp= bildertyp; //(1=Folder/Node, default =+/--Bilder)
  this.laden  = ladefunktion;
  this.wahl   = auswahlfunktion; // wen dürfen wir bemühen wenn etwas gewählt wurde?
  this.neu    = new this.Add();
  this.bilderF= new Array;
  switch (bildertyp) {
     case 1:
        this.bilderF.push(bilderpfad+"node.gif");
        this.bilderF.push(bilderpfad+"folderclosed.gif");
        this.bilderF.push(bilderpfad+"folderopen.gif");
        this.bilderF.push(bilderpfad+"join.gif");
        this.bilderF.push(bilderpfad+"line.gif");
        this.bilderF.push(bilderpfad+"joinbottom.gif");
        this.bilderF.push(bilderpfad+"empty.gif");
        break;
     default:
        this.bilderF.push(bilderpfad+"ed_view.gif");
        this.bilderF.push(bilderpfad+"close.gif");
        this.bilderF.push(bilderpfad+"offen.gif");
        this.bilderF.push(bilderpfad+"join.gif");
        this.bilderF.push(bilderpfad+"line.gif");
        this.bilderF.push(bilderpfad+"joinbottom.gif");
        this.bilderF.push(bilderpfad+"empty.gif");
        break;
  }
  this.bilder    = this.picPreload(this.bilderF);
  this.container = $(div);
  this.aktwahl   = 0; 
}

gllist.prototype.add = function (zu, id, text, bildid) {
  if (this.neu.zu == "") {
     this.neu.zu = "GL"+this.bez+zu; 
  }
  var eintrag = new this.AddEintrag;
  eintrag.id = "GL"+this.bez+id;
  eintrag.text = text;
  eintrag.bild = bildid;
  this.neu.daten.push(eintrag);
}

gllist.prototype.show = function () {
  if (this.neu.zu == "") {
     return;
  }
  this.neu.daten[this.neu.daten.length -1].last = 1;
  var letzte = new Array;
  if (this.neu.zu == "GL"+this.bez+"0") {
     var vater = $(this.div);
     this.reset(vater);
  }else{
     var vater  = $("inh"+this.neu.zu);
     this.getEbenen(this.neu.zu, letzte);
  }
  for (var i=0; i<this.neu.daten.length; i++) {
      this.addZeile(vater, this.neu.daten[i], letzte);
  }
  this.neu.zu = "";
  this.neu.daten = new Array;
}

gllist.prototype.getEbenen = function (id, letzte) {
  if (id > 0 || id.length > 0) {
     if (typeof id == "string") {
        var idnr  = id;
     }else{
        var idnr = id.toString();
     }
     if (idnr.slice(0,3) == "inh") {
        idnr = idnr.slice(3);
     }
     var letzter   = "inf"+idnr;
     var info      = $(letzter);
     if (info != null) {
        letzte.unshift(info.innerHTML);
     }else{
        letzte.unshift("0");
     }
     var vorg = $(idnr);
     if (vorg != null) {
        vorg = vorg.className.slice(6);
        if (vorg != this.div) {
           if (vorg.slice(0,3) == "inh") {
              vorg = vorg.slice(3);
              this.getEbenen(vorg, letzte);
           }
        }
     }else{
        alert("Vorg.Nr. ($idnr) unbekannt");
     }
  }
}

gllist.prototype.addZeile = function (vater, daten, ebenen) {
  var zeile   = document.createElement("div");
  var linien  = document.createElement("div");
  var oeffnen = document.createElement("div");
  var text    = document.createElement("div");
  var info    = document.createElement("div");
  var inhalt  = document.createElement("div");
  for (var i=0; i<ebenen.length; i++) {
      var ebild = document.createElement("img");
      if (i < ebenen.length-1) {
         if (ebenen[i+1] == 1) {
            ebild.src = this.bilder[6].src;
         }else{
            ebild.src = this.bilder[4].src;
         }
      }else{
         if (daten.last == 1) {
            ebild.src = this.bilder[5].src;
         }else{
            ebild.src = this.bilder[3].src;
         }
      }
      ebild.className = "bild";
      linien.className = "linie";
      linien.appendChild(ebild);
      zeile.appendChild(linien);
  }
  oeffnen.appendChild(this.getOpen(daten.id, daten.bild, "open"));
  oeffnen.id = "o"+daten.id;
  if (daten.bild == 0) {
     oeffnen.className = "Noeffnen";
  }else{
     oeffnen.className = "oeffnen";
  }
  var tlink       = document.createElement("a");
  tlink.href      = "javascript:"+this.bez+".gewaehlt(\""+daten.id+"\");";
  tlink.innerHTML = daten.text;
  tlink.className = "text";
  tlink.id        = "i"+daten.id;
  text.appendChild(tlink);
  text.className = "text";
  
  inhalt.id      = "inh"+daten.id;
  inhalt.className = "zeile";
  info.innerHTML   = "0";
  if (daten.last == 1) {
     info.innerHTML = "1";
  }
  info.id         = "inf"+daten.id;
  info.className  = "vater";
  
  zeile.id        = daten.id;
  zeile.className = "zeile "+vater.id;
  
  zeile.appendChild(oeffnen);
  zeile.appendChild(text);
  zeile.appendChild(info);
  zeile.appendChild(inhalt);
  vater.appendChild(zeile);
}

gllist.prototype.getOpen = function (id, bildid, link) {
   if (bildid == 0) {
      var inh = document.createElement("span");
   }else{
      var inh  = document.createElement("a");
      inh.href = "javascript:"+this.bez+"."+link+"(\""+id+"\");";
   }
   inh.className = "inhalt";
   var obild = document.createElement("img");
   obild.src = this.bilder[bildid].src;
   obild.className = "bild";
   inh.appendChild(obild);
   return inh;
}

gllist.prototype.open = function (id) {
      var parent       = $("o"+id);
      var inhalt       = $("inh"+id);
      this.reset(parent);
      parent.appendChild(this.getOpen(id, 2, "close"));
      parent.id = "o"+id;
      parent.className = "oeffnen";
      if (this.store == 1) {
         if (inhalt.hasChildNodes()) {
            inhalt.className = "inhalt";
            return;
         }
      }
      try {
          eval(this.laden(this.getUid(id)));
      }catch(e) {
          alert("GlList Fehler: Ladefunktion fehlerhaft:"+e.name+" \n=> "+e.message);
      }
}

gllist.prototype.close = function (id) {
   var parent     = $("o"+id);
   var inhalt     = $("inh"+id);
   this.reset(parent);
   parent.appendChild(this.getOpen(id, 1,"open"));  
   if (this.store == 1) {
      inhalt.className = "inhalt_u";
   }else{
      if (inhalt.hasChildNodes) {
         this.reset(inhalt);
      }
   }
}

gllist.prototype.gewaehlt = function (id) {
   if (this.aktwahl != "") {
      var aktNode = document.getElementById("i"+this.aktwahl);
      try {
          aktNode.className = "text";
      }catch(e) {
          // macht nix, der Eintrag ist wohl schon weg..
      }
   }
   var aktNode = document.getElementById("i"+id);
   aktNode.className = "akttext";
   this.aktwahl = id;     
   try {
       eval(this.wahl(this.getUid(id)));
   }catch(e) {
       alert("Fehler GlList: Auswahlfunktion ("+this.wahl+") fehlerhaft");
   }
   var aktTyp = document.getElementById("o"+id);
}

gllist.prototype.getUid = function (id) {
   var uid = 2 + this.bez.length;
   uid     = id.slice(uid);
   return uid;
}
gllist.prototype.reset = function (node) {
  if (node != null && node.hasChildNodes()) {
     var t = node.childNodes.length;
     for (var i=0; i<t; i++) {
         node.removeChild(node.firstChild);
     }
  }
}

gllist.prototype.picPreload = function (bilder) {
  var pics = new Array;
  for (var i=0; i<bilder.length; i++) {
      var bild = new Image();
      bild.src = bilder[i]; 
      pics.push(bild);
  }
  return pics;
}

gllist.prototype.Add = function () {
  this.zu    = "";
  this.daten = new Array;
}
gllist.prototype.AddEintrag = function () {
  this.id   = "";
  this.text = "";
  this.bild = 0;
  this.last = -1;
}
