/* ========================================================================== */
/* Mail-Funktion. Es wird nach Klicken des "Briefumschlags" das installierte  */
/* e-Mail-Programm gestartet (z.B. Outlook-Express) und das Empfänger- und    */
/* Betreff-Feld ausgefüllt wie in der function vorgegeben                     */
/* ========================================================================== */
function mail_an (kkb_id,subj,text)
{
  /*  Sonderzeichen in subj und text:
      \n\r Zeilenumbruch und Wagenrücklauf...
  */
  // escape geht im Zusammenh. mit OE bei Umlauten korrekt, encodeURI aber nicht????
  var k1="kath-";
  var k2="kirche-";
  var k3="belm"+"."+"de";
  var kkb=k1+k2+k3;
  var s = "mailto:"+kkb_id+"@"+kkb;
  if (subj != "") {s = s + "?subject="+escape(subj);}
  if (text != "")
    {
    if (subj == "") {var st = "?";} else { var st = "&"; }
    s = s + st + "body="+escape(text);
    }
  location.href=s;
}

function starteinblendung(text)
{
var s = "<span class='einblendung'>Hinweis der Kath. Kirchengemeinde Belm:</span>"
        + hr("crimson","90%","1px")
        + "<span class='normal' style='text-align:left; font-size:100%; font-weight:bold; color:maroon;'>"
        + text
        + "</span><br>"
        + hr("crimson","90%","1px")
        + "<span class='einblendung' style='font-size:75%; text-decoration:underline;'>Zum Schließen in diesen Rahmen klicken</span>";
document.getElementById("einblendung").innerHTML = s;
setTimeout('document.getElementById("einblendung").style.visibility = "visible";',1000);
}

function endeeinblendung()
{
document.getElementById("einblendung").style.visibility = "hidden";
}

function hr (farbe,breite,hoehe)
{
var my_hr = "<hr style='width:"+breite+"; color:"+farbe+"; height:"+hoehe+"; text-align:center; border:0px solid white;'>";
return my_hr;
}


var design_faktor_auswahl = new Array(0.75,    1.09,    1.16,    1.25,    1.35,    1.45); // erster Faktor für Drucker!
var design_faktor = 3;                        // Standardvorwahl 3 = 125%
var design_faktor_alt = design_faktor;
var startfonthoehe = 320;                   // siehe in emsTweak

function emsTweak()
{
  if ((document.createElement) && (document.createTextNode))
    {
      if (!document.getElementById("fontTweakElement"))   // nur beim 1. Mal das div erzeugen
        {
          document.write('<div id="fontTweakElement" style="position:absolute; visibility:hidden; font-family:arial,helvetica,sans-serif;">A<br>A<br>A<br>A<br>A<br>A<br>A<br>A<br>A<br>A<br>A<br>A<br>A<br>A<br>A<br>A<br>A<br>A<br>A<br>A<br></div>');
          // in IE und NS gibt das bei "mittel" bzw. 100% Schriftgröße im Browser 320 Pixel bei der Höhe...

          var elem = document.getElementById("fontTweakElement");

          if (elem.clientHeight) { startfonthoehe = elem.clientHeight; }
          else if (elem.offsetHeight) { startfonthoehe = elem.offsetHeight; }
        }
      var sfak = Math.round(design_faktor_auswahl[design_faktor]*320/startfonthoehe*100)+"%";
      document.body.style.fontSize = sfak;
    }
}

function set_design_faktor(n)
{
  design_faktor_alt = design_faktor;
  design_faktor = n;
  emsTweak();
}


function schriftgroesse (n)
{
  if ( n!=design_faktor )
    {
      set_design_faktor(n);
      if (n > 0)
        {
          for (var i=1; i<=5; i++)
            {document.getElementById('fs'+i).innerHTML = i; }
          document.getElementById('fs'+n).innerHTML = '<span class="textmarker">'+design_faktor+'</span>';  //"textmarker" auf neuer akt. Größe setzen
      }
    }
}


function getWindowWidth(WinObjekt)
{
  return WinObjekt.innerWidth ? WinObjekt.innerWidth : WinObjekt.document.body.clientWidth;
}


function getWindowHeight(WinObjekt)
{
  return WinObjekt.innerHeight ? WinObjekt.innerHeight : WinObjekt.document.body.clientHeight;
}

function my_screenh()
{
  var mh = getWindowHeight(window) - 250;   // ist nur ein halbwegs passender Wert...
  if (mh < 0) mh = 10;
  return mh;
}



var IE = document.all?true:false;

var home_path = "";

var go_url = "";         // zur Zeit
function seturl (s)      // nicht
{ go_url = s; }          // benutzt


function goSitemap()
// home_path wird in mach_titel gesetzt, pfad zum root-dir
// hier wird das Einblenden der Sitemap dazugebastelt, diese
// wird dann angezeigt.
{
//  document.URL = home_path+'index.html?Reiter=1';
  window.open(home_path+'index.html?Reiter=1','_self');
}


function ausdruck (object)
{
/* Inhalt von "seiteninhalt" merken,
   Inhalt von "seite" merken
   "seite" mit nur dem "seiteninhalt" belegen (keine spalten, alles im Style "seiteninhalt1")
   auf sehr kleine (nur für Drucker gedachte) Schriftgröße wechseln,
   ausdrucken,
   wieder zurück auf vorher eingestellte Schriftgröße
   und "seite" wieder komplett restaurieren
   Für NS und Konsorten funktioniert das nicht, auch ein reload der Seite bei diesen geht "während" des Druckens nicht... */


  if (document.getElementById("m_ansicht"))
    if (document.getElementById("m_ansicht").innerHTML.search(/Vollansicht/) >=0 )  // muss zum String in wechsle... passen
      if (window.confirm("Mit [OK] Mitteilungen für den Ausdruck auf Langform einstellen?\nMit [Abbrechen] wird wie vorliegend gedruckt."))
        wechsle_mitteilungsansicht();

  drucken = document.getElementById("seiteninhalt").innerHTML;
  alles   = document.getElementById("seite").innerHTML;
  document.getElementById("seite").innerHTML = '<div id="seiteninhalt1">'+drucken+'</div>';
  schriftgroesse(0);

  if (!IE)
    {
      alert ("NS/Moz/FFox-Anwender müssen NACH dem Druckdialog\ndie Seite neu laden (Strg-R),\nda ihr Browser die automatische\n Neukonfiguration nicht unterstützt!");
    }
  if (object.print()) {object.focus(); object.print(); };
  if (IE)
    {
    document.getElementById("seite").innerHTML = alles;
    schriftgroesse(design_faktor_alt);
    }
}


function mach_titel (s,p)
/*  Titel und Fußbereich erzeugen, man macht das hier halt einmal für alle Seiten, dann sind auch Änderungen recht
    simpel einzupflegen...
    Die if-Abfrage: weil man diese Funktion dann auch aufrufen kann, wenn mal das eine, mal das andere fehlt,
    ohne dass dabei ein Fehler auftritt...
    Übergeben wird in s entweder eine Bezeichnung ("Mitteilungen"...) für die Seite, oder auch eine html-Anweisung, z.B.
    wenn man dort ein Bild einbauen will... In p wird der relative Pfad zum Logo übergeben
*/
{

home_path = p;

var t  = '<table width="100%" style="border:0;">'
       + '  <tr>'
       + '    <td width="140" style="text-align:left; padding:3px; color:maroon;">'


       + ' <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://active.macromedia.com/flash4/cabs/swflash.cab#version=4,0,0,0" id="kkb-ani-logo" width="138" height="46" onClick="goHome();"> <param name="movie" value="'+p+'grafiken/kkb-ani-logo.swf"> <param name="quality" value="high"> <param name="bgcolor" value="#FFEFD5">'

       + ' <embed name="Film1" src="'+p+'grafiken/kkb-ani-logo.swf" quality="high" bgcolor="#FFEFD5"  width="138" height="46" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"> </embed>'


       + ' </object>'



       + '    </td>'
       + '    <td style="font-size:145%; font-weight:bold; letter-spacing:0.05em; background:papayawhip; color:maroon; padding-left:18px;">'
       +        s
       + '    </td>'
       + '  </tr>'
       + '  <tr>'
       + '    <td width="140">'
       + '      <img src="http://www.kath-kirche-belm.de/phputils/datumsgrafik/datum.php" align="left" alt="heute">'
//       + '      <img src="http://www.kath-kirche-belm.de/php_hilfsfunktionen/datum.php" align="left" alt="heute">'
       + '    </td>'
       + '    <td style="color: dimgray; font-size:65%; font-weight:normel; padding-left:18px;">'
       +        'Katholische Kirchengemeinde St.&#160;Dionysius und St.&#160;Josef Belm&#160;&#160;&#160;&#149;&#160;&#160;&#160;<a href="'+p+'impressum.html" style="color:dimgray;">Impressum</a>&#160;&#160;&#160;&#149;&#160;&#160;&#160;<a href="'+p+'index.html?Reiter=1" style="color:dimgray;">Sitemap</a>'
       + '    </td>'
       + '  </tr>'
       + '</table>';
//   alert (t);

if (document.getElementById("seitentitel"))  document.getElementById("seitentitel").innerHTML = t;

t =  '<a href="'+p+'index.html?Reiter=1" style="color:dimgray; text-decoration:none;">Copyright &copy; 2004-2012 Katholische Kirchengemeinde Belm';
t = t + '<br>Seite aktuell vom '+document.lastModified + '</a>';
if (document.getElementById("fusszeile")) document.getElementById("fusszeile").innerHTML = t;
}


var ihtml = new Array();              // für die Texte OHNE Separatorzeichen
var orightml = new Array();           // für die Original-Mitteilungstexte MIT Separator
var orightml_ohne_sep = new Array();  // für die Original-Mitteilungstexte OHNE Separator
var orightml_kurz = new Array ();     // gekürzte Mitteilungstexte (mit "...mehr" dran)
var orightml_2 = new Array();         // für die Überschriften
var gefundene = 0;                    // gefundene Suchworte
var anzmitteilungen = 0;              // wird anfangs in "sichern" gesetzt

var seite_ganz = '';
var seite_mitte = '';
var seite_links = '';
var seite_rechts = '';
var spaltenansicht = true;

function top_of_page_etc()
{
/*  hängt das TOP- und Sitemap-Symbol an die Mitteilungen an. Durchsucht alle <Span's>, wenn darin ein "(yyyy-mm-dd)" gefunden wird (genau so etwas, sonst nichts), werden die Symbole angehängt. Das eigentliche Datum wird nicht weiter geprüft, also auf
    so etwas wie 9876-34-56 oder so...
    reg. Ausdruck:   ^      Satzanfang
                     \(     eine runde Klammer auf
                     \d{4}  genau 4 Ziffern
                     [-]    Zeichen -
                     ...
                     ...
                     \)     eine runde Klammer zu
*/
  l=document.getElementsByTagName("span").length;
  var first=true;
  for (i=0; i<l; i++)
  {
    element = document.getElementsByTagName("span")[i];
    var s = element.innerHTML;
    if (s.match(/^\(\d{4}[-]\d{2}[-]\d{2}\)/))
      {
        var t = '&#160;&#160;<a href="#topofpage"><img src="topofpage.gif" hspace="5" border="0" alt="Zum Seitenanfang"></a>&#160;&#160;<a href="http://www.kath-kirche-belm.de/index.html?Reiter=1"><img src="sitemap.gif"  border="0" alt="Zur Sitemap"></a>';
        if (spaltenansicht)
          { t = t + '&#160;&#160;<img src="spalten_aus.gif" border="0" alt="Randspalten ausblenden" onclick="javascript:spalten_aus();">'; }
        else
          { t = t + '&#160;&#160;<img src="spalten_ein.gif" border="0" alt="Randspalten einblenden" onclick="javascript:spalten_ein();">'; }

        element.innerHTML = s.substr(0,12)+t;

        var jahr =  parseInt (s.substr(1,4),10);
        var monat =  parseInt (s.substr(6,2),10);
        var tag = parseInt (s.substr(9,2),10);
        var mitteilungs_zeit = Date.UTC(jahr,monat-1,tag);  // UTC-Zeit: Mitteilungsdatum um 00:00:00 Uhr
        var differenz = new Date();                         // lokale Zeit auf dem Rechner des Anwenders
        var schon_aelter = 5*24*60*60*1000;                 // nach 5 Tagen gilt eine Mitteilung als "schon älter"...
        var zeitunterschied = differenz.getTime()-mitteilungs_zeit-differenz.getTimezoneOffset()*60*1000;
        if (zeitunterschied < schon_aelter)  element.className = "brandaktuell_vom";
      }
  }
}


function spalten_aus ()
{
/* Inhalt von "seiteninhalt" merken,
   Inhalt von "seite" merken
   "seite" mit nur dem "seiteninhalt" belegen (keine spalten, alles im Style "seiteninhalt1")
*/
  seite_links = document.getElementById("spaltelinks").innerHTML;
  seite_rechts = document.getElementById("spalterechts").innerHTML;

  seite_ganz = document.getElementById("seite").innerHTML;

  seite_mitte = document.getElementById("seiteninhalt").innerHTML;
  document.getElementById("seite").innerHTML = '<div id="seiteninhalt1">'+seite_mitte+'</div>';
  spaltenansicht = false;
  top_of_page_etc();
}

function spalten_ein ()
{
/* Inhalt von zuvor gemerktem "seite"-Inhalt (alles mit Spalten...) restaurieren
*/
  seite_mitte = document.getElementById("seiteninhalt1").innerHTML;
  document.getElementById("seite").innerHTML = '<div id="spaltelinks">'+seite_links+'</div><div id="spalterechts">'+seite_rechts+'</div><div id="seiteninhalt">'+seite_mitte+'</div>;'
  spaltenansicht = true;
  top_of_page_etc();
}

function sichern_origs()
{
  var i = document.getElementsByTagName("h2").length;
  var j = document.getElementsByTagName("h3").length;
  if (i != j)
  {
    alert ("Struktur des Dokuments passt nicht, H2 <> H3!")
  }
  else
  {
    anzmitteilungen = i;
    for (var k=0; k<i; k++)
    {
      orightml[k] = document.getElementsByTagName("h3")[k].innerHTML;
      var s = orightml[k];                  // volles innerHTML vor Kürzen,
      orightml_kurz[k] = s;                 // falls da kein Separator | enthalten ist, auch so speichern...
      orightml_ohne_sep[k] = s;             // ditto...
      sep = s.indexOf('|',0);               // sonst nach | suchen, falls vorhanden, ab da kürzen und um "...mehr" ergänzen
      if (sep > -1)
        {
        teil1 = s.substr(0,sep);            // alles bis vor's |
        teil2 = s.substr(sep+1);            // alles hinter dem |  (ohne selbiges);
        orightml_ohne_sep[k] = teil1+teil2;     // alles ohne das |
        cmd = '&nbsp;&nbsp;<a class="sehrklein" href="javascript:langmitteilung('+k+');"><span class="textmarker">...mehr</span></a>';
        orightml_kurz[k] = teil1+cmd;
        }


      orightml_2[k] = document.getElementsByTagName("h2")[k].innerHTML;
    }

  }
}

function kurzmitteilungen()
// die gekürzte Version der Mitteilungen anzeigen, das MUSS anfangs einmal sein!!
{
  for (i=0; i<anzmitteilungen; i++)
    {
      document.getElementsByTagName("h3")[i].innerHTML = orightml_kurz[i];
      document.getElementsByTagName("h2")[i].innerHTML = orightml_2[i];
    }
}

function langmitteilung (n)
// wieder die komplett lange Mitteilung einsetzen Nr. n
{
  document.getElementsByTagName("h3")[n].innerHTML = orightml_ohne_sep[n];
  document.getElementsByTagName("h2")[n].innerHTML = orightml_2[n];
}

function langmitteilungen ()
// wieder die komplett lange Mitteilung einsetzen
{
  for (i=0; i<anzmitteilungen; i++)
    {
      document.getElementsByTagName("h3")[i].innerHTML = orightml_ohne_sep[i];
      document.getElementsByTagName("h2")[i].innerHTML = orightml_2[i];
    }
}

function wechsle_mitteilungsansicht ()
// Wechseln der Ansicht der Mitteilungen und des "Schalters" m_ansicht.
// Die geprüften String müssen mit denen des HTML-Dokuments übereinstimmen
{
if (document.getElementById("m_ansicht").innerHTML == "Vollansicht zeigen")
  {
  langmitteilungen();
  document.getElementById("m_ansicht").innerHTML = "Kurzansicht zeigen";
  }
else
  {
  kurzmitteilungen();
  document.getElementById('m_ansicht').innerHTML = "Vollansicht zeigen";
  }
}

function stringreplace (zeichenkette,suchstring,prestring,poststring)
/* ersetzt in zeichenkette den caseInsensitiv gesuchten String suchstring durch die Zeichenfolge
   prestring+(Originalwert in Zeichenkette)+poststring, d.h. z.B. aus dem Satz
   Die durch die Zeitverschiebung...       wird bei suchstring "die"  und pre=< post=> der Satz
   <Die> durch <die> Zeitverschiebung...   (egal, man kann als Suchstring auch dIe oder DIE oder so angeben
*/
{
 var rex = new RegExp (suchstring,"i");
 var temp = zeichenkette;
 var tempneu = "";
 var posi = temp.search (rex);
 while (posi >= 0)
   {
   gefunden = gefunden+1;
   var prestring_insert = prestring.replace(/mymysterynumber/,(gefunden-1));
   prestring_insert = prestring_insert.replace(/mymysterynextnumber/,(gefunden));
   // letzter Verweis ins "Nirwana", ist aber egal, da springt dann eben nichts...
   tempneu = tempneu + temp.substr(0,posi)+prestring_insert+temp.substr(posi,suchstring.length)+poststring;
   temp = temp.substr (posi+suchstring.length);
   posi = temp.search (rex);
   }
 tempneu = tempneu+temp;
 return tempneu;
}

function text_in_mitteilung_suchen()
// noch experimentell.
{
var suchs = document.getElementById("suchwort").value;
var suchs_trim = suchs.replace(/ /g,"");
suchs = suchs_trim;
document.getElementById("suchwort").value = suchs;
if (suchs == "")
{
  alert ("NIX ha\'mwer nich...");
}
else
{
  langmitteilungen();
  document.getElementById("m_ansicht").innerHTML = "Kurzansicht zeigen";

  var tags = new Array ("h2","h3");
  var prestring = '<a name="fundstellemymysterynumber" href="#fundstellemymysterynextnumber" style="text-decoration:none"><span class="textmarkergruen">';
  var poststring = '</span></a>';
  gefunden=0;
  for (var i=0;i<anzmitteilungen;i++)
    for (var j=0;j<=1;j++)
    {
      var suchst = document.getElementsByTagName(tags[j])[i].innerHTML;
      var st = markiere (suchst,suchs,prestring,poststring);
      document.getElementsByTagName(tags[j])[i].innerHTML = st;
    }

  if (gefunden==0)
    {
      alert ("Suchwort wurde nicht gefunden");
    }
  else
    {
      var pr=  gefunden + " Treffer markiert für <b>"+document.getElementById("suchwort").value+"</b> in Vollansicht.<br>Die ";
      if (gefunden > 1) pr = pr + 'erste ';
      pr = pr + 'Fundstelle durch Klicken dieses Kastens ansteuern,';
      if (gefunden > 1) pr = pr + " weitere Fundstellen durch Klicken der markierten Verweise.";

      /*
           kind'a tricky...

      Im HTML-Dokument gibt's so etwas:
      <a href=#fundstelle0><div id="fundstelleneinblendung" ..."hidden" onclick="versteckdichselbst"></div></a>

      Jetzt geht folgendes ab:
      1. Es wurde eine Fundstelle gefunden, also gibt es den Anker 'fundstelle0', d.h. das href wird funktionieren,
         wenn man das div irgendwie anklickt.
      2. Das Div innerhalb des href ist vorher hidden, wird also bis jetzt nicht angezeigt, daher kann man bis hierher
         auch weder den "falschen Anker" noch das div klicken.
      3. Man kann aber den innerHTML des divs setzen (macht man jetzt gleich)
      4. Dann wird das div "visible" geschaltet und ist mit dem gesetzten Text sichtbar, es funktioniert jetzt als
         Anker-Inhalt. Wenn man es also anklickt, geht's zu #fundstelle0, die ja dann existiert.
      5. das div hat den onclick-Event "mach' dich selbst vom Acker" (unsichtbar), also wird der Klick auf's Div erst
         die Sichtbarkeit wegnehmen, dann wird der durch Klicken des divs ausgelöste Sprung auf das Ziel des Verweises
         (fundstelle0) ausgelöst...

       */

      document.getElementById("fundstelleneinblendung").innerHTML = pr;
      document.getElementById("fundstelleneinblendung").style.visibility = "visible";
    }
}
}

function markiere (s,suchwort,prestring,poststring)
{
/* der übergebene string s wird nach dem suchwort abgesucht, dabei wird eine einfache
   tag-Auslassung (nicht vollkommen!) angewandt, sodass nur die reinen Textbestandteile
   untersucht werden. In diesen wird dann das suchwort "grün markiert"...
   Rückgabewert ist der so mit Markierung(en) versehene String s.
*/
  var bricks = new Array();
  var typen  = new Array();
  var i = bricks.length;

  var t = s;
  var p_tag_auf = t.indexOf ("<");
  var p_tag_zu  = t.indexOf (">");
  var vor_tag = "";
  var tag = "";

  while ((p_tag_auf > (-1)) && (p_tag_zu > p_tag_auf))
  {
    vor_tag = t.substr(0,p_tag_auf);
    tag = t.substr(p_tag_auf,p_tag_zu - p_tag_auf + 1);
    bricks[i] = vor_tag;
    typen[i] = "text";
    i = bricks.length;
    bricks[i] = tag;
    typen[i] = "tag";
    i = bricks.length;
    t = t.substr (p_tag_zu+1);
    p_tag_auf = t.indexOf("<");
    p_tag_zu  = t.indexOf(">");
  }

  if (!(t == "")) { bricks[i] = t; typen[i] = "text"; i=bricks.length; };
  for (var j=0; j<i; j++)
  { if (typen[j] == "text")
      bricks[j] = stringreplace (bricks[j],suchwort,prestring,poststring);
  }
  t = "";
  for (j=0; j<i; j++) {t = t + bricks[j];}
  return (t);
}

function Argumente()
{
  var arg = new Array();
  var location = window.location.search;
  if (location.length > 0)
  {
    location = location.substr(1, location.length - 1);
    arg = location.split("&");
  }
  else
  {
    arg[0] = false;
  }
  return arg;
}

function VArgumente()
// Argumente auslesen und im Array speichern
{
  var erg = new Array();
  var arg = new Array();

  var location = window.location.search;
  if (location.length > 0)
  {
    location = location.substr(1, location.length - 1);

    erg = location.split("&");

    for (var i=0; i<erg.length; i++)
    {
      var x = new Array();
      x = erg[i].split("=");
      arg[x[0]] = x[1];
    }
  }
  else
  {
    arg[0] = false;
  }

  return arg;
}


function tabinh(n)
// die Tabellenreiter, Hintergründe der Hilfsfelder... auf der Startseite setzen
{
var texte = new Array();                // Textfarben für aktive/nicht aktive Reiter
texte[false] = "maroon";
texte[true ] = "orangered";
var hintergrund = new Array();          // Hintergrundfarbe des aktiven/nicht aktiven Reiters
hintergrund[false] = "#FAF9F9";
hintergrund[true ] = "#FFFFFC";
var trennhintergrund = new Array();     // Hintergrund der "Hilfsfelder" (für NS... notwendig)
trennhintergrund[false] = "darkgray";
trennhintergrund[true]  = "#FFFFFC";
for (var i=1; i<= 3; i++)
  {
    var hit = (i==n);
    document.getElementById("td"+i).style.color = texte[hit];
    document.getElementById("td"+i).style.backgroundColor = hintergrund[hit];
    document.getElementById("tds"+i).style.backgroundColor = trennhintergrund[hit];
    if (hit) document.getElementById("tabinhalt").innerHTML = document.getElementById("tabinhalt"+i).innerHTML;
  }
}


function Tabellenreiter_zeigen(n)
// zeigt einen Reiter, im Falle falschen Parameters immer die Sitemap=1
{
  var anzeigen = Math.floor(n);
  if (anzeigen < 1) anzeigen = 1;
  if (anzeigen > 3) anzeigen = 1;
  tabinh(anzeigen);
}


var base64s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

function base64_encode(decStr)  // Dank an Dr. Web...
{
 var bits;
 var dual;
 var i = 0;
 var encOut = '';
 while(decStr.length >= i + 3)
 {
  bits = (decStr.charCodeAt(i++) & 0xff) << 16 |
         (decStr.charCodeAt(i++) & 0xff) <<  8  |
          decStr.charCodeAt(i++) & 0xff;
  encOut += base64s.charAt((bits & 0x00fc0000) >> 18) +
            base64s.charAt((bits & 0x0003f000) >> 12) +
            base64s.charAt((bits & 0x00000fc0) >>  6) +
            base64s.charAt((bits & 0x0000003f));
 }
 if(decStr.length -i > 0 && decStr.length -i < 3)
 {
  dual = Boolean(decStr.length -i -1);
  bits = ((decStr.charCodeAt(i++) & 0xff) << 16) |
         (dual ? (decStr.charCodeAt(i) & 0xff) <<  8 : 0);
  encOut += base64s.charAt((bits & 0x00fc0000) >> 18) +
            base64s.charAt((bits & 0x0003f000) >> 12) +
            (dual ? base64s.charAt((bits & 0x00000fc0) >> 6) : '=') +
            '=';
 }
 return(encOut);
}

function base64_decode(encStr)  // Dank an Dr. Web...
{
 var bits;
 var decOut = '';
 var i = 0;
 for(; i<encStr.length; i += 4)
 {
  bits = (base64s.indexOf(encStr.charAt(i))    & 0xff) << 18 |
         (base64s.indexOf(encStr.charAt(i +1)) & 0xff) << 12 |
         (base64s.indexOf(encStr.charAt(i +2)) & 0xff) <<  6 |
          base64s.indexOf(encStr.charAt(i +3)) & 0xff;
  decOut += String.fromCharCode((bits & 0xff0000) >> 16, (bits & 0xff00) >> 8, bits & 0xff);
 }
 if(encStr.charCodeAt(i -2) == 61)
 {
  return(decOut.substring(0, decOut.length -2));
 }
 else if(encStr.charCodeAt(i -1) == 61)
 {
  return(decOut.substring(0, decOut.length -1));
 }
 else {return(decOut)};
}



function datum_gueltig (dat)
// erwartet Datumsangabe als String TT.MM.JJJJ
// Prüft, ob das ein gültiges Datum ist
{
var tagtemp = dat.substr(0,2);
var montemp = dat.substr(3,2);
var jahtemp = dat.substr(6,4);
var dtemp = new Date(jahtemp,montemp-1,tagtemp);
var c1 = dtemp.getDate()-tagtemp;
var c2= dtemp.getMonth()+1-montemp;
var c3=dtemp.getYear()-jahtemp;
if ((c1!=0) || (c2!=0) || (c3!=0)) { return false; } else { return true; }
}
