
var AJAXHandler = Class.create({

	/*
	 * Parameter, die von den erbenden Klassen gesetzt werden muessen
	 */

	/* Die verfuegbaren 'actions' */
	availableActions: new Object(),

	/* Die Basis-URL fuer die Requests, *inklusive* ? bzw. & also z.B. "ajax.php?" oder "ajax.php?a=b&" */
	baseRequestURL: '',

	/*
	 * Gibt ein XML-Http-Request-Objekt zurueck
	 */
	getXMLHttpObj: function() {

		var xmlHttp = null;
		// Mozilla, Opera, Safari sowie Internet Explorer 7
		if (typeof XMLHttpRequest != 'undefined') {
			xmlHttp = new XMLHttpRequest();
		}
		if (!xmlHttp) {
			// Internet Explorer 6 und aelter
			try {
				xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");
			} catch(e) {
				try {
					xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");
				} catch(e) {
					xmlHttp  = null;
				}
			}
		}
		if(!xmlHttp)
			return false;

		return xmlHttp;
	},

	/*
	 * Verarbeitet Antworten des Servers
	 */
	handleResponse: function(xmlHttp, Action, callbackFunction) {

		if(Action["xml_output"]) {

			/* Der IE (Versionen 6 + 7 getestet) scheint mit manchen XML-Daten nicht zurechtzukommen.
			 * Daher gibts hier ein haessliches Workaround :) */
			if(navigator.userAgent.indexOf("MSIE") != -1) {

				var xmlRes = new ActiveXObject("Microsoft.XMLDOM");
				xmlRes.loadXML(xmlHttp.responseText);

			} else
				var xmlRes = xmlHttp.responseXML;

			/*
			 * Login-Status updaten
			 */
			var loggedInStatusNode = xmlRes.documentElement.lastChild;
			if(loggedInStatusNode.nodeName == 'logged_in_status') {
				if(loggedInStatusNode.getAttribute('logged_in') == '1') {
					CC.userLoggedIn = true;
					CC.userLoggedInId = parseInt(loggedInStatusNode.getAttribute('logged_in_user_id'));
					CC.userLoggedInNick = loggedInStatusNode.getAttribute('logged_in_user_nick');
				} else {
					CC.userLoggedIn = false;
					CC.userLoggedInId = null;
					CC.userLoggedInNick = null;
				}
			}

			callbackFunction(xmlRes);
		} else
			callbackFunction(xmlHttp.responseText);

	},

	/*
	 * Fuehrt eine der verfuegbaren 'actions' durch
	 */
	doAction: function(actionIdent, paramValues, callbackFunction) {

		/* Ueberpruefen, ob die Action existiert */
		if(!this.availableActions[actionIdent])
			return false;

		/* Aktuelle Action speichern */
		var currentAction = this.availableActions[actionIdent];

		/* Request-URL zusammenbauen */
		var url = this.baseRequestURL + "action=" + actionIdent;

		/* GET-Parameter anhaengen */
		var i;
		for(i = 0; i < currentAction["params"].length; i++) {
			var paramName = currentAction["params"][i];
			url += "&" + encodeURIComponent(paramName) + "=" + encodeURIComponent(paramValues[paramName]);
		}

		/* Eventuell POST-Parameter hinzufuegen */
		if(currentAction["post_params"].length) {

			var postParamString = "";

			for(i = 0; i < currentAction["post_params"].length; i++) {

				if(i > 0)
					postParamString += "&";

				var paramName = currentAction["post_params"][i];
				postParamString += encodeURIComponent(paramName) + "=" + encodeURIComponent(paramValues[paramName]);
			}


			method = "POST";
		} else
			method = "GET";

		/* XML-Http-Request-Objekt erstellen */
		var xmlHttp = this.getXMLHttpObj();

		/* MIME-Type erzwingen - im IE (Versionen 6 + 7 getestet) nicht moeglich */
		if(currentAction["xml_output"] && navigator.userAgent.indexOf("MSIE") == -1)
			xmlHttp.overrideMimeType("text/xml");

		/* URL laden */
		xmlHttp.open(method, url, true);

		/* Da in einer neuen function() das 'this' nicht mehr zur Verfuegung steht */
		handleResponse = this.handleResponse;

		xmlHttp.onreadystatechange = function() {
			if(xmlHttp.readyState != 4)
				return;

			handleResponse(xmlHttp, currentAction, callbackFunction);
		};

		/* Bei POST die Parameter senden */
		if(method == "POST") {
			xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			xmlHttp.setRequestHeader("Content-length", postParamString.length);
			xmlHttp.setRequestHeader("Connection", "close");
			xmlHttp.send(postParamString);
		} else {
			xmlHttp.send(null);
		}

		return true;
	}

});
