/*
	Sehr simple AJAX-Routinen.
	(c) Ronald Bieber, 2006
	Zur freien, kostenlosen Verwendung in Projekten der DB Systems.
	
	Der Ablauf ist wie folgt:
	- Aus der Seite heraus wird per JavaScript eine fachliche Methode
	  aufgerufen. Je nach Anwendungsfall existieren eine oder mehrerer solcher
	  Methoden fuer jede per AJAX zu erledigende Aufgabe. Auch Art und Anzahl
	  der Parameter haengt von der Fachlichkeit ab.
	- Diese Methode ruft die Funktion performAjaxRequest() auf und uebergibt die
	  aufzurufende URI und den Namen der fachlichen Call-Back-Routine.
	- performAjaxRequest fuehrt den Aufruf aus und beendet seine Arbeit (asynchroner
	  Aufruf).
	- Wenn der Request seinen Status aendert (Response teilweise oder komplett
	  da), wird processStateChange() aufgerufen. Ist die Response vollstaendig,
	  so wird von dort die zuvor angegebene fachliche Call-Back-Routine aufgerufen.
	- Die fachliche Call-Back-Routine interpretiert die Ergebnisse nach eigenem
	  Ermessen.
	 
	Der Code in dieser Datei ist generisch und kann mit beliebiger Fachlichkeit
	kombiniert werden.
*/

var ASYNCHRON = true;
var SYNCHRON = false;

/* Hierrin wird der laufende AJAX-Request gespeichert. In dieser Form sind
   wir nicht Multithreadfaehig, haben aber Schutzmechanismen gegen
   Concurrency-Probleme (d.h., ein laufender Request wird vor Absetzen
   eines neuen Requests abgebrochen).
*/
var req;

/* Hier wird die fachliche Funktion vermerkt, die bei erfolgreicher Antwort
   des Servers aufgerufen wird. Der Aufruf geschieht in der generischen
   Call-Back-Routine "handleAjaxResponse"
*/
var callBackRoutine;

/*
	Hilfsmethode, da setCursor() nicht in allen Browsern definiert ist (z.B. nicht
	in Opera 7.5). So aber funktioniert es in IE, Opera, Firefox und Safari.
	
	Es ist auch denkbar, ein anderes visuelles Feedback zu geben, z.B. ein Seitenelement
	analog zur Browser-Aktivitaetsanzeige oben rechts.
*/
function setCursor(style) {
	document.body.style.cursor=style;
}

/*
	Fuehrt einen AJAX-Aufruf durch.
	Paramater:
	1. Die aufzurufende URI, inklusive Parametern (es wird die GET-Methode verwendet).
	2. Der Name der fachlichen Funktion, die sich um die Ergebnisse des Aufrufs
	   kuemmert (asynchron).
	Beispiel:
	   makeAjaxCall("http://my.server.xyz/path/action.do?var=123", myRoutine);
*/  
function makeAjaxCall(uri, fachlicherCallBack) {
	if (req && (req.readyState == 2 || req.readyState == 3)) {
		// falls ein Request laeuft, diesen abbrechen.
		req.abort();
	}

	if (window.XMLHttpRequest) {
		// Hat der Browser ein XMLHttpRequest-Objekt (Mozilla et.al.)?
		req = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		// Oder: Hat der Browser ein ActiveXObjekt (IE)?
		req = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		// Wenn wir einen Browser haben, der weder XMLHttpRequest noch ActiveXObject
		// unterstuetzt, dann koennen wir keinen AJAX-Call absetzen und muessen
		// hier abbrechen.
		// Beispiel: IE < 5, Opera < 7.6
		return;
	}

	callBackRoutine = fachlicherCallBack;
	
	setCursor("wait");

	// Event-Handler registrieren
	req.onreadystatechange = processStateChange;

	// Request abschicken
	req.open("GET", uri, ASYNCHRON);
	req.send(null);
}

function processStateChange() {
	// Status 4 = Request fertig beantwortet
	if (req.readyState == 4) {
		
		// Status 200 = HTTP-Status "OK"
		if (req.status == 200) {
			
			// Mauszeiger zuruecksetzen
			setCursor("auto");
			callBackRoutine();
			
		} else {
			alert("Fehler in der Kommunikation mit dem Server:\n" + req.statusText);
		}
	}
}
