/* Abwandlung von toggle.js; Quelle: http://Coding.binon.net/Toggle */

function toggle(type, element, toggleID) 
{
  // Lokale Variable definieren
  var i, j, t, type0, start = 0, result = 0;
  var obj, objName, objFirst = -1, objLast = -1, objCount, exceptions, lastArgument, xSwitch;
  var toggleDisplay, displayType, displayStyle, displayXStyle;
  var toggleAttribute = "gid"; // hier ggf. gewuenschten Standard-Attribut-Namen eintragen (z.B. "id")
  
  // Aktionstyp vereinheitlichen/definieren (Standard: "Falten")
  type = (type)?type.toLowerCase():"fold";
  
  // Wurde Elemente-Begrenzung uebergeben?
  if(element) 
  {
    i = element.indexOf("{"); 
    j = element.indexOf("}", i);
    if(i >=  0 && j >=  0) 
    {
      objFirst = parseInt(element.substring(i+1, element.indexOf("-", i)));
      objLast = parseInt(element.substring(element.indexOf("-", i)+1, j));
      element = element.substring(0, i);
    }
  }
  
  // Aktionsflags definieren
  toggleDisplay = (type.indexOf("fold")+1);    // Style display verwenden


  // "Ent-/Falten" (Darstellung ohne Platzhalter: display)?
  // ------------------------------------------------------
  if(toggleDisplay) 
  {
    displayType = "";

    // Spezielle Darstellungsart uebergeben?
    i = type.indexOf("fold:");
    if(i >= 0) 
    {
      // Ja, also Trenn-Positionen der Art festlegen, ...
      i += 4; 
      j = type.indexOf(" ", i)
      // ... und Aktion von Darstellungsart trennen
      displayType = type.substring(i + 1, (j < 0)?type.length:j);
      
      // Darstellungsart "none" aus logischen Gruenden nicht zulassen
      displayType = (displayType == "none")?"":displayType;
    }
    
    // Aktionsstyle und Ausnahmestyle festlegen
    if(type.indexOf("unfold") >= 0) 
    {
      displayStyle = displayType; 
      displayXStyle = "none";
    } 
    else 
    {
      displayStyle = "none"; 
      displayXStyle = displayType;
    }
  }
  
  /* ----------------------- */
  /* Beginn der Hauptroutine */
  /* ----------------------- */
  
  // Toggling per ID?
  if(document.getElementById && document.getElementById(element)) 
  {
    // ID gefunden: Kurzform fuer Element-Objekt definieren
    obj = document.getElementById(element);

    result = 1;
  
    // Darstellung ohne Platzhalter
    // ----------------------------
    if(toggleDisplay) 
    {
      // Display-Style setzen
      obj.style.display = displayStyle;
    }
    // ID nicht gefunden!
  } 
  else if(document.getElementsByTagName) 
  {
    // Enthaelt element nicht nur Tag-, sondern auch Attributnamen?
    i = element.indexOf(":");
    if(i >= 0) 
    {
      // Ja, also toggleAttribut neu definieren und element anpassen
      toggleAttribute = element.substring(i+1, element.length);
      element = element.substring(0, i);
    }
  
    // Sind gesuchtes Element vorhanden und eine Basiskennung definiert?
    if(document.getElementsByTagName(element).length && toggleID) 
    {
      // Letzter Parameter ist true/false?
      lastArgument = (typeof(toggle.arguments[toggle.arguments.length-1]) == "boolean")?-1:0;

      // "Switch"-Effekt?
      xSwitch = (lastArgument)?toggle.arguments[toggle.arguments.length-1]:false;

      // Ausnahme-Kennungen in einem String zusammenfassen (Basiskennung+Restkennung+Pipe-Symbol als Trenner)
      exceptions = toggleID; 
      for(i = 3; i < (toggle.arguments.length + lastArgument); i++) 
      { 
        exceptions+= toggle.arguments[i] + "|"; 
      }
      i = exceptions.indexOf("|"); 
      t = ""; 
      while(i >= 0) 
      { 
        t += exceptions.substring(start, i+1) + toggleID; 
        start = i+1; 
        i = exceptions.indexOf("|", start); 
        if(!i) 
        { 
          break; 
        } 
      }
      exceptions = t.substring(0, t.length-toggleID.length);
  
      // Kurzform fuer Element-Objekt definieren
      obj = document.getElementsByTagName(element);
      
      // Start- und Endelement sowie zu bearbeitende Anzahl festlegen
      objFirst = (objFirst<0)?0:Math.max(0, objFirst);
      objLast  = (objLast<0)?obj.length:Math.min(obj.length, objLast);
      objCount = (objLast-objFirst)+1;
      
      // Alle passenden Objekte durchgehen
      for(i = objFirst; i < objLast; i++) 
      {
        // Kennung des aktuellen Elementes auslesen (und mit Trenner versehen)
        objName = obj[i].getAttribute(toggleAttribute);

        // Existiert Kennung und beginnt diese auch mit der Basiskennung?
        if(objName && objName.substring(0, toggleID.length) == toggleID) 
        {
          result ++;
          
          // Element steht in der Ausnahmeliste?
          toggleException = (exceptions.indexOf(objName+"|")>= 0)?true:false;
          
          // Darstellung ohne Platzhalter
          // ----------------------------
          if(toggleDisplay) 
          {
            // Auf jeden Fall Style setzen (entweder/oder)?
            if(xSwitch) 
            {
              // Display-Style unbedingt setzen
              obj[i].style.display = (toggleException)?displayXStyle:displayStyle;
            } 
            else if(!toggleException) 
            {
              // Einfachen Display-Style setzen
              obj[i].style.display = displayStyle;
            }
          }
        }
      }
    } 
  } 

  return result;
}

