// Globale Variabeln
var init = false;
var DHTML = false;
var DOM = false;
var IE = false;
var IE7 = false;
var NC = false;
var OP = false;
var mask = null;     // Zugriff auf Transparenz-Maske
var hr = null;       // HttpRequest
var nAlsCls = 0;     // schliessender Bereich
var nAlsFix = 0;     // fixierter Bereich; darf nicht geöffnet/geschlossen werden


// --- Initialisierung -------------------------------------------------------------------------------------------------------------------

// Initialisierung
function initJS()
{
   // DHTML initialisieren
   if (window.opera) {OP = true;}
   if (document.getElementById) {DHTML = true; DOM = true;}
   if (document.all && !OP) {DHTML = true; IE = true;}
   if (window.netscape && window.screen && !DOM && !OP) {DHTML = true; NC = true;}

   // Tranparenz-Maske initialisieren
   if ((mask = getE('mask')))
   {
      // Maske für MAC IE5 mit Raster darstellen
      var ua = navigator.userAgent.toLowerCase();
      if (IE && ua.indexOf('mac',0) != -1) 
      {
         mask.style.backgroundColor = 'transparent';
         mask.style.backgroundImage = 'url(img/trans.gif)';
      }

      // Maske bei IE7 mit position:fixed und ohne Höhenänderung (da gewisse Systeme Höhen grösser 2048px nicht transparent darstellen können)
      if (IE && (p = ua.indexOf('msie')) != -1 && ua.substring(p+5,ua.indexOf('.',p)) == 7)
      {
         IE7 = true;
         mask.style.position = 'fixed';
      }

      // Höhe für Transparenz-Maske setzen
      else {setH();}

      // Transparenz initialisieren (vollständige Transparenz)
      if (!nPup)
      {
         mask.style.filter = 'alpha(opacity:0)';
         mask.style.KHTMLOpacity = .0;
         mask.style.MozOpacity = .0;
         mask.style.opacity = .0;
      }
   }

   // Initialisierung abgeschlossen
   init = true;
}

// --- DHTML-Basics ----------------------------------------------------------------------------------------------------------------------

// Element (DHTML-abhängig zurückliefern)
function getE(p)
{
   if (DOM) {if (typeof document.getElementById(p) == "object") {return document.getElementById(p);} else {return void(0);}}
   else if (IE) {if (typeof document.all[p] == "object") {return document.all[p];} else {return void(0);}}
   else if (NC) {if (typeof document[p] == "object") {return document[p];} else {return void(0);}}
   else return void(0);
}


// --- Transparenz-Maske .----------------------------------------------------------------------------------------------------------------

// Höhe für Transparenz-Maske setzen
function setH()
{
   if (mask && !IE7)
   {
      if (!OP && document.documentElement && document.documentElement.clientHeight)
      {
         if (document.body.scrollHeight && document.body.scrollHeight > document.documentElement.clientHeight) {hWin = document.body.scrollHeight;}
         else {hWin = document.documentElement.clientHeight;}
      }
      else if (document.body && document.body.clientHeight) {hWin = document.body.clientHeight;}
      else if (document.body && document.body.offsetHeight) {hWin = document.body.offsetHeight;}
      else {hWin = 0;}
      var pupl = getE('pupl');
      var pupi = getE('pupi');
      var h = getE('foot');
      if (h == null) {h = getE('cnt');}
      mask.style.height = Math.max(h.offsetTop+h.offsetHeight+20,Math.max(hWin,pupi.offsetHeight+pupl.offsetTop+10))+'px';
   }
}


// --- Scroll ----------------------------------------------------------------------------------------------------------------------------

// y-Scroll-Position zurückliefern
function getScrY()
{
   if (self.pageYOffset) {return self.pageYOffset;}
   else if (window.pageYOffset) {return window.pageYOffset;}
   else if (document.documentElement && document.documentElement.scrollTop) {return document.documentElement.scrollTop;}
   else if (document.body && document.body.scrollTop) {return document.body.scrollTop;}
   else {return 0;}
}


// --- AJAX: XMLHttpRequest --------------------------------------------------------------------------------------------------------------

function hrGet(fnc,f,n)
{
   hr = null;
   try {hr = new ActiveXObject("MSXML2.XMLHTTP");}
   catch (err_MSXML2)
   {
      try {hr = new ActiveXObject("Microsoft.XMLHTTP");}
      catch (err_Microsoft)
      {
         if (typeof XMLHttpRequest != 'undefined') {hr = new XMLHttpRequest;}
      }
   }
   if (hr)
   {
      eval('hr.onreadystatechange = function() {'+fnc+'('+n[4]+','+n[5]+');};');
      hr.open('GET',f+'?nav='+n[0]+'&pag='+n[1]+'&prv='+n[2]+'&typ='+n[3]+'&num='+n[4]+'&val='+n[6],true);
      hr.send(null);
   }
   return hr;
}


// --- Popup und Transparenzmaske (tw. Inhalte mit AJAX nachladen) -----------------------------------------------------------------------

// Popup öffnen (mit AJAX Inhalt nachladen) und Maske einblenden
// - t: STRING: Inhalts-Typ (fal,fgl,..)
// - n: INTEGER: ID des Listeneintrages
// - f: STRING: PHP-Datei für Nachladen
// - a: BOOL: Animation ein-/ausschalten
// - c: BOOL: Blättern-Buttons ein-/ausschalten
function pupOpn(nav,ppg,prv,t,n,f,a,c)
{
   if (init)
   {
      nPupChg = c;
      pTyp = t;
      idPpg = ppg;
      stPrv = prv;
      var lnk = getE('pup'+n)
      if (lnk) {lnk.style.cursor = 'wait';}
      hr = hrGet('hrOpn',f,new Array(nav,ppg,prv,t,n,a,false));
      return !hr;
   }
   else {return true;}
}

// Popup, weiterblättern (mit AJAX Inhalt nachladen)
function pupChg(nav,n,f)
{
   // Warten-Cursor für Blätter-Buttons
   getE('lnkl').style.cursor = 'wait';
   getE('lnkr').style.cursor = 'wait';

   hr = hrGet('hrChg',f,new Array(nav,idPpg,stPrv,pTyp,nPup,false,n));
   return !hr;
}

// Popup schliessen und Maske ausblenden
function pupCls(a)
{
   // Blätter-Buttons ausblenden
   if (nPupChg)
   {
      getE('lnkl').style.visibility = 'hidden';
      getE('lnkr').style.visibility = 'hidden';
   }

   // Popup ausblenden
   getE('pupl').style.visibility = 'hidden';
   getE('pupl').style.height = '0px';
   getE('pupc').innerHTML = '';
   if (prn) {getE('pag').style.height = 'auto'; getE('pag').style.overflow = 'visible';}

   // Maske ausblenden
   if (a) {setTimeout(function () {pupClsA(mskAlpha);},mskWait);}
   else
   {
      mask.style.visibility = 'hidden';
      mask.style.filter = 'alpha(opacity:0)';
      mask.style.KHTMLOpacity = .0;
      mask.style.MozOpacity = .0;
      mask.style.opacity = .0;
      setH();
   }

   return false;
}

// Maske animiert einblenden
function pupOpnA(v)
{
   if (v < mskAlpha)
   {
      v = Math.min(mskAlpha,v+mskScr);
      v2 = v/100;
      mask.style.filter = 'alpha(opacity:'+v+')';
      mask.style.KHTMLOpacity = v2;
      mask.style.MozOpacity = v2;
      mask.style.opacity = v2;
      setTimeout(function () {pupOpnA(v);},mskTim);
   }
   else {setTimeout(function () {pupOpnEnd();},mskWait);}
}

// Popup-Einblenden abschliessen
function pupOpnEnd()
{
   // Popup einblenden
   if (prn) {getE('pag').style.height = '0px'; getE('pag').style.overflow = 'hidden';} else {getE('pupl').style.top = Math.max(pupTop,(getScrY()+pupTop))+'px';}
   getE('pupl').style.visibility = 'visible';
   getE('pupl').style.height = 'auto';

   // Blätter-Buttons einblenden
   if (nPupChg)
   {
      getE('lnkl').style.visibility = 'visible';
      getE('lnkr').style.visibility = 'visible';
   }

   setH();
}

// Maske animiert ausblenden
function pupClsA(v)
{
   if (v > 0)
   {
      v = Math.max(0,v-mskScr);
      v2 = v/100;
      mask.style.filter = 'alpha(opacity:'+v+')';
      mask.style.KHTMLOpacity = v2;
      mask.style.MozOpacity = v2;
      mask.style.opacity = v2;
      setTimeout(function () {pupClsA(v);},mskTim);
   }
   else {mask.style.visibility = 'hidden'; setH();}
}

// Popup, Inhalt einfügen (mit AJAX nachladen)
function hrOpn(n,a)
{
   if (hr.readyState == 4 && hr.status == 200)
   {
      hrTxt();

      // Maske einblenden
      if (a)
      {
         getE('pupl').style.height = '0px';
         mask.style.filter = 'alpha(opacity:0)';
         mask.style.KHTMLOpacity = .0;
         mask.style.MozOpacity = .0;
         mask.style.opacity = .0;
         mask.style.visibility = 'visible';
         pupOpnA(0);
      }
      else
      {
         v = mskAlpha;
         v2 = v/100;
         mask.style.filter = 'alpha(opacity:v)';
         mask.style.KHTMLOpacity = v2;
         mask.style.MozOpacity = v2;
         mask.style.opacity = v2;
         mask.style.visibility = 'visible';
         pupOpnEnd();
      }

      var lnk = getE('pup'+n);
      if (lnk) {lnk.style.cursor = 'pointer';}
   }
}

// Popup, Inhalt wechseln (mit AJAX nachladen)
function hrChg()
{
   if (hr.readyState == 4 && hr.status == 200)
   {
      hrTxt();

      // normaler Cursor für Blätter-Buttons
      getE('lnkl').style.cursor = 'pointer';
      getE('lnkr').style.cursor = 'pointer';

      setH();
   }
}

// Popup, Text einfügen (mit AJAX nachgeladen)
function hrTxt()
{
   eval(hr.responseText);
   nPup = v[0];

   // Blätterbuttons bei Fehler-Seiten ausblenden
   if (!nPup && nPupChg)
   {
      nPupChg = false;
      getE('lnkl').style.visibility = 'hidden';
      getE('lnkr').style.visibility = 'hidden';
   }

   hr.abort();
   hr = null;
   getE('pupc').innerHTML = v[1];
}


// --- Aufklappliste (tw. Inhalte mit AJAX nachladen) ------------------------------------------------------------------------------------

// Aufklappliste: Öffnen oder schliessen starten
// - t: STRING: Inhalts-Typ (fal,..)
// - n: INTEGER: ID des Listeneintrages
// - f: STRING: PHP-Datei für Nachladen
// - a: BOOL: Animation ein-/ausschalten
function als(nav,ppg,prv,t,n,f,a)
{
   if (init)
   {
      pTyp = t;
      hr = true;
      if (!nAlsOpn || !nAlsCls)
      {
         var nCls = (nAlsOpn ? nAlsOpn : 0);
         var nOpn = (n == nAlsOpn ? 0 : n);

         // Bereich schliessen
         if (nCls && nCls != nAlsFix)
         {
            // Objekte initialisieren
            var alse = getE('als'+nCls);
            var alsi = alse.firstChild;
            var anew = alse.parentNode;
            var prt = anew.parentNode;
            var obj = anew.nextSibling;
            if (obj.nodeType == 3) {var blk = obj.nextSibling; prt.removeChild(obj);} else {var blk = obj;}

            nAlsCls = nCls;
            if (nAlsOpn == n) {nAlsOpn = 0;}

            // Textbereich ausblenden
            if (a) {alsScrCls(nCls,alse,blk,blk.offsetHeight);}
            else {alsCls(alse,alsi,prt,blk,nCls);}
         }

         if (nOpn && nOpn != nAlsFix)
         {
            // Bereich ist schliessend => öffnen
            if (a && nOpn == nAlsCls)
            {
               // Objekte initialisieren
               var alse = getE('als'+nCls);
               var alsi = alse.firstChild;
               var anew = alse.parentNode;
               var prt = anew.parentNode;
               var blk = anew.nextSibling;

               nAlsOpn = nOpn;
               nAlsCls = 0;

               // Textbereich einblenden
               alsScrOpn(nOpn,blk,blk.offsetHeight);
            }

            // Bereich ist geschlossen => diesen öffnen (mit AJAX Inhalt nachladen)
            else if (init && nOpn != nAlsFix)
            {
               // Änderungen verhindern
               nAlsFix = nOpn;
               getE('als'+nOpn).style.cursor = 'wait';
               hr = hrGet('hrAls',f,new Array(nav,ppg,prv,t,nOpn,a,false));
            }
         }
      }

      return !hr;
   }
   else {return true;}
}


// Aufklappliste, aufklappen (mit AJAX-Inhalt nachladen)
function hrAls(n,a)
{
   if (hr.readyState == 4 && hr.status == 200)
   {
      // Objekte initialisieren
      var alse = getE('als'+n);
      var alsi = alse.firstChild;
      var anew = alse.parentNode;
      var prt = anew.parentNode;
      var nxt = anew.nextSibling;

      // Liste: aufgeklappte Darstellung
      alse.className = 'alse aop';
      alsi.className = 'alsi aop';

      // Block mit Text einfügen
      // Zeile nötig, damit IE6 keinen Fehler erzeugt!
      eval(hr.responseText);
      hr.abort();
      hr = null;
      var blk = document.createElement('div');
      blk.className = 'blk opn';
      blk.innerHTML = '<div class="lopi">'+v+'</div style="height:20px;"></div></div>';
      prt.insertBefore(blk,nxt);
      if (a) {blk.style.height = '0px';}

      // Änderungen zulassen
      nAlsOpn = n;
      if (nAlsCls == n) {nAlsCls = 0;}
      nAlsFix = 0;
      alse.style.cursor = 'pointer';

      // Textbereich einblenden
      if (a) {alsScrOpn(n,blk,0);} else {setH();}
   }
}

// Aufklappliste, Bereich animiert einblenden
function alsScrOpn(n,blk,h)
{
   hmax = blk.scrollHeight;
   if (h < hmax)
   {
      if (n == nAlsOpn)
      {
         h = Math.min(h+scrScr+Math.round(h*scrFkt),hmax);
         blk.style.height = h+'px';
         setTimeout(function () {alsScrOpn(n,blk,h);},scrTim);
      }
   }
   else
   {
      // Masken-Höhe bei Bedarf anpassen
      setH();
   }
}

// Aufklappliste, Bereich animiert ausblenden
function alsScrCls(n,alse,blk,h)
{
   if (h > 0)
   {
      if (n == nAlsCls)
      {
         h2 = h;
         h = Math.max(h-scrScr-Math.round(h*scrFkt),0);
         blk.style.height = h + 'px';
         window.scrollBy(0,h-h2);     // Seite entsprechend Schliessung scrollen; verhindert, dass am Ende ruckartiger Scroll für verkürzte Seite durchgeführt wird)
         setTimeout(function () {alsScrCls(n,alse,blk,h);},scrTim);
      }
   }
   else
   {
      // Objekte initialisieren
      var alse = getE('als'+n);
      var alsi = alse.firstChild;
      var anew = alse.parentNode;
      var prt = anew.parentNode;
      var blk = anew.nextSibling;

      alsCls(alse,alsi,prt,blk,n);
   }
}

// Aufklappliste, Ausblenden abschliessen
function alsCls(alse,alsi,prt,blk,n)
{
   // Änderungen verhindern
   nAlsFix = n;
   alse.style.cursor = 'wait';

   // Liste: zugeklappte Darstellung
   alse.className = 'alse acl';
   alsi.className = 'alsi acl';

   // Bereich mit Text entfernen
   prt.removeChild(blk);

   // Änderungen zulassen
   nAlsCls = 0;
   nAlsFix = 0;
   alse.style.cursor = 'pointer';

   // Masken-Höhe bei Bedarf anpassen
   setH();
}