﻿/*
-- AJAX-SKRIPT --
Erlaubt das Durchführen von AJAX-Abfragen und -Befehlen und stellt viele Funktionen dazu bereit.
*/

/* VARIABLEN */

// Legt fest, ob gerade eine AJAX-Abfrage läuft (verhindert, dass mehrere gleichzeitig abgeschickt werden)
var reqLaeuft = false;

// Entspricht dem dynamisch geladenen TinyMCE-Editor
var ed = null;


// Führt eine AJAX-Abfrage aus und gibt diese dann aus
// Parameter:
// -> url: Die Adresse des aufzurufenden Skripts / der aufzurufenden Datei
// -> [OPTIONAL] akt: Eine der Optionen, die in der Rückgabefunktion definiert werden
// -> [OPTIONAL] parameter: Falls POST verwendet werden soll, muss diese Variable gesetzt werden, bei GET muss sie leer bleiben
// -> [OPTIONAL] data: Ein Wert, der bei bestimmten Funktion gebraucht werden kann, z.B. bei edit_prof zum Anzeigen des bearbeiteten Profils
function AJAXRequest()
{
	// Läuft schon eine Anfrage?
	if(reqLaeuft)
	{
		alert("Geduld!");
		return;
	}
	
	// Argumente
	var url = arguments[0];
	var akt = '';
	var parameter = '';
	var data = '1';
	if(arguments[1])
	{
		akt = arguments[1];
	}
	if(arguments[2])
	{
		parameter = arguments[2];
	}
	if(arguments[3])
	{
		data = arguments[3];
	}
	
	
	// Erstellen der Anfrage
	var req = null;

	try
	{
		req = new XMLHttpRequest();
	}
	catch(ms) // Internet Explorer
	{
		try
		{
			req = new ActiveXObject("Msxml2.XMLHTTP");
		} 
		catch(nonms)
		{
			try
			{
				req = new ActiveXObject("Microsoft.XMLHTTP");
			} 
			catch(failed) // Fehler bei Verbindung
			{
				req = null;
			}
		}  
	}

	if (req == null)
	{
		alert("Fehler beim Erstellen des Requests!");
	}
	
	// Anfrage wird erstellt
	if(parameter == '')
	{
		// GET
		req.open("GET", url, true);
	}
	else
	{
		// POST
		req.open("POST", url, true);
	}
	
	// Ladebalken
	load_grafik();
	
	// Anfrage läuft
	reqLaeuft = true;
	
	// Beim Abschließen der Anfrage wird diese Funktion ausgeführt
	req.onreadystatechange = function()
	{            
		switch(req.readyState)
		{
			case 4:
			{
				// Fehler bei der Anfrage?
				if(req.status != 200)
				{
					alert("Fehler: " + req.status); 
				}
				else
				{    
					// Dieser Code wird bei erfolgreichem Request ausgeführt
					// => Hier können die Aktionen abgefragt werden, die ausgeführt werden sollen (Argument "akt")
					
					// Erstmal wieder den AJAX-Container leeren...
					setResBox("");
					
					// Anfrage ist beendet
					reqLaeuft = false;
					
					// Wenn akt leer ist, wird der Wert über alert() ausgegeben
					if(akt == '')
					{
						alert(req.responseText);
					}
					else if(akt == "login")
					{
						var firstChar = req.responseText[0];
						if(firstChar == "1")
						{
							// Weiterleitung
							location.href = URL_START;
						}
						else
						{
							setResBox(req.responseText, '_login');
						}
					}
					else if(akt == "wartung_login")
					{
						var firstChar = req.responseText[0];
						if(firstChar == "1")
						{
							// Weiterleitung
							location.href = URL_START;
						}
						else
						{
							createDIVBox('<p class="frage" style="color: red;">' + req.responseText + '</p>');
						}
					}
					else if(akt == "register")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "register_ok")
					{
						setResBox(req.responseText);
					}
					else if(akt == "edit_news")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "edit_news_ok")
					{
						setResBox(req.responseText);
					}
					else if(akt == "del_news")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "del_news_ok")
					{
						setResBox(req.responseText);
					}
					else if(akt == "new_news")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "new_news_ok")
					{
						setResBox(req.responseText);
					}
					else if(akt == "edit_user")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "edit_user_ok")
					{
						setResBox(req.responseText);
					}
					else if(akt == "del_user")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "del_user_ok")
					{
						setResBox(req.responseText);
					}
					else if(akt == "edit_content")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "edit_content_ok")
					{
						setResBox(req.responseText);
					}
					else if(akt == "edit_cats_ok")
					{
						setResBox(req.responseText);
					}
					else if(akt == "save_tippspiel")
					{
						setResBox(req.responseText);
					}
					else if(akt == "show_logs")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "edit_group")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "edit_group_ok")
					{
						setResBox(req.responseText);
					}
					else if(akt == "create_group")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "create_group_ok")
					{
						setResBox(req.responseText);
					}
					else if(akt == "del_group")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "del_group_ok")
					{
						setResBox(req.responseText);
					}
					else if(akt == "edit_rang")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "edit_rang_ok")
					{
						setResBox(req.responseText);
					}
					else if(akt == "create_rang")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "create_rang_ok")
					{
						setResBox(req.responseText);
					}
					else if(akt == "del_rang")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "del_rang_ok")
					{
						setResBox(req.responseText);
					}
					else if(akt == "save_config")
					{
						var firstChar = req.responseText[0];
						if(firstChar == "1")
						{
							// Neu laden
							window.location.reload();
						}
						else
						{
							createDIVBox('<p class="frage" style="color: red;">' + req.responseText + '</p>');
						}
					}
					else if(akt == "forgot_pw")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "forgot_pw_ok")
					{
						setResBox(req.responseText);
					}
					else if(akt == "edit_termin")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "edit_termin_ok")
					{
						// Terminzeile ersetzen
						document.getElementById("termin_" + data).innerHTML = req.responseText;
						
						// Meldung
						setResBox("<p class=\"meldung\">Bearbeiten des Termins erfolgreich!</p><br>");
					}
					else if(akt == "create_termin")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "create_termin_ok")
					{
						// Neue Terminzeile hinzufügen
						document.getElementById("termin_table").innerHTML += req.responseText;
						
						// Meldung
						setResBox("<p class=\"meldung\">Erstellen des Termins erfolgreich!</p><br>");
					}
					else if(akt == "del_termin")
					{
						createDIVBox(req.responseText);
					}
					else if(akt == "del_termin_ok")
					{
						if(req.responseText[0] == "1")
						{
							// Terminzeile löschen
							var tr = document.getElementById("termin_" + data);
							tr.parentNode.removeChild(tr);
							
							// Meldung
							setResBox("<p class=\"meldung\">L&ouml;schen des Termins erfolgreich!</p><br>");
						}
						else
						{
							setResBox(req.responseText);
						}
					}
				}
				break;
			}
			default:
			{
				return false;
				break;   
			}			
		}
	};
	
	req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	req.setRequestHeader("Content-Length", parameter.length);
	req.setRequestHeader("Connection", "close");
	
	if(parameter == '')
	{
		req.send(null);
	}
	else
	{
		req.send(parameter);
	}	
}

// Liest die Parameter des übergebenen Formulars aus und schreibt diese in einen String -- Nur bei POST!!
// Parameter:
// -> form: Das auszulesende Formular
function parameter_erstellen(form)
{
	var ausg = '';
	var formular = document.forms[form];
	for(var i = 0; i < formular.elements.length; i++)
	{
		var name = formular.elements[i].name;
		var wert = formular.elements[i].value;
		if(formular.elements[i].type == "checkbox")
		{
			if(formular.elements[i].checked == false)
			{
				continue;
			}
		}
		ausg += name + "=" + url_encode(wert);
		if(i < formular.elements.length - 1)
		{
			ausg += "&";
		}
	}
	return ausg;
}

// Kodiert eine Zeichenkette zur Verwendung in einer URL
// Parameter:
// -> wert: Die zu kodierende Zeichenkette
function url_encode(wert)
{
	var ret = wert;
	
	// Absichern des Prozentzeichens
	ret = ret.replace(/%/g, "%25");
	
	// Absichern des &-Zeichens
	ret = ret.replace(/&/g, "%26");
	
	// Absichern des +-Zeichens
	ret = ret.replace(/\+/g, "%2B");
	
	return ret;
}

// Setzt den Inhalt des AJAX-Containers
// Parameter:
// -> wert: Der neue Inhalt des AJAX-Containers
// -> [OPTIONAL] id: Eine evtl. angehängte ID eines weiteren AJAX-Conatiners
// -> [OPTIONAL] scroll: Falls true, wird immer nach oben gescrollt
function setResBox(wert)
{
	var extrID = "";
	if(arguments[1])
	{
		extrID = arguments[1];
	}
	
	// Inhalt des AJAX-Containers setzen
	document.getElementById("ajax_container" + extrID).innerHTML = wert;
	
	// Nach oben scrollen
	if(arguments[2])
	{
		window.scrollTo(0, 0);
	}
}

// Erstellt eine über allem schwebende Box mit dem angegebenen Inhalt
// Parameter:
// -> wert: Der Inhalt der Box
// -> [OPTIONAL] clear: Falls true, wird vorher der AJAX-Container mit der angegebenen ID id geleert
// -> [OPTIONAL] width: Die Breite, auf die die Box beschränkt werden soll
// -> [OPTIONAL] remove_border: Falls true, wird der Rahmen weggelassen
// -> [OPTIONAL] no_scroll: Falls true, wird nicht nach oben gescrollt
function createDIVBox(wert)
{
	// Allgemeines Über-Alles-Element erstellen (auch grauer Hintergrund)
	var box = document.createElement("div");
	box.className = "overall";
	box.id = "AJAXDIVBox";
	box.style.opacity = 0.01;
	
	// JavaScript aus der Rückgabe filtern
	var scripts = document.getElementsByTagName("script");
	
	// Box mit dem Inhalt
	var contentBox = document.createElement("div");
	contentBox.className = "overall_content";
	contentBox.id = "AJAXDIVBoxContent";
	contentBox.innerHTML = wert;
	
	// X-Button oben rechts
	var contentBoxClose = document.createElement("div");
	contentBoxClose.className = "overall_close";
	contentBoxClose.id = "AJAXDIVBoxClose";
	contentBoxClose.title = "Schließen";
	contentBox.appendChild(contentBoxClose);
	
	// Container ggf. löschen
	if(arguments[1])
	{
		document.getElementById("ajax_container").innerHTML = "";
	}
	
	document.getElementById("ajax_container").appendChild(box);
	document.getElementById("ajax_container").appendChild(contentBox);
	
	document.getElementById("AJAXDIVBoxClose").setAttribute("onclick", "closeDIVBox();");
	
	// JavaScript ausführen
	for(var i = 0; i < scripts.length; i++)
	{
		// Skript berechnen
		eval(scripts[i].text);
	}
	
	// Ggf. Breite ändern
	if(arguments[2])
	{
		contentBox.style.minWidth = arguments[2] + "px";
		contentBox.style.marginLeft = -(arguments[2] / 2) + "px";
	}
	
	// Ggf. Rahmen löschen
	if(arguments[3])
	{
		contentBox.style.border = "0px solid black";
	}
	
	// Ausrichten
	contentBox.style.marginLeft = "-" + (contentBox.offsetWidth / 2) + "px";
	
	stufenOpacity("AJAXDIVBox", 0.8);
	
	// Nach oben scrollen
	if(!arguments[4])
	{
		stufenScroll();
	}
}

// Erstellt eine über allem schwebende Box als Haupt-Fenster; sie kann nicht per createDIVBox() entfernt werden
// Parameter:
// -> wert: Der Inhalt des Fenster
function createMainWindow(wert)
{
	var box = document.createElement("div");
	box.className = "overall";
	box.id = "MainDIVWindow";
	box.style.opacity = 0.01;
	
	var contentBox = document.createElement("div");
	contentBox.className = "mainwindow_content";
	contentBox.id = "MainDIVWindowContent";
	contentBox.innerHTML = wert;
	
	var contentBoxClose = document.createElement("div");
	contentBoxClose.className = "overall_close";
	contentBoxClose.id = "MainDIVWindowClose";
	contentBoxClose.title = "Schließen";
	contentBox.appendChild(contentBoxClose);
	
	document.getElementById("mainwindow_container").appendChild(box);
	document.getElementById("mainwindow_container").appendChild(contentBox);
	
	document.getElementById("MainDIVWindowClose").setAttribute("onclick", "closeMainWindow();");
	
	// Ausrichten
	contentBox.style.marginLeft = "-" + (contentBox.offsetWidth / 2) + "px";

	stufenOpacity("MainDIVWindow", 0.8);
}

// Setzt die Durchsichtigkeit eines Elements stufenweise herunter
// Parameter:
// -> elemID: Das herabzustufende Element
// -> max: Der zu erreichende Durchsichtigkeitswert
function stufenOpacity(elemID, max)
{
	var elem = document.getElementById(elemID);
	
	var aktOp = elem.style.opacity * 1;
	
	if(aktOp < max)
	{
		elem.style.opacity = aktOp + 0.01;
		
		setTimeout("stufenOpacity('" + elemID + "', " + max + ")", 2);
	}
}

// Scrollt stufenweise nach oben
function stufenScroll()
{
	// Scrollposition bestimmen
	var scrollPos;
	if(typeof window.pageYOffset != 'undefined')
	{
		scrollPos = window.pageYOffset;
	}
	else if(typeof document.compatMode != 'undefined' && document.compatMode != 'BackCompat')
	{
		scrollPos = document.documentElement.scrollTop;
	}
	else if(typeof document.body != 'undefined')
	{
		scrollPos = document.body.scrollTop;
	}
	
	// Scrollen
	if(scrollPos > 20)
	{
		window.scrollBy(0, -(scrollPos / 3));
		
		setTimeout("stufenScroll()", 1);
	}
}

// Schließt die über allem schwebende Box wieder
function closeDIVBox()
{
	var box = document.getElementById("AJAXDIVBox");
	var contentBox = document.getElementById("AJAXDIVBoxContent");
	document.getElementById("ajax_container").removeChild(box);
	document.getElementById("ajax_container").removeChild(contentBox);
}

// Schließt das Hauptfenster wieder
function closeMainWindow()
{
	var box = document.getElementById("MainDIVWindow");
	var contentBox = document.getElementById("MainDIVWindowContent");
	document.getElementById("mainwindow_container").removeChild(box);
	document.getElementById("mainwindow_container").removeChild(contentBox);
}

// Leert den AJAX-Container
function clear_ajax_box()
{
	document.getElementById("ajax_container").innerHTML = "";
}

// Zeigt den Ladebalken bei Buttons an
function load_grafik()
{
	var td = document.getElementById("submit_td");
	
	// Falls TD nicht gefunden, SPAN suchen
	if(!td)
	{
		td = document.getElementById("submit_obj");
	}
	
	// Objekt gefunden
	if(td)
	{
		// Ladebalken hinzufügen
		var balken = document.createElement("div");
		balken.className = "load_balken";
		
		td.appendChild(balken);
	}
}
