/**
 * AjaxHelper
 * Stellt statische Methoden zum Handling eines AJAX-Response
 * zur Verfuegung
 * Beispielverwendung:
   
   new Ajax.Request('path', {
		method: 'post',
		parameters: '',
		onSuccess: function(x) {
			AjaxHelper.requestSuccess(x, messageElem, doAfterSucces, doAfterError, callAfterLogin);
		}
		onFailure: function(x) {
			AjaxHelper.onFailure(messageElem);
		}
	});
	 
 */
var AjaxHelper = Class.create({
	
	regLoginData: Object(),

	/**
	 * requestSuccess()
	 * Es wurde ein 2xx-Header geantwortet
	 * requestSuccess wertet die Antwort aus
	 * @param x				Prototype-Daten
	 * @param messageElem	Id des Elements, in dem die Erfolgs- oder Fehlermeldung
	 *						angezeigt werden soll. Ist der Wert 'modal' wird die
	 *						Nachricht im ModalFenster angezeigt
	 * @param successCallback	Callback-Funktion, nicht bei fehlerfreien Daten ausgefuehrt wird
	 * @param errorCallback	Callback-Funktion, die bei fehlerhaften Daten ausgefuehrt wird
	 * @param overrideSystemMessageOptions Fuer die Anzeige der System-Messages koennen verschiedenen
	 						Eigenschaften angegeben werden. Dabei koennen folgende Standardwerte
	 						ueberschrieben werden
	 						hideSuccessMessageBoxAfter : 5
	 						showSuccessMessage : true
	 						Die Werte koennen mit einer {key:value} Liste ueberschrieben werden
	 * @param callAfterLogin Zeiger auf die Methode, die nach einem erfolgreichen Login ausgefuehrt wird
	 						 Dieser Parameter ist nur ein Zeiger auf die aufrufende Methode des AJAX-Requests,
	 						 um nach einem Login diese erneut starten zu koennen
	 */
	requestSuccess : function(x, messageElem, successCallback, errorCallback, overrideSystemMessageOptions, callAfterLogin, callingArguments) {
		// Standardeinstellungen fuer die Darstellung der System-
		// messages
		var systemMessageOptions = new Hash();
		systemMessageOptions.set('hideSuccessMessageBoxAfter', 10);
		systemMessageOptions.set('showSuccessMessage', true);
		systemMessageOptions.set('showErrorMessage', true);
		
		var messageElemTemp = $(messageElem);
		if (messageElemTemp) {
			messageElemTemp.hide();
		}
		
		// Standardeinstellungen ueberschreiben, falls gesetzt
		overrideSystemMessageOptions = new Hash(overrideSystemMessageOptions);
		if(overrideSystemMessageOptions != undefined) {
			overrideSystemMessageOptions.each(function(pair) {
				systemMessageOptions.set(pair.key, pair.value);
			});
		}
		
		// JSON-Response. Wird automatisch von prototype geparst
		if(x.responseJSON == undefined)
			jsonResponse = x.evalJSON();
		else
			jsonResponse = x.responseJSON;

		// Hier werden nur Fehler im JSON selbst oder
		// 500er auf dem Server abgefangen
		// Der JSON-Code ist nicht valide oder
		// es ist ein fehler auf dem Server aufgetreten
		if(jsonResponse == null || jsonResponse.status == '0' || jsonResponse.status == undefined) {
			this._ShowStandardMessage('error', 'Es ist ein Systemfehler aufgetreten.' + ((jsonResponse == null) ? ' ' + jsonResponse.message : ''));
			return;
		}

		// Der AJAX-Call hat funktioniert. Jetzt wird
		// geprueft, ob ein semantischer Fehler aufgetreten ist
		if(jsonResponse.status == '2' || jsonResponse.status == '3') {

			// Wenn als Element modal angegeben wurde, den Fehler
			// im ModalWindow ausgeben
			if(messageElem == 'modal' || (!$(messageElem) && !errorCallback)) {
				this._ShowStandardMessage('error', jsonResponse.message, systemMessageOptions);
			} else {
				this._showSystemMessageInElement(messageElem, 'error', jsonResponse.message, systemMessageOptions);
			}
			// Auch wenn prototype selbst erkennt, wenn der Response-Code
			// JS enthaelt und diesen direkt mit eval ausfuehrt, wird hier
			// mit Callback-Fkt. gearbeitet, um Backend und Frontend klar
			// zu trennen
			if(errorCallback != undefined && errorCallback != null)
				errorCallback.apply(this, Object.values(jsonResponse.callbackData));

			return;

		}
			


		// hat funktioniert (status is 1), gruene message zeigen
		if(messageElem == 'modal' || !$(messageElem))
			this._ShowStandardMessage('success', jsonResponse.message, systemMessageOptions);
		else
			this._showSystemMessageInElement(messageElem, 'success', jsonResponse.message, systemMessageOptions);
		
		if(successCallback != "undefined") {
			successCallback.apply(this, Object.values(jsonResponse.callbackData));
		}
	},
	
	onFailure : function(messageElem, transport) {

		if(messageElem == 'modal' || !$(messageElem))
			this._ShowStandardMessage('error', 'Es ist ein Systemfehler aufgetreten.');
		else
			this._showSystemMessageInElement(messageElem, 'error', 'Es ist ein Systemfehler aufgetreten.');
	},

	_showSystemMessageInElement : function(messageElem, type, text, systemMessageOptions) {

		if(!systemMessageOptions.get('showSuccessMessage') && type == 'success'){
			return;
		}
			
		if(!systemMessageOptions.get('showErrorMessage') && type == 'error') {
			return;
		}
		$(messageElem).removeClassName('errorMessage');
		$(messageElem).removeClassName('successMessage');
		
		$(messageElem).addClassName(type + 'Message');

		$(messageElem).hide();

		$(messageElem).update('<div>' + text + '</div>');
		
		$(messageElem).show();
		//new Effect.BlindDown(messageElem);
		
		if(systemMessageOptions.get('hideSuccessMessageBoxAfter') > 0)
			this._BlindUpFunction.delay(systemMessageOptions.get('hideSuccessMessageBoxAfter'), messageElem);
	},
	
	_ShowStandardMessage : function(type, text, overrideSystemMessageOptions) {
		
		// Standardeinstellungen fuer die Darstellung der System-
		// messages
		var systemMessageOptions = new Hash();
		systemMessageOptions.set('hideSuccessMessageBoxAfter', 10);
		systemMessageOptions.set('showSuccessMessage', true);
		systemMessageOptions.set('showErrorMessage', true);
		
		// Standardeinstellungen ueberschreiben, falls gesetzt
		overrideSystemMessageOptions = new Hash(overrideSystemMessageOptions);
		if(overrideSystemMessageOptions != undefined) {
			overrideSystemMessageOptions.each(function(pair) {
				systemMessageOptions.set(pair.key, pair.value);
			});
		}
		
		if(!systemMessageOptions.get('showSuccessMessage') && type == 'success')
			return;
	
		if(!systemMessageOptions.get('showErrorMessage') && type == 'error')
			return;
		
		if (type == 'error') {
			window.errorDialogManager.displayError(text);
		} else {
			window.dialogManager.displayMessage(text);
		}
	},
	
	_BlindUpFunction : function(elem) {
		$(elem).hide();
		//new Effect.BlindUp(elem);
	}

});


var aHO = new AjaxHelper();