/**
* Javaskripte des Frontends von SoMoSy
*
* Diese Datei wird vom Browser bei allen Aufrufen benutzt.
* 
* @author Dr. Markus Soick <Markus@Soick.de>
* @copyright Copyright 2007-2011, Dr. Markus Soick
* @version 2.0
* @package SoMoSy
*/

// ------------------------------------------------------------------
// Namespace Funktion und Initialisierung
// ------------------------------------------------------------------

// globale this-Referenz
var SoMoSyThis=this;
var SoMoSyInit=new Array();

// Funktion zum Anlegen von Namensräumen
function namespace(name)
{
	var namen=name.split(".");
	var p=SoMoSyThis;
	for (var i=0;i<namen.length;i++)
	{
		// Evtl. Name anlegen
		if (!p[namen[i]])
			p[namen[i]]={};
		// Ebene weiter
		p=p[namen[i]];
	}
}

// Die Funktion liest evtl. von der Website gesetzte Parameter aus
// und initialisiert bei Bedarf einzelne Pakete
function SoMoSyStart()
{
	// Diashows suchen
	var bilder=document.getElementsByTagName('img');
	for (var i=0;i<bilder.length;i++)
	{
		if (bilder[i].className=='diashow')
			SoMoSy.Diashow.init(bilder[i],0);
		if (bilder[i].className=='diashowzufall')
			SoMoSy.Diashow.init(bilder[i],1);
	}
	
	// Scrollboxen suchen
	var divs=document.getElementsByTagName('div');
	for (var i=0;i<divs.length;i++)
		if (divs[i].className=='boxh' || divs[i].className=='boxv')
			SoMoSy.Scrollbox.init(divs[i]);
	
	// zusätzliche Initialisierungen über SoMoSyInit
	while (SoMoSyInit.length>0)
		switch (SoMoSyInit.shift())
		{
			case 'Menuefix':
				SoMoSy.Menuefix.init(SoMoSyInit.shift(),SoMoSyInit.shift(),SoMoSyInit.shift());
				break;
			case 'Chat':
				SoMoSy.Chat.init(SoMoSyInit.shift(),SoMoSyInit.shift());
				break;
		}
}

// Die Funktion fügt dem onLoad-Event des Window eine neue Funktion hinzu
function SoMoSyaddLoadEvent(neueFunktion)
{ 
	if (typeof window.onload!='function')
		window.onload=neueFunktion;
	else 
	{ 
		var alteFunktion=window.onload; 
		window.onload=function()
			{ 
				if (alteFunktion) 
					alteFunktion(); 
				neueFunktion(); 
			} 
	} 
}

SoMoSyaddLoadEvent(SoMoSyStart);

// ------------------------------------------------------------------
// !allgemeine Funktionen
// ------------------------------------------------------------------

// Meldung in der Konsole ausgeben
function ausgabe(meldung)
{
	if (window.console)
		window.console.log (meldung);
	else
		alert(meldung);
}

// Fenster mit gegebener URL, Breite und Höhe öffnen
function oeffneFenster(url,breite,hoehe)
{
	if (!breite) breite=screen.availWidth;
  if (!hoehe) hoehe=screen.availHeight;
  var Fenster=window.open(url,"_blank","dependent=yes, location=no, menubar=no, resizable=yes, scrollbars=yes, status=no, toolbar=no, width="+breite+", height="+hoehe);
  Fenster.focus();
  return false;
}

// Einfache Ja/Nein-Frage zur Sicherheit
function sicherheitsAbfrage(frage)
{
  return confirm(frage);
}

// Alle Checkboxen mit gleichen Namen auf den gleichen Wert setzen
function checkAll(name,wert)
{
  boxen=document.getElementsByName(name);
  for (var i=0;i<boxen.length;i++)
    boxen[i].checked=wert;
}

// Session am Leben erhalten
//letzterSessionCheck=new Date().getTime();
//zeitInterval=600; // Zeit-Intervall zwischen zwei Sessionchecks in s
function sessionAnimieren()
{
	var aktuelleZeit=new Date().getTime();
	var bild=new Image();
	bild.src="index.php?bef=sessioncheck&time="+aktuelleZeit;
	letzterSessionCheck=aktuelleZeit;
	window.setTimeout("sessionAnimieren();", zeitInterval*1000);
}
//window.setTimeout("sessionAnimieren();", zeitInterval*1000);

// ------------------------------------------------------------------
// !allgemeine Funktionen zur Bearbeitung von HTML-Inhalte
// ------------------------------------------------------------------

// Namespace erweitern
namespace('SoMoSy.DOM');

// Selektion eines Feldes als Start- und Endwert setzen
// feld ist ein Verweis auf das betreffende Feld
SoMoSy.DOM.getSelection=function(feld)
{
  feld.focus();
	// Position der Selektion lesen
  if (document.selection)
  {
  	// nur für IE bis mind. 8
    var range=document.selection.createRange();
    var alles=document.body.createTextRange();
    alles.moveToElementText(feld);
    alles.setEndPoint("EndToStart",range);
    feld.start=alles.text.length;
    feld.ende=feld.start+range.text.length;
  }
  else
  {
  	// alle anderen
    feld.start=feld.selectionStart;
    feld.ende=feld.selectionEnd;
  }
	feld.scrollPosition=feld.scrollTop;
}

// Selektion eines Feldes mit Start- und Endwert setzen
// feld ist ein Verweis auf das betreffende Feld
// start ist eine Startposition
// ende ist eine Endposition
SoMoSy.DOM.setSelection=function(feld,start,ende)
{
	// Wenn keine Werte übergeben wurden, dann gespeicherte Werte benutzen
	start=(typeof(start)=="undefined"?feld.start:start);
	ende=(typeof(ende)=="undefined"?feld.ende:ende);
	// Selektion neu setzen
  if (document.selection)
  {
  	// nur für IE bis mind. 8
		var range=feld.createTextRange();
		// Für jeden Zeilenumbruch die Werte um 1 verringern
		for (var i=0;i<=start;i++)
			if (feld.value.charAt(i)=="\n")
			{
		  	start--;
		  	ende--;
		  }
		range.collapse(true);
		range.moveEnd('character', ende);
		range.moveStart('character', start);
		range.select();
  }
  else
  	// alle anderen
		feld.setSelectionRange(start,ende);
	feld.scrollTop=feld.scrollPosition;
}

// Text aus Popupmenü eintragen.
// Der im Popupmenü ausgewählte Text wird in ein anderes Formularelement eingetragen
// menue ist das Select-Formularelement mit dem einzutragenden Inhalt
// id ist die ID des Ziel-Formularelementes
// prefix ist ein Textprefix (optional)
SoMoSy.DOM.textAusPopupEintragen=function(menue,id,prefix)
{
	if (typeof(prefix)=="undefined")
		prefix="";
	var index=menue.selectedIndex;
	if (index!=0)
	{
		document.getElementById(id).value=prefix+menue.options[index].text;
		menue.selectedIndex=0;
	}
}

// Text aus Popupmenü ergänzen.
// Der im Popupmenü ausgewählte Text wird in ein anderes Formularelement eingetragen
// Ist in diesem schon etwas enthalten, wird der Inhalte mit dem übergebenen Trenner
// angehängt
// menue ist das Select-Formularelement mit dem einzutragenden Inhalt
// id ist die ID des Ziel-Formularelementes
// prefix ist ein Textprefix (optional)
// trenner ist der Trenner (optional)
SoMoSy.DOM.textAusPopupErgaenzen=function(menue,id,prefix,trenner)
{
	if (typeof(prefix)=="undefined")
		prefix="";
	if (typeof(trenner)=="undefined")
		trenner="";
	var index=menue.selectedIndex;
	if (index!=0)
	{
		var alt=document.getElementById(id).value;
		if (alt!="")
			alt+=trenner;
		document.getElementById(id).value=alt+prefix+menue.options[index].text;
		menue.selectedIndex=0;
	}
}

// Popupmenü prüfen und Formular abschicken.
// Es wird evtl. eine Sicherheitsabfrage gestellt. Bei Zustimmung wird das Formular
// abgeschickt, bei Ablehnung das Popupmenü zurückgesetzt.
// menue ist das betroffene Select-Formularelement
// formular ist das abzuschickende Formular
// frage ist die evtl. zu stellende Sicherheitsabfrage
SoMoSy.DOM.popupAbschicken=function(menue,formular,frage)
{
	if (menue.selectedIndex!=0 && (typeof(frage)=="undefined" || sicherheitsAbfrage(frage)))
		formular.submit();
	else
		menue.selectedIndex=0;
}

// Alle Unterknoten des übergebenen Knotens werden rekursiv durchlaufen
// und gefundene Formularelemente (Popupmenüs, Textfelder und Textareas)
// zurückgesetzt.
// knoten ist das zu durchlaufende Element
// tiefe gibt an, wieviele Unterebenen zusätzlich durchlaufen werden sollen.
SoMoSy.DOM.leereKnoten=function(knoten,tiefe)
{
	var aktuell=knoten.firstChild;
	while (aktuell!=null)
	{
		switch (aktuell.nodeName)
		{
			case 'SELECT':
				aktuell.childNodes[0].selected=true;
				break;
			case 'INPUT':
				if (aktuell.getAttribute('type')=='text' || aktuell.getAttribute('type')=='hidden')
					aktuell.value="";
				break;
			case 'TEXTAREA':
				if (aktuell.hasChildNodes())
					aktuell.childNodes[0].data='';
				break;
			case 'SPAN':
				if (aktuell.getAttribute('class')=='leeren')
					while (aktuell.hasChildNodes())
						aktuell.removeChild(aktuell.firstChild);
				break;
			default:
				if (aktuell.childNodes.length>0 && tiefe>0)
					SoMoSy.DOM.leereKnoten(aktuell,tiefe-1);
			break;
		}
		aktuell=aktuell.nextSibling;
	}
}

// Ein HTML-Element mit vorgegebenem Inhalt füllen
// knoten der Startknoten unterhalb dem gesucht werden soll.
// tiefe gibt an wieviele Unterebenen zusätzlich durchsucht werden.
// name gibt den Namen des gesuchten Elementes an.
// typ gibt an, was für ein Element gesucht wird:
// (1:Textfeld,2:Textarea,3:span-Tag,4:hidden-Feld,5:Select)
// wert gibt den einzufüllenden Wert an.
SoMoSy.DOM.fuelleWert=function(knoten,tiefe,name,typ,wert)
{
	var aktuell=knoten.firstChild;
	while (aktuell!=null)
	{
		// Textfeld oder hidden-Feld?
		if (aktuell.nodeName=='INPUT' && ((typ==1 && aktuell.getAttribute('type')=='text') || (typ==4 && aktuell.getAttribute('type')=='hidden')) && aktuell.getAttribute('name')==name)
			aktuell.value=wert;
		// TextArea?
		else if (typ==2 && aktuell.nodeName=='TEXTAREA' && aktuell.getAttribute('name')==name)
		{
			if (aktuell.hasChildNodes())
				aktuell.childNodes[0].data=wert;
			else
				aktuell.appendChild(document.createTextNode(wert));
		}
		// SPAN-Tag?
		else if (typ==3 && aktuell.nodeName=='SPAN' && aktuell.getAttribute('name')==name)
			aktuell.childNodes[0].data=wert;
		// Select?
		else if (typ==5 && aktuell.nodeName=='SELECT' && aktuell.getAttribute('name')==name)
			aktuell.selectedIndex=wert;
		// Unterknoten durchlaufen?
		else if (aktuell.childNodes.length>0 && tiefe>0)
			SoMoSy.DOM.fuelleWert(aktuell,tiefe-1,name,typ,wert);
		// Nächsten Knoten
		aktuell=aktuell.nextSibling;
	}
}

// Die Funktion ermittelt den aktuellen Style eines Elementes
// und gibt diesen zurück
// element ist ein Verweis auf das betreffende Element
SoMoSy.DOM.getStyle=function(element)
{
	if (window.getComputedStyle)
  	// Standard
    return window.getComputedStyle(element,null);
  else
  	if (element.currentStyle)
  		// IE
      return element.currentStyle;
    else
    	return false;
}

// Die Funktion tauscht ein Bild aus
// bild ist die ID des img-Tags
// url ist die URL des neuen Bildes
SoMoSy.DOM.tauscheBild=function(bild,url)
{
	document.getElementById(bild).src=url;
 	return false;
}

// ------------------------------------------------------------------
// !Funktionen zur Benutzung in Edit-Formularen
// ------------------------------------------------------------------

// Namespace erweitern
namespace('SoMoSy.Edit');

// Das Formular soll neugeladen werden, um die Anzeige zu aktualisieren.
// formular ist das Formular, das abgeschickt werden soll
// wert enthält den abzuschickenden Text
SoMoSy.Edit.reload=function(formular,wert)
{
	if (typeof(wert)=="undefined")
		wert="_reload"
	formular.send_save.value=wert;
	formular.send_save.click();
}

// Zum Kopieren von alten Daten wurde ein Popupmenü geändert
// formular ist das Formular, das abgeschickt werden soll
// select ist das Select-Formularelement mit dem Kopier-Menü
SoMoSy.Edit.alteDatenKopieren=function (formular,select)
{
	// Kopieren, wenn etwas ausgewählt ist
	if (select.selectedIndex>0)
		SoMoSy.Edit.reload(formular);
}

// Popup, um Codes in den Editor einzufügen
// feldname ist der Name der Textarea
// art gibt an, wie der Code eingefügt werden soll. (0=Absatzformat,1=Zeichenformat,2=Element)
// popup ist ein Verweis auf das Popupmenü
SoMoSy.Edit.codePopup=function (feldname,art,popup)
{
	if (popup.selectedIndex>0)
	{
		SoMoSy.Edit.codeEinfuegen(feldname,art,popup.value);
		// Popup zurücksetzen
		popup.selectedIndex=0;
	}
}

// Codes in Editor einzufügen
// feldname ist der Name der Textarea
// art gibt an, wie der Code eingefügt werden soll. (0=Absatzformat,1=Zeichenformat,2=Element,3=Besonderes)
// code ist der einzufügende Code.
// attribute sind die einzufügenden Attribute (optional)
SoMoSy.Edit.codeEinfuegen=function(feldname,art,code,attribute)
{
	if (typeof(attribute)=="undefined") attribute="";
	var feld=document.getElementById(feldname);
	SoMoSy.DOM.getSelection(feld);
	start=feld.start;
	ende=feld.ende;
	
	// bei Absatzformaten den Zeilenanfang suchen
	if (art==0)
	{
		while (start>0 && feld.value.charAt(start)!="\n")
			start--;
		if (feld.value.charAt(start)=="\n")
			start++;
		ende=start;
	}

	// an der Position Code einfügen
	var vorne=feld.value.substr(0,start);
	var mitte=feld.value.substr(start,ende-start);
	var hinten=feld.value.substr(ende);
	switch (art)
	{
		case 1:
			var neu="["+code+attribute+"]"+mitte+"[/"+code+"]";
			start+=code.length+attribute.length+2;
			ende+=code.length+attribute.length+2
			break;
		case 0:
		case 2:
			var neu="["+code+attribute+"]";
			start+=code.length+attribute.length+2;
			ende=start;
			break;
		case 3:
			var neu=code;
			start+=code.length;
			ende=start;
			break;
	}
	feld.value=vorne+neu+hinten;
	SoMoSy.DOM.setSelection(feld,start,ende);
}

// Link-Menü bearbeiten
// aktion gibt an, was getan werden soll (0=anzeigen,1=Werte übernehmen und schliessen,2=nur schliessen)
// feldname ist der Name des Formularfeldes
// Formular ist ein Verweis auf das Formular
SoMoSy.Edit.editorURL=function (aktion,feldname,formular)
{
	var feld=document.getElementById(feldname);
	switch (aktion)
	{
		case 0:
			// Formular einblenden
			SoMoSy.DOM.getSelection(feld);
			document.getElementById("url_"+feldname).style.display="block";
			break;
		case 1:
			// Werte lesen
			var code="url";
			var attribute="";
			var wert=formular.elements["urlHref_"+feldname].value;
			if (wert!="") attribute+=" ziel=\""+encodeURI(decodeURI(wert))+"\"";
			wert=formular.elements["urlTitle_"+feldname].value;
			if (wert!="") attribute+=" titel=\""+wert+"\"";
			if (typeof(formular.elements["urlTarget_"+feldname])!="undefined")
			{
				var radio=formular.elements["urlTarget_"+feldname];
				if (radio[0].checked) wert="";
				if (radio[1].checked) wert="_blank";
				if (radio[2].checked) wert=formular.elements["urlTargettext_"+feldname].value;
				if (wert!="") attribute+=" target=\""+wert+"\"";
			}
			// Formular ausblenden und Code einfügen
			document.getElementById("url_"+feldname).style.display="none";
			SoMoSy.DOM.setSelection(feld);
			SoMoSy.Edit.codeEinfuegen(feldname,1,code,attribute)
			break;
		case 2:
			// Formular ausblenden
			document.getElementById("url_"+feldname).style.display="none";
			SoMoSy.DOM.setSelection(feld);
			break;
	}
}

// Bild-Menü bearbeiten
// aktion gibt an, was getan werden soll (0=anzeigen,1=Werte übernehmen und schliessen,2=nur schliessen)
// feldname ist der Name des Formularfeldes
// Formular ist ein Verweis auf das Formular
SoMoSy.Edit.editorImg=function (aktion,feldname,formular)
{
	var feld=document.getElementById(feldname);
	switch (aktion)
	{
		case 0:
			// Formular einblenden
			SoMoSy.DOM.getSelection(feld);
			document.getElementById("img_"+feldname).style.display="block";
			break;
		case 1:
			// Werte lesen
			var code="img";
			var attribute="";
			var wert=formular.elements["imgSrc_"+feldname].value;
			if (wert!="") attribute+=" quelle=\""+encodeURI(decodeURI(wert))+"\"";
			wert=formular.elements["imgAlt_"+feldname].value;
			if (wert!="") attribute+=" text=\""+wert+"\"";
			if (typeof(formular.elements["imgWidth_"+feldname])!="undefined")
			{
				wert=formular.elements["imgWidth_"+feldname].value;
				if (wert!="") attribute+=" breite=\""+wert+"\"";
			}
			if (typeof(formular.elements["imgHeight_"+feldname])!="undefined")
			{
				wert=formular.elements["imgHeight_"+feldname].value;
				if (wert!="") attribute+=" hoehe=\""+wert+"\"";
			}
			if (typeof(formular.elements["imgClass_"+feldname])!="undefined")
			{
				wert=formular.elements["imgClass_"+feldname].value;
				if (wert!="") attribute+=" format=\""+wert+"\"";
			}
			// Formular ausblenden und Code einfügen
			document.getElementById("img_"+feldname).style.display="none";
			SoMoSy.DOM.setSelection(feld);
			SoMoSy.Edit.codeEinfuegen(feldname,2,code,attribute)
			break;
		case 2:
			// Formular ausblenden
			document.getElementById("img_"+feldname).style.display="none";
			SoMoSy.DOM.setSelection(feld);
			break;
	}
}

// Lightbox-Menü bearbeiten
// aktion gibt an, was getan werden soll (0=anzeigen,1=Werte übernehmen und schliessen,2=nur schliessen)
// feldname ist der Name des Formularfeldes
// Formular ist ein Verweis auf das Formular
SoMoSy.Edit.editorLightbox=function (aktion,feldname,formular)
{
	var feld=document.getElementById(feldname);
	switch (aktion)
	{
		case 0:
			// Formular einblenden
			SoMoSy.DOM.getSelection(feld);
			document.getElementById("lightbox_"+feldname).style.display="block";
			break;
		case 1:
			// Formular ausblenden
			document.getElementById("lightbox_"+feldname).style.display="none";
			// Link-Werte lesen
			var code="[url";
			var wert=formular.elements["lightboxHref_"+feldname].value;
			if (wert!="") code+=" ziel=\""+encodeURI(decodeURI(wert))+"\"";
			wert=formular.elements["lightboxAlt_"+feldname].value;
			if (wert!="") code+=" titel=\""+wert+"\"";
			code+=" target=\"_blank\"";
			code+=" rel=\"lightbox[artikel]\"";
			// Link einfügen
			// Bild-Werte lesen
			code+="][img";
			wert=formular.elements["lightboxSrc_"+feldname].value;
			if (wert!="") code+=" quelle=\""+encodeURI(decodeURI(wert))+"\"";
			wert=formular.elements["lightboxAlt_"+feldname].value;
			if (wert!="") code+=" text=\""+wert+"\"";
			wert=formular.elements["lightboxWidth_"+feldname].value;
			if (wert!="") code+=" breite=\""+wert+"\"";
			wert=formular.elements["lightboxHeight_"+feldname].value;
			if (wert!="") code+=" hoehe=\""+wert+"\"";
			wert=formular.elements["lightboxClass_"+feldname].value;
			if (wert!="") code+=" format=\""+wert+"\"";
			code+="][/url]"
			// Bild einfügen
			SoMoSy.DOM.setSelection(feld);
			SoMoSy.Edit.codeEinfuegen(feldname,3,code)
			break;
		case 2:
			// Formular ausblenden
			document.getElementById("lightbox_"+feldname).style.display="none";
			SoMoSy.DOM.setSelection(feld);
			break;
	}
}

// Text in Editor einfügen
// stueck gibt an, was eingefügt werden soll
// feldname ist der Name des Formularfeldes
// Formular ist ein Verweis auf das Formular
SoMoSy.Edit.editorTextEinfuegen=function (stueck,feldname,formular)
{
	SoMoSy.Edit.codeEinfuegen(feldname,3,stueck)
}

// Neue Eingabezeile in einer Tabelle einfügen.
// button ist der +-Button zum Hinzufügen einer Zeile
SoMoSy.Edit.neueZeile=function(button)
{
	// Zeile kopieren
	var zeile=button.parentNode.parentNode;
	var original=(zeile.nextSibling==null)?zeile.previousSibling:zeile;
	var kopie=original.cloneNode(true);
	// Zeile leeren und einsetzen
	SoMoSy.DOM.leereKnoten(kopie,1);
	zeile.parentNode.insertBefore(kopie,zeile);
}

// Eingabezeile in einer Tabelle löschen
// button ist der --Button zum Entfernen einer Zeile
SoMoSy.Edit.loescheZeile=function(button)
{
	var zeile=button.parentNode.parentNode;
	// Nur löschen, wenn es nicht die letzte Zeile ist
	if (zeile.parentNode.childNodes.length>3)
		zeile.parentNode.removeChild(zeile);
	else
		SoMoSy.DOM.leereKnoten(zeile,1);
}

// Die Zeilen einer Tabelle mit variablem Inhalt werden durchnummeriert
// id ist die ID der Tabelle
// Name ist der Name des Formularelementes mit der Nummerierung
SoMoSy.Edit.nummeriere=function(id,name)
{
	// Erste Zeile suchen
	var zeile=document.getElementById(id).childNodes[0].childNodes[1];
	// Alle Zeilen durchlaufen
	var i=0;
	while (zeile!=null)
	{
		SoMoSy.DOM.fuelleWert(zeile,1,name,4,i);
		i++;
		zeile=zeile.nextSibling;
	}
}

// ------------------------------------------------------------------
// !Funktionen für AJAX
// ------------------------------------------------------------------

// Namespace erweitern
namespace('SoMoSy.Ajax');

// Die Funktion erzeugt einen neuen XMLHttpRequest.
SoMoSy.Ajax.newRequest=function()
{
	var req;
	try
	{
		req=new XMLHttpRequest();
	}
	catch (e)
	{
		try
		{
			req=new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			try
			{
				req=new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e)
			{
				req=null;
			}
		}
	}
	return req;
}

// ------------------------------------------------------------------
// !Funktionen für Diashows
// ------------------------------------------------------------------

// Namespace erweitern
namespace('SoMoSy.Diashow');

// Die Funktion leitet eine Diashow ein. Das Abfragen der anzuzeigenden Bilder und das Laden des Startbildes wird gestartet.
// imgnode ist der node des Bildes, welches zur Diashow werden soll.
// zufall gibt an, ob die Reihenfolge zufällig erfolgen soll
SoMoSy.Diashow.init=function(imgnode,zufall)
{
	// evtl. Variablen initialisieren
	if (!SoMoSy.Diashow.id)
	{
		SoMoSy.Diashow.zeit=5000; // Zeit zwischen zwei Bildern
		SoMoSy.Diashow.id=0; // ID der nächsten Diashow
		SoMoSy.Diashow.originale=new Array();	// Bildobjekte der Originalbilder
		SoMoSy.Diashow.imgnode=new Array(); // Nodes der Originalbilder
		SoMoSy.Diashow.aussen=new Array(); // Nodes der äußeren divs
		SoMoSy.Diashow.innen=new Array(); // Nodes der inneren divs
		SoMoSy.Diashow.req=new Array(); // Ajax-Requests
		SoMoSy.Diashow.anzahl=new Array(); // Anzahl der Bilder
		SoMoSy.Diashow.opacity=new Array(); // Aktueller Opacity-Wert
		SoMoSy.Diashow.aktuell=new Array(); // Index des aktuellen Bildes
		SoMoSy.Diashow.bilder=new Array(); // Bildobjekte in einem Array
		SoMoSy.Diashow.bgurl=new Array(); // CSS-Eintrag für die Bilder
		SoMoSy.Diashow.ie=(document.getElementById('ie8') || document.getElementById('ie7') || document.getElementById('ie6')); // Browser ist IE<9
	}
	var id=SoMoSy.Diashow.id++;
	SoMoSy.Diashow.imgnode[id]=imgnode;
	// Bild laden starten, um die Größen zu ermitteln
	SoMoSy.Diashow.originale[id]=new Image();  
  SoMoSy.Diashow.originale[id].src=imgnode.getAttribute('src');
  // Abfrage der anzuzeigenden Bilder starten
  SoMoSy.Diashow.req[id]=SoMoSy.Ajax.newRequest();
	SoMoSy.Diashow.req[id].open("POST","diashowliste.php",true);
	SoMoSy.Diashow.req[id].onreadystatechange=function()
		{
			if (SoMoSy.Diashow.req[id].readyState==4 && SoMoSy.Diashow.req[id].status==200)
				SoMoSy.Diashow.showStart(id);
		}
	SoMoSy.Diashow.req[id].setRequestHeader("Content-type","application/x-www-form-urlencoded");
  SoMoSy.Diashow.req[id].send("zufall="+zufall+"&bild="+encodeURIComponent(imgnode.getAttribute('src')));
}

// Die Funktion tauscht die Grafik gegen die Elemente für die Diashow aus, bereitet die Diashow vor und startet sie
// id ist die ID der Diashow
SoMoSy.Diashow.showStart=function(id)
{
	// Laden des Originalbildes noch nicht fertig?
	if (!SoMoSy.Diashow.originale[id].complete)
		setTimeout('SoMoSy.Diashow.showStart('+id+');',500);
	else
	{
		// Ergebnis ausgeben
		var xml=SoMoSy.Diashow.req[id].responseXML;
		if (xml!=null)
		{
			// Bilder auslesen
			var bilder=xml.getElementsByTagName("bild");
			if (bilder.length>0)
			{
				SoMoSy.Diashow.anzahl[id]=bilder.length;
				SoMoSy.Diashow.opacity[id]=0;
				SoMoSy.Diashow.aktuell[id]=0;
				SoMoSy.Diashow.bilder[id]=new Array();
				SoMoSy.Diashow.bgurl[id]=new Array();
				for (var i=0;i<bilder.length;i++)
				{
					SoMoSy.Diashow.bilder[id][i]=new Image();
					SoMoSy.Diashow.bilder[id][i].src=bilder[i].firstChild.data;
					SoMoSy.Diashow.bgurl[id][i]='url("'+bilder[i].firstChild.data+'")';
				}
				// Bild gegen zwei verschachtelte divs tauschen
				SoMoSy.Diashow.aussen[id]=document.createElement('div');
				SoMoSy.Diashow.aussen[id].className='SoMoSyDiashowAussen';
				SoMoSy.Diashow.aussen[id].style.width=SoMoSy.Diashow.originale[id].width+'px';
				SoMoSy.Diashow.aussen[id].style.height=SoMoSy.Diashow.originale[id].height+'px';
				SoMoSy.Diashow.aussen[id].style.backgroundImage='url('+SoMoSy.Diashow.originale[id].src+')';
				SoMoSy.Diashow.innen[id]=document.createElement('div');
				SoMoSy.Diashow.innen[id].className='SoMoSyDiashowInnen';
				SoMoSy.Diashow.innen[id].style.width=SoMoSy.Diashow.aussen[id].style.width;
				SoMoSy.Diashow.innen[id].style.height=SoMoSy.Diashow.aussen[id].style.height;
				SoMoSy.Diashow.innen[id].style.backgroundImage=SoMoSy.Diashow.aussen[id].style.backgroundImage;
				SoMoSy.Diashow.aussen[id].appendChild(SoMoSy.Diashow.innen[id]);
				SoMoSy.Diashow.imgnode[id].parentNode.replaceChild(SoMoSy.Diashow.aussen[id],SoMoSy.Diashow.imgnode[id]);
				// Nicht mehr benötigte Teile löschen
				SoMoSy.Diashow.originale[id]=0;
				SoMoSy.Diashow.imgnode[id]=0;
				// Timer starten
				setTimeout("SoMoSy.Diashow.wechseln("+id+");",SoMoSy.Diashow.zeit);
			}
		}
	}
}

// Die Funktion wechselt ein Bild aus
// id ist die ID der Diashow
SoMoSy.Diashow.wechseln=function(id)
{
	if (++SoMoSy.Diashow.aktuell[id]==SoMoSy.Diashow.anzahl[id])
		SoMoSy.Diashow.aktuell[id]=0;
	if (!(SoMoSy.Diashow.bilder[id][SoMoSy.Diashow.aktuell[id]].complete))
		// noch nicht geladen, 1s warten
		setTimeout("SoMoSy.Diashow.wechseln("+id+");",1000);
	else
	{
		var pfad=SoMoSy.Diashow.bgurl[id][SoMoSy.Diashow.aktuell[id]];
		if (SoMoSy.Diashow.opacity[id]==0)
		{
			// neues Bild auf inneres div und einblenden
			SoMoSy.Diashow.innen[id].style.backgroundImage=pfad;
			SoMoSy.Diashow.innen[id].style.opacity='1';
		}
		else
		{
			// neues Bild auf äußeres div und inneres div ausblenden
			if (SoMoSy.Diashow.ie)
				SoMoSy.Diashow.innen[id].style.backgroundImage=pfad;
			else
			{
				SoMoSy.Diashow.aussen[id].style.backgroundImage=pfad;
				SoMoSy.Diashow.innen[id].style.opacity='0';
			}
		}
		SoMoSy.Diashow.opacity[id]=1-SoMoSy.Diashow.opacity[id];
		setTimeout("SoMoSy.Diashow.wechseln("+id+");",SoMoSy.Diashow.zeit);
	}

}

// ------------------------------------------------------------------
// !Funktionen für Scrollboxen
// ------------------------------------------------------------------

// Namespace erweitern
namespace('SoMoSy.Scrollbox');

// Die Funktion leitet eine Scrollbox ein. 
// boxnode ist der node der Box, welches zur Scrollbox werden soll.
SoMoSy.Scrollbox.init=function(boxnode)
{
	// evtl. Variablen initialisieren
	if (!SoMoSy.Scrollbox.id)
	{
		SoMoSy.Scrollbox.zeit=25; // Zeit zwischen zwei Zuständen in ms
		SoMoSy.Scrollbox.langsam=25; // langsame Scrollgeschwindigkeit in Pixel/s
		SoMoSy.Scrollbox.schnell=200; // schnelle Scrollgeschwindigkeit in Pixel/s
		SoMoSy.Scrollbox.id=0; // ID der nächsten Diashow
		SoMoSy.Scrollbox.boxnode=new Array(); // Nodes der Scrollboxen
		SoMoSy.Scrollbox.vertikal=new Array(); // Horizontal (false) oder vertikal (true) scrollen
		SoMoSy.Scrollbox.zurueck=new Array(); // Node des Zurück-Pfeiles
		SoMoSy.Scrollbox.vor=new Array(); // Node des Vor-Pfeiles
		SoMoSy.Scrollbox.inhalt=new Array(); // Node des zu verschiebenden Inhalts
		SoMoSy.Scrollbox.aktuell=new Array(); // aktuelle Verschiebung des Inhaltes
		SoMoSy.Scrollbox.richtung=new Array(); // aktuelle Richtung der Verschiebung
		SoMoSy.Scrollbox.gang=new Array(); // aktuelle Geschwindigkeitsstufe (0=steht,1=öangsam,2=schnell)
		SoMoSy.Scrollbox.max=new Array(); // maximale Verschiebung Inhalts
		SoMoSy.Scrollbox.altzeit=new Array(); // maximale Verschiebung Inhalts
	}
	var id=SoMoSy.Scrollbox.id++;
	SoMoSy.Scrollbox.boxnode[id]=boxnode;
	SoMoSy.Scrollbox.vertikal[id]=(boxnode.className=='boxv');
	// Untergeordnete Boxen suchen
	var kinder=boxnode.childNodes;
	for (var i=0;i<kinder.length;i++)
		switch (kinder[i].className)
		{
			case 'zurueck z0':
				SoMoSy.Scrollbox.zurueck[id]=kinder[i];
				break;
			case 'vor v0':
				SoMoSy.Scrollbox.vor[id]=kinder[i];
				break;
			case 'inhalt':
				SoMoSy.Scrollbox.inhalt[id]=kinder[i].firstChild;
				break;
		}
	// Größen und Grenzen bestimmen
	var style;
	if (SoMoSy.Scrollbox.vertikal[id])
	{
		// vertikal
		var divs=SoMoSy.Scrollbox.inhalt[id].childNodes;
		var hoehe=0;
		for (var i=0;i<divs.length;i++)
		{
			style=SoMoSy.DOM.getStyle(divs[i]);
			hoehe+=parseFloat(style.marginTop)+parseFloat(style.paddingTop)+parseFloat(style.height)+parseFloat(style.paddingBottom)+parseFloat(style.marginBottom);
		}
		hoehe=Math.ceil(hoehe);
		SoMoSy.Scrollbox.inhalt[id].style.height=hoehe+'px';
		style=SoMoSy.DOM.getStyle(SoMoSy.Scrollbox.inhalt[id].parentNode);
		SoMoSy.Scrollbox.max[id]=hoehe-parseInt(style.height);
	}
	else
	{
		// horizontal
		var divs=SoMoSy.Scrollbox.inhalt[id].childNodes;
		var breite=0;
		for (var i=0;i<divs.length;i++)
		{
			style=SoMoSy.DOM.getStyle(divs[i]);
			breite+=parseFloat(style.marginLeft)+parseFloat(style.paddingLeft)+parseFloat(style.width)+parseFloat(style.paddingRight)+parseFloat(style.marginRight);
		}
		breite=Math.ceil(breite);
		SoMoSy.Scrollbox.inhalt[id].style.width=breite+'px';
		style=SoMoSy.DOM.getStyle(SoMoSy.Scrollbox.inhalt[id].parentNode);
		SoMoSy.Scrollbox.max[id]=breite-parseInt(style.width);
	}
	// Aktionen starten
	if (SoMoSy.Scrollbox.max[id]>0)
	{
		SoMoSy.Scrollbox.inhalt[id].style.position='relative';
		SoMoSy.Scrollbox.aktuell[id]=0;
		SoMoSy.Scrollbox.richtung[id]=1;
		SoMoSy.Scrollbox.gang[id]=1;
		SoMoSy.Scrollbox.vor[id].className='vor v1';
		SoMoSy.Scrollbox.vor[id].onmouseover=function(){SoMoSy.Scrollbox.gang[id]=2;SoMoSy.Scrollbox.richtung[id]=1;};
		SoMoSy.Scrollbox.vor[id].onmouseout=function(){SoMoSy.Scrollbox.gang[id]=1;};
		SoMoSy.Scrollbox.inhalt[id].onmouseover=function(){SoMoSy.Scrollbox.gang[id]=0;};
		SoMoSy.Scrollbox.inhalt[id].onmouseout=function(){SoMoSy.Scrollbox.gang[id]=1;};
		SoMoSy.Scrollbox.zurueck[id].onmouseover=function(){SoMoSy.Scrollbox.gang[id]=2;;SoMoSy.Scrollbox.richtung[id]=-1;};
		SoMoSy.Scrollbox.zurueck[id].onmouseout=function(){SoMoSy.Scrollbox.gang[id]=1;};
		SoMoSy.Scrollbox.altzeit[id]=(new Date()).getTime();
		//setInterval('SoMoSy.Scrollbox.schieben('+id+');',SoMoSy.Scrollbox.zeit);
		setTimeout(function(){SoMoSy.Scrollbox.schieben(id);},SoMoSy.Scrollbox.zeit);
		//setTimeout('SoMoSy.Scrollbox.schieben('+id+');',SoMoSy.Scrollbox.zeit);
	}
}

// Die Funktion schiebt die Scrollbox weiter
// id ist die ID der Scrollbox
SoMoSy.Scrollbox.schieben=function(id)
{
	// neue Position bestimmen
	if (SoMoSy.Scrollbox.gang[id]!=0)
	{
		var delta;
		var jetzt=(new Date()).getTime();
		if (SoMoSy.Scrollbox.gang[id]==1)
			delta=SoMoSy.Scrollbox.langsam*(jetzt-SoMoSy.Scrollbox.altzeit[id])/1000;
			//delta=SoMoSy.Scrollbox.langsam*SoMoSy.Scrollbox.zeit/1000;
		else
			delta=SoMoSy.Scrollbox.schnell*(jetzt-SoMoSy.Scrollbox.altzeit[id])/1000;
			//delta=SoMoSy.Scrollbox.schnell*SoMoSy.Scrollbox.zeit/1000;
		var delta=SoMoSy.Scrollbox.richtung[id]*delta;
		SoMoSy.Scrollbox.altzeit[id]=jetzt;
		var alt=SoMoSy.Scrollbox.aktuell[id];
		var neu=alt+delta;
 		// Ende verlassen
		if (alt==SoMoSy.Scrollbox.max[id])
			SoMoSy.Scrollbox.vor[id].className='vor v1';
		// Anfang verlassen
		if (alt==0)
			SoMoSy.Scrollbox.zurueck[id].className='zurueck z1';
		// am Ende angekommen
		if (delta>0 && neu>=SoMoSy.Scrollbox.max[id])
		{
			neu=SoMoSy.Scrollbox.max[id];
			SoMoSy.Scrollbox.vor[id].className='vor v0';
			if (SoMoSy.Scrollbox.gang[id]!=2)
				SoMoSy.Scrollbox.richtung[id]=-1;
		}
		// am Ende angekommen
		if (delta<0 && neu<=0)
		{
			neu=0;
			SoMoSy.Scrollbox.zurueck[id].className='zurueck z0';
			if (SoMoSy.Scrollbox.gang[id]!=2)
				SoMoSy.Scrollbox.richtung[id]=1;
		}
		// neuen Zustand setzen
		SoMoSy.Scrollbox.aktuell[id]=neu;
		if (SoMoSy.Scrollbox.vertikal[id])
			SoMoSy.Scrollbox.inhalt[id].style.top='-'+neu+'px';
		else
			SoMoSy.Scrollbox.inhalt[id].style.left='-'+neu+'px';
	}
		setTimeout(function(){SoMoSy.Scrollbox.schieben(id);},SoMoSy.Scrollbox.zeit);
}

// ------------------------------------------------------------------
// !Funktionen zum rutschenden Menü
// ------------------------------------------------------------------

// Namespace erweitern
namespace('SoMoSy.Menuefix');

// Die Funktion startet das Nachrutschen für ein div-Element
// ebene ist die ID des div-Elementes
// unten ist die ID des Elementes, die nach unten begrenzt
// wartezeit ist die Wartezeit zwischen User-Scrollen und Menü-Bewegung
SoMoSy.Menuefix.init=function(ebene,unten,wartezeit)
{
	// Parameter speichern
	SoMoSy.Menuefix.ebene=document.getElementById(ebene);
	SoMoSy.Menuefix.unten=document.getElementById(unten);
	SoMoSy.Menuefix.wartezeit=wartezeit;

	// Initialisierungen
	SoMoSy.Menuefix.randIst=0;
	SoMoSy.Menuefix.randNeu=0;
	SoMoSy.Menuefix.bewegung=false;
	
	// ursprüngliche Ränder des Menüs
	var style=SoMoSy.DOM.getStyle(SoMoSy.Menuefix.ebene);
	SoMoSy.Menuefix.minRand=parseInt(style.marginTop);
	SoMoSy.Menuefix.menueMarginBottom=parseInt(style.marginBottom);
	
	// onScroll- und onResize-Handler
	window.onscroll=SoMoSy.Menuefix.neuePosition;
	window.onresize=SoMoSy.Menuefix.neuePosition;
	
	// Startposition speichern
	SoMoSy.Menuefix.neuePosition();
}

// Die Funktion berechnet eine neue Zielposition für die Ebene
SoMoSy.Menuefix.neuePosition=function()
{
	// Menuedaten sammeln
	var menueHoehe=SoMoSy.Menuefix.ebene.offsetHeight;
	var menueTop=SoMoSy.Menuefix.ebene.offsetTop;
	var style=SoMoSy.DOM.getStyle(SoMoSy.Menuefix.ebene);
	var menueMarginTop=parseInt(style.marginTop);
	// untere Daten sammeln
	var untenTop=SoMoSy.Menuefix.unten.offsetTop;
	style=SoMoSy.DOM.getStyle(SoMoSy.Menuefix.unten);
	var untenMarginTop=parseInt(style.marginTop);
	
	// Scrollbereich berechnen
	var maxRand=untenTop-menueTop-menueHoehe-SoMoSy.Menuefix.menueMarginBottom-untenMarginTop+menueMarginTop;

	// Scrollposition und Fensterhöhe auslesen
	var offset=0;
	var hoehe=false;
	if (typeof(self.pageYOffset)=="number") // normale Browser
	{
		offset=self.pageYOffset;
		hoehe=self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientHeight) // IE 6/7
	{
		offset=document.documentElement.scrollTop;
		hoehe=document.documentElement.clientHeight;
	}
	else if (document.body) // IE 5.x
	{
		offset=document.body.scrollTop;
		hoehe=document.body.clientHeight;
	}
	if (hoehe)
	{
		var rand=offset-(menueTop-menueMarginTop);
		if (hoehe<menueHoehe)
			// Bei zu kleinem Bildschirm das Menü nicht scrollen
			rand=0;
		if (rand<SoMoSy.Menuefix.minRand) rand=SoMoSy.Menuefix.minRand;
		if (rand>maxRand) rand=maxRand;
		// Menü verschieben, wenn neuer Wert
		if (rand!=SoMoSy.Menuefix.randNeu)
		{
			SoMoSy.Menuefix.randNeu=rand;
			SoMoSy.Menuefix.neuerWert=new Date().getTime();
			if (!SoMoSy.Menuefix.bewegung)
			{
				SoMoSy.Menuefix.bewegung=true;
				setTimeout("SoMoSy.Menuefix.ebeneBewegen();",SoMoSy.Menuefix.wartezeit*0.8);
			}
		}
	}
}

// Die Funktion bewegt die Ebene ein Stück
SoMoSy.Menuefix.ebeneBewegen=function()
{
	if (new Date().getTime()-SoMoSy.Menuefix.neuerWert>SoMoSy.Menuefix.wartezeit)
	{
		var randSoll=SoMoSy.Menuefix.randNeu;
		var diff=Math.abs(randSoll-SoMoSy.Menuefix.randIst);
		var schritt=parseInt(1+0.5*diff);
		if (randSoll>SoMoSy.Menuefix.randIst)
			SoMoSy.Menuefix.randIst=SoMoSy.Menuefix.randIst+schritt;
		else
			SoMoSy.Menuefix.randIst=SoMoSy.Menuefix.randIst-schritt;
		SoMoSy.Menuefix.ebene.style.marginTop=SoMoSy.Menuefix.randIst+"px";
		if (randSoll!=SoMoSy.Menuefix.randIst)
			setTimeout("SoMoSy.Menuefix.ebeneBewegen();",50);
		else
			SoMoSy.Menuefix.bewegung=false;
	}
	else
		setTimeout("SoMoSy.Menuefix.ebeneBewegen();",SoMoSy.Menuefix.wartezeit*0.2);
}

