function deCryptString(s) {	//
  var n=0;
	var r="";
	for(var i=0; i < s.length; i++) {
		n=s.charCodeAt(i)-1;
    // schon etwas zu weit gefasste Auswahl, umfasst auch Zeichen, die in mailadressen ungültig sind
    if (n<=128) r += String.fromCharCode(n);
	}
	return r;
}
function link_deCryptString(s)	{	//
	location.href=deCryptString(s);
}

function preloadImages(nDepth)  {
// lädt die Bilder für Mouseover- Effekte vor
// erwartet als Parameter eine Zahl <=3, die die Ebene der jeweiligen *.html- Datei im Verzeichnisbaum bezeichnet
  if(nDepth>3) {
    alert("Zahl größer als 3");
    return false;
  }
  aDepth = new Array('./','../','../../','../../../');
//   alert(aDepth[nDepth]);
//   return;
  agent = navigator.userAgent;
  if(agent.substring(0,7) == "Mozilla")  {
    if( parseInt(agent.substring(8,9)) >= 3) {
      pm0n = new Image();
      pm0n.src = aDepth[nDepth]+"images/phome.gif";
      pm0h = new Image();
      pm0h.src = aDepth[nDepth]+"images/phomeh.gif";
      pm1n = new Image();
      pm1n.src = aDepth[nDepth]+"images/pmt1.gif";
      pm1h = new Image();
      pm1h.src = aDepth[nDepth]+"images/pmth1.gif";
      pm2n = new Image();
      pm2n.src = aDepth[nDepth]+"images/pmt2.gif";
      pm2h = new Image();
      pm2h.src = aDepth[nDepth]+"images/pmth2.gif";
      pm3n = new Image();
      pm3n.src = aDepth[nDepth]+"images/pmt3.gif";
      pm3h = new Image();
      pm3h.src = aDepth[nDepth]+"images/pmth3.gif";
      pm4n = new Image();
      pm4n.src = aDepth[nDepth]+"images/pmt4.gif";
      pm4h = new Image();
      pm4h.src = aDepth[nDepth]+"images/pmth4.gif";
      pm5n = new Image();
      pm5n.src = aDepth[nDepth]+"images/pmt5.gif";
      pm5h = new Image();
      pm5h.src = aDepth[nDepth]+"images/pmth5.gif";
      pm6n = new Image();
      pm6n.src = aDepth[nDepth]+"images/pmt6.gif";
      pm6h = new Image();
      pm6h.src = aDepth[nDepth]+"images/pmth6.gif";
      pm7n = new Image();
      pm7n.src = aDepth[nDepth]+"images/pmt7.gif";
      pm7h = new Image();
      pm7h.src = aDepth[nDepth]+"images/pmth7.gif";
    }
  }
}
function CI(imgNum,imgName)	{
// change images on mouseover and mouseout
  agent = navigator.userAgent;
  if(agent.substring(0,7) == "Mozilla")  {
    if( parseInt(agent.substring(8,9)) >= 3) {
      document.images[imgNum].src = eval(imgName + ".src");
      return true;
    }
  }
}

function changeStyle(cNodeId)	{
// change styles on mouseover and mouseout
  agent = navigator.userAgent;
  if(agent.substring(0,7) == "Mozilla")  {
    var node = document.getElementById(cNodeId);
    if( parseInt(agent.substring(8,9)) >= 3) {
      node.className = node.className == "menu_normal" ? "menu_mo" : "menu_normal";
      //node.setAttribute('class','menu_normal');
      //alert(node.getAttribute("class"));
      return true;
    }
  }
}

// numerische Funktion
function isNumber(arg)   {
  // prüft, ob der/die übergebene(n) Parameter nicht leer und ganzzahlig sind
  for(i=0; i<isNumber.arguments.length; i++)      {
    if(isNumber.arguments[i].search(/^[+-]?[0-9]+$/) == -1) return false;
  }
  return true;
}

// Datumsfunktionen
function compareDates(dDateA, dDateB)  {
// erwartet 2 Datumsobjekte
// Rückkehrcodes:
// DatumA == DatumB -> 0
// DatumA >  DatumB -> 1
// DatumA <  DatumB -> -1
// sonst -2
  // ermittle die Sekunden seit 01.01.1970
  var nSecsA = dDateA.getTime()/1000;
  var nSecsB = dDateB.getTime()/1000;
  return nSecsA == nSecsB ? 0 : nSecsA > nSecsB ? 1 : nSecsA < nSecsB ? -1 : -2;
}

function truncateDate(dDateTime) {
// setzt den Zeitanteil im Datum auf 00:00:00
  return dDate  = new Date(dDateTime.getFullYear(),dDateTime.getMonth(),dDateTime.getDate()); // enthält das heutige Datum mit der Uhrzeit 00:00:00
}
function formateDate(dDate) {
// erwartet ein Datumsobjekt
// gibt eine Zeichenkette zurück, die ein Datum im Format d.m.yyyy repräsentiert
  var nDay      = dDate.getDate();
  var nMonth    = dDate.getMonth()+1; // enthält den Monatsindex bei 0 beginnend
  var nYear     = dDate.getFullYear();
  var cSep      = "."
  return nDay+cSep+nMonth+cSep+nYear;

}
function normalizeDate(dDate)  {
// erwartet ein Datumsobjekt
// gibt eine Zeichenkette zurück, die ein Datum im Format dd.mm.yyyy repräsentiert
  var cDay      = (dDate.getDate()).toString();
  var cMonth    = (dDate.getMonth()+1).toString();
  var cYear     = (dDate.getFullYear()).toString();
  var cSep      = "."
  //var splitDate = cDate.split(".");
  // wenn die Zahl nur aus einer Ziffer besteht, schreibe eine Null davor
  cDay   = (cDay.length) == 1 ? "0"+cDay : cDay;
  cMonth = (cMonth.length) == 1 ? "0"+cMonth : cMonth;
  return cDay+cSep+cMonth+cSep+cYear;
}

function addDays(initialDate, daysToAdd)  {
// addiert Tage zu einem übergebenen Datum
// erwartet als 1. Parameter ein Datumsobjekt
// ist der 2. Parameter negativ, so werden die Tage vom übergebenen Datum subtrahiert
// 14.01.2010 Zeitzonenoffset eingebaut
// notwendig, wenn sich in einem Zeitintervall der Offset ändert (von Winter- auf Sommerzeit)
  var dTime         = new Date();
  // getTime rechnet auf Basis UTC
  var absoluteNow   = initialDate.getTime() - initialDate.getTimezoneOffset() * 60000;
  //Ergebnis ist das neue Datum auf Basis UTC ...
  var absoluteLater = absoluteNow + (daysToAdd*24*3600*1000)
  // ...dem dann der neue Zeitzonenoffset übergeholfen wird
  dTime.setTime(absoluteLater);
  dTime.setTime(absoluteLater + dTime.getTimezoneOffset() * 60000);
  return dTime;
}

function addYear(nYear, nAdd) {
  document.getElementById("txtJahr").value=nYear+=nAdd;
}

function lesejahr()  {
  // Funktion gibt die Zeichen A,B oder C zurück, je nachdem welches Lesejahr aktuell ist.---
  /* Wenn eine Jahreszahl durch drei teilbar ist, werden die Texte aus dem Lesejahr C gelesen.
  Das jeweilige Lesejahr beginnt nicht mit dem 1. Januar, sondern mit dem 1. Advent des Vorjahres.
  Quelle: http://www.kath.de/lexikon/liturgie/leseordnung_katholische_kirche.php */
  var dDateTime = new Date();
  var nYear     = dDateTime.getFullYear();
  // 1. Advent berechnen
  var dHeiligAbend = new Date(nYear, 11, 24);  // Monatsindex beginnt bei 0
  var dFirstAdvent = addDays(dHeiligAbend, -(dHeiligAbend.getDay()+ 21));
  // wenn aktuelles Datum größer oder gleich dem 1. Advent, dann wähle das nächste Lesejahr
  if(compareDates(dDateTime,dFirstAdvent)>=0) nYear++;
  var nRest = nYear%3;
  return nRest==0?'C':nRest==1?'A':nRest==2?'B':0;
}

// Funktion zum Aufbau des Hauptmenüs
function createMenu(calledFromPage, nDepth) {
  createMenuEntry("startseite", calledFromPage, " STARTSEITE", nDepth);
  createMenuEntry("gemeinde", calledFromPage, " GEMEINDE", nDepth);
  createMenuEntry("gottesdienst", calledFromPage, " GOTTESDIENST", nDepth);
  createMenuEntry("aktuell", calledFromPage, " AKTUELL", nDepth);
  createMenuEntry("gruppen", calledFromPage, " GRUPPEN", nDepth);
  createMenuEntry("geschichte", calledFromPage, " GESCHICHTE", nDepth);
  createMenuEntry("rueckblicke", calledFromPage, " RÜCKBLICKE", nDepth);
  createMenuEntry("bilder", calledFromPage, " BILDER", nDepth);
  createMenuEntry("kontakte", calledFromPage, " KONTAKTE", nDepth);
}

function createMenuEntry(cDivId, cIsSelected, cText, nDepth) {
  var tblId = "tbl_main_menu"
  var aDepth = new Array('./','../','../../','../../../');
  appendRow(tblId);
  // parentNode = tr
  // childNode = td
  var parentNode = document.getElementById(tblId).rows[document.getElementById(tblId).rows.length-1];
  var childNode = createChildNode(parentNode, "td");
  parentNode.appendChild(childNode);
  // parentNode = td
  // childNode = div
  parentNode = childNode;
  if(cIsSelected == cDivId) {
    if(nDepth > 1) {
      childNode = createChildNode(parentNode, "a", "href", aDepth[nDepth]+cDivId+"/index.html");
      parentNode.appendChild(childNode);
      parentNode = childNode;
    }
    childNode = createChildNode(parentNode, "div", "id", cDivId, "class", "menu_selected");
    parentNode.appendChild(childNode);
    // parentNode = div
    // childNode = img, text
    parentNode = childNode;
    childNode = createChildNode(parentNode, "img", "src", aDepth[nDepth]+"images/pto_small.gif");
    parentNode.appendChild(childNode);
    parentNode.appendChild(document.createTextNode(cText));
  } else {
    //um auf die Startseite zu linken, muss ich im Hierarchiebaum wieder nach oben
    if(cDivId == 'startseite') {
      childNode = createChildNode(parentNode, "a", "href", aDepth[nDepth]+"index.html", "onmouseover", "changeStyle('"+cDivId+"')", "onmouseout", "changeStyle('"+cDivId+"')");
    } else {
      childNode = createChildNode(parentNode, "a", "href", aDepth[nDepth]+cDivId+"/index.html", "onmouseover", "changeStyle('"+cDivId+"')", "onmouseout", "changeStyle('"+cDivId+"')");
    }
    parentNode.appendChild(childNode);
    parentNode = childNode;
    childNode = createChildNode(parentNode, "div", "id", cDivId, "class", "menu_normal");
    parentNode.appendChild(childNode);
    childNode.appendChild(document.createTextNode(cText));
  }

}





// Javascript- DOM- Funktionen
function deleteAllChildNodes(node)  {
  for(var i = node.childNodes.length; i>0 ; i--) node.removeChild(node.childNodes[i-1]);
}

function appendRow(tblId)        {
// Diese Funktion hängt an einen Tabellenkörper, der mit einer ID versehen sein muss, eine Zeile an
// die Funktion erwartet diese ID auch als Argument
  document.getElementById(tblId).insertRow(document.getElementById(tblId).rows.length);
}

function createChildNode(parentNode, cChildElement, cAttributes) {
//	var argcount = 0;
	for(i=0; i<createChildNode.arguments.length; i+=2)	{
//		argcount++;
		if(i==0) childNode = document.createElement(cChildElement);
		else childNode.setAttribute(createChildNode.arguments[i], createChildNode.arguments[i+1]);
//			alert("Argument Nr. "+(argcount)+"\nArgumentbezeichner: "+createTable.arguments[i]+"\nWert des Arguments: "+createTable.arguments[i+1]);
  }
  return childNode;
}


function appendFields(tblId, fieldContent)        {
// Diese Funktion fügt Tabellenfelder mit Inhalt in die letzte vorhandene Tabellenzeile ein
// tblId erwartet die id der Tabelle, die bearbeitet werden soll
// fieldContent erwartet ein oder mehrere Argumente, je nachdem wieviel Tabellenfelder eingefügt werden sollen
  with(document)        {
  if(!getElementById(tblId).rows.length)        {
    alert("Übergebene Tabelle hat keine Zeilen!");
    return false;
  }
  for(i=1; i<appendFields.arguments.length; i++)        {
    (getElementById(tblId).rows[getElementById(tblId).rows.length-1].
    appendChild(createElement("td"))).appendChild(createTextNode(appendFields.arguments[i]));
  }
// der nachfolgende Kommentar beinhaltet noch einmal ausführlich den kryptischen Ausdruck, der innerhalb der for- Schleife steht
/*                lastRow = getElementById(tblId).rows[getElementById(tblId).rows.length-1];
                tableField = lastRow.appendChild(createElement("td"));
                inhalt = tableField.appendChild(createTextNode(appendFields.arguments[i]));
*/
  }
}

