/**
 * Ajax-SearchInfos für die "Neue Suche 2009"
 *
 * @author gadam
 * @since 2009-09-14
 */

var immosearchinfos = {
	/** Browser-Cache für SearchInfos, damit doppelte Aufrufe vermieden werden */
	cache: new Object(),
	/** Das Request-Objekt für den aktuellen AJAX-Aufruf */
	request: null,

	/**
	 * Ein Formular auslesen und aus den Feldern einen Query-String machen.
	 * Felder, deren Name mit "ajax" beginnt, werden ignoriert.
	 * Ebenso alle Felder, deren Name in <ignoreField> enthalten ist.
	 */
	formToQuery: function(form,ignoreField) {
		// Ajax-Aufrufe sind UTF-8 kodiert - das muß die Action wissen
		var params = "charset=utf-8";
		for (i = 0; i < form.elements.length; i++) {
			var ignoreFlag = true;
			if (ignoreField != null) {
				if (ignoreField.indexOf(form.elements[i].name) >= 0) {
					ignoreFlag = false;
				}
			}
			if ((form.elements[i].name.substr(0,4) != 'ajax') && ignoreFlag) {
				if ((form.elements[i].type.substr(0,6) == 'hidden') || (form.elements[i].type.substr(0,5) == 'text')) {
					if (params != "") {
						params = params.concat("&");
					}
					params = params.concat(form.elements[i].name).concat("=").concat(encodeURIComponent(form.elements[i].value));
				} else if ((form.elements[i].type.substr(0,8) == 'checkbox') || (form.elements[i].type.substr(0,5) == 'radio')) {
					if (form.elements[i].checked == true) {
						if (params != "") {
							params = params.concat("&");
						}
						params = params.concat(form.elements[i].name).concat("=").concat(encodeURIComponent(form.elements[i].value));
					}
				} else if (form.elements[i].type.substr(0,6) == 'select') {
					for (j = 0; j < form.elements[i].options.length; j++) {
						if (form.elements[i].options[j].selected == true) {
							if (params != "") {
								params = params.concat("&");
							}
							params = params.concat(form.elements[i].name).concat("=").concat(encodeURIComponent(form.elements[i].options[j].value));
						}
					}
				}
			}
		}
		return(params);
	},
	
	perform: function(url,form,clrFlag) {
		if (form != null) {
			if ((clrFlag != null) && clrFlag) {
				// Ortsauswahl nur leeren, wenn sich der Ort ändert
				var oldname = document.getElementById("ajaxlocationname");
				var newname = document.getElementById("locationname");
				if ((oldname != null) && (newname != null) && (oldname.value != newname.value)) {
					var geoElem = document.getElementById("ortseingabe");
					if (geoElem != null) {
						geoElem.innerHTML = '';
					}
				}
			}
			// Parameter aus dem Formular holen 
			var params = immosearchinfos.formToQuery(form,null);
			// Nachsehen, ob Daten im Cache vorhanden sind
			var data = immosearchinfos.cache[encodeURIComponent(params)];
			if (data == null) {
				// Keine Daten im Cache - Ajax-Aufruf starten
				immosearchinfos.startRequest(url,params);
			} else {
				// Die Cache-Daten im Formular anzeigen
				immosearchinfos.updateFields(data);
			}
		}
		//
		// Die Fehlermeldungen löschen
		//
		var errorElem = document.getElementById("errorcode");
		if (errorElem != null) {
			errorElem.innerHTML = '';
		}
		errorElem = document.getElementById("_error");
		if (errorElem != null) {
			errorElem.innerHTML = '';
		}
		return(true);
	},

	/**
	 * Callback für den AJAX-Aufruf.
	 * Wird aufgerufen, wenn es einen Statuswechsel gibt.
	 */
	processStateChange: function() {
		// AJAX-Aufruf ist beendet?
		if (immosearchinfos.request.readyState == 4) {
			// AJAX-Aufruf war erfolgreich?
			if (immosearchinfos.request.status == 200) {
				// Die SearchInfos aus der AJAX-Antwort lesen und speichern
				try {
					var data = immosearchinfos.request.responseText;
					if (data != null) {
						// Die Daten im Formular anzeigen
						immosearchinfos.updateFields(data);
					}
				}
				catch(e) {
				}
			}
			// Das Request-Objekt wieder löschen
			immosearchinfos.request = null;
		}
	},


	/**
	 * Einen AJAX-Aufruf starten, um die SearchInfos für den aktuellen Formularinhalt zu holen
	 */
	startRequest: function(url,params) {
		// Wenn es Parameter gibt und kein Ajax-Aufruf aktiv ist
		if ((params != null) && (params != "") && (immosearchinfos.request == null)) {
			// Ein Request-Objekt erstellen
			if (window.XMLHttpRequest) {
				immosearchinfos.request = new XMLHttpRequest();
			}
			else if (window.ActiveXObject) {
				try {
					immosearchinfos.request = new ActiveXObject("Msxml2.XMLHTTP");
				}
				catch(e) {
					immosearchinfos.request = new ActiveXObject("Microsoft.XMLHTTP");
				}
			}
			if (immosearchinfos.request != null) {
				// Die Callback-Funktion eintragen
				immosearchinfos.request.onreadystatechange = immosearchinfos.processStateChange;
				// Die Parameter an die Action übergeben
				immosearchinfos.request.open("GET", url + "?" + params, true);
				// Den Aufruf starten
				immosearchinfos.request.send(null);
			}
		}
	},

	/**
	 * Die vorher ausgewählten Orte wieder auswählen
	 */
	reselectPlaces: function() {
		var fromElem = document.getElementById("ajaxquerystring");
		if (fromElem != null) {
			try {
				var params = fromElem.value.split("&");
				/** Array der Zahlen für jeden Ort: [prefix,id,fieldinfoname,htmlname,count] */
				var celem = document.getElementById("ajaxlocationcount");
				if (celem != null) {
					var counts = eval(celem.value);
					/* Die Liste der Einträge durchlaufen und die markierten Einträge heraussuchen */
					for (i = 0; i < counts.length; i++) {
						// [0 =prefix,1=id,2=fieldinfoname,3=htmlname,4=count]
						var elem = document.getElementById(counts[i][0]+String(counts[i][1]));
						if ((elem != null) && (elem.type.substr(0,8) == 'checkbox')) {
							var p = counts[i][2]+"=";
							for (j = 0; j < params.length; j++) {
								if (params[j].substr(0,p.length) == p) {
									if (params[j] == p+id) {
										elem.checked = true;
									}
								}
							}
						}
					}
				}
			} catch(e) {}
		}
	},

	/**
	 * Die SearchInfos in die Formularfelder übernehmen
	 */
	updateFields: function(data) {
		try {
			var geoElem = document.getElementById("ortseingabe");
			if (geoElem != null) {
				//
				// Die Ortsauswahl aktualisieren
				//
				if(data != null){
					geoElem.innerHTML = data;
					
					//
					// Die SearchInfos im Cache unter dem Query-String ablegen
					//
					var fromElem = document.getElementById("ajaxquerystring");
					if (fromElem != null) {
						immosearchinfos.cache[encodeURIComponent(fromElem.value)] = data;
						immosearchinfos.reselectPlaces();
					}
				}
				//
				// Den Gesamtzähler übertragen
				//
				immosearchinfos.setTotalCount();
				//
				// Die Location-Auswahl übertragen (locationname und <actype>=<acid>)
				//
				fromElem = document.getElementById("ajaxlocationname");
				if (fromElem != null) {
					var toElem = document.getElementById("locationname");
					if (toElem != null) {
						toElem.value = fromElem.value;
					}
				}
				fromElem = document.getElementById("ajaxactype");
				if (fromElem != null) {
					var toElem = document.getElementById("actype");
					if (toElem != null) {
						toElem.value = fromElem.value;
					}
				}
				fromElem = document.getElementById("ajaxacid");
				if (fromElem != null) {
					var toElem = document.getElementById("acid");
					if (toElem != null) {
						toElem.value = fromElem.value;
					}
				}
			}
		}
		catch(e) {
		}
	},

	/**
	 * Die Gesamtzahl der Treffer im Submit-Button eintragen
	 */
	setTotalCount: function() {
		fromElem = document.getElementById("ajaxtotalcount");
		if (fromElem != null) {
			var toElem = document.getElementById("totalCount");
			var toElemExt = document.getElementById("totalCountExt");
			if (toElem != null) {
				toElem.innerHTML = fromElem.value;
				if (toElemExt != null) {
					if (fromElem.value == 1)
						toElemExt.innerHTML = "Ergebnis anzeigen";
					else 
						toElemExt.innerHTML = "Ergebnisse anzeigen";
				}
			}
		}
	},

	/**
	 * Bei einem Wechsel der ausgewählten Orte die Gesamtzahl der Treffer neu berechnen und die Liste der markierten Orte neu generieren
	 */
	totalCountSet: function() {
		var toElem = document.getElementById("ajaxtotalcount");
		var listElem = document.getElementById("auswahlhinweis");
		var newCount = 0;
		var entryCount = 0;
		var entryList = '';
		try {
			/** Array der Zahlen für jeden Ort: [prefix,id,fieldinfoname,htmlname,count] */
			var celem = document.getElementById("ajaxlocationcount");
			if (celem != null) {
				var counts = eval(celem.value);
				/* Die Liste der Einträge durchlaufen und die markierten Einträge auflisten */
				for (i = 0; i < counts.length; i++) {
					// [0 =prefix,1=id,2=fieldinfoname,3=htmlname,4=count]
					var elem = document.getElementById(counts[i][0]+String(counts[i][1]));
					if ((elem != null) && (elem.type.substr(0,8) == 'checkbox')) {
						if (elem.checked == true) {
							newCount = newCount + counts[i][4];
							entryCount = entryCount + 1;
							if (entryList.length > 0) entryList = entryList + ', ';
							entryList = entryList + counts[i][3];
						}
					}
				}
			}
		} catch(e) {}
		if (entryCount == 0) {
			//
			// Keine Orte markiert
			// Gesamtzahl in den Button und "Alle Orte" markieren
			//
			var locCntElem = document.getElementById("ajaxlocationtotalcount");
			if ((toElem != null) && (locCntElem != null))
				toElem.value = String(locCntElem.value);
			if (listElem != null)
				listElem.innerHTML = '<span class="hinweistext">oder einzelne Orte w&auml;hlen</span>';
			var elem = document.getElementById('ortealle');
			if (elem != null) {
				elem.checked = true;
			}
		} else {
			//
			// Einige Orte markiert
			// Summe in den Button und Liste der markierten Orte anzeigen
			//
			if (toElem != null)
				toElem.value = String(newCount);
			if (listElem != null) {
				if (entryList.length > 32) {
					entryList = entryList.substr(0,32);
					entryList = entryList + '...';
				}
				listElem.innerHTML =
					'<span class="hinweistext">' + String(entryCount) + ((entryCount) == 1 ? ' Ort' : ' Orte') + ' gew&auml;hlt:</span>' +
					' ' + 
					'<span class="ortsnamen">' + entryList + '</span>';
			}
		}
		immosearchinfos.setTotalCount();
	}

}
