// Questim-Search
// Managed und startet die Suche über die Questim-Suchfelder (und Pulldowns)

var doObj = null;
var bodyElm = document.getElementsByTagName('body')[0];

// Default-Werte, werden von Cookie - wenn vorhanden - überschrieben

var clear_criteria = false;	// Criteria-Feld löschen
var clear_location = false;	// Location löschen
var oldSearchLocation = '';	// Alte Location und Criteria (um Refresh-Bedarf zu erkennen)
var oldSearchCriteria = '';
var searchLocation = '';		// Aktuelle Location und Criteria
var searchCriteria = '';
var searchMinLoc = null;		// Min. und Max. Koordinaten. Sie definieren den Kartenausschnit für das Suchergebnis
var searchMaxLoc = null;
var tsTOId = null;				// timeout-ID für Such-Trigger

// Liest cookie und überschreibt ggf. einige der oben angegebenen Variablen:

function getCookie() {
	var location = Cookie.get("location");
	var criteria = Cookie.get("criteria");
	var erwerb = Cookie.get("erwerb");
	var art = Cookie.get("art");

	var size_from = Cookie.get("size_from");
	var size_to = Cookie.get("size_to");
	var price_from = Cookie.get("price_from");
	var price_to = Cookie.get("price_to");

	if (size_from) {
		document.qsearch['headersearch[size][from]'].value = unescape(size_from);
	}
	if (size_to) {
		document.qsearch['headersearch[size][to]'].value = unescape(size_to);
	}
	if (price_from) {
		document.qsearch['headersearch[price][from]'].value = unescape(price_from);
	}
	if (price_to) {
		document.qsearch['headersearch[price][to]'].value = unescape(price_to);
	}
	if (location) {
		$('searchlocation').value = unescape(location);
		document.qsearch['search[location]'].value = unescape(location);
	} else {
		document.qsearch['search[location]'].value = 'München';
		hs.fillFields();
	}
	if (criteria) {
		$('searchcriteria').value = unescape(criteria);
	}
	if (erwerb) {
		var obj = $('erwerb');
		$each(obj.options, function(obj) {
			if (obj.value == erwerb) obj.selected = true;
		});
	}
	if (art) {
		var obj = $('art');
		$each(obj.options, function(obj) {
			if (obj.value == art) obj.selected = true;
		});
	}
}

// Schreibt Such-Informationen in Cookie:

function setCookie() {
	Cookie.set("location",escape($('searchlocation').value),{duration:999});
	Cookie.set("criteria",escape($('searchcriteria').value),{duration:999});
	Cookie.set("erwerb",$('erwerb').value,{duration:999});
	Cookie.set("art",$('art').value,{duration:999});

	Cookie.set("size_from",document.qsearch['headersearch[size][from]'].value,{duration:999});
	Cookie.set("size_to",document.qsearch['headersearch[size][to]'].value,{duration:999});
	Cookie.set("price_from",document.qsearch['headersearch[price][from]'].value,{duration:999});
	Cookie.set("price_to",document.qsearch['headersearch[price][to]'].value,{duration:999});
}

// Such-Trigger, wird 1 Sekunde nach jeweils Eingabe neuer Daten ausgelöst

function triggerSearch() {
	clearTimeout(tsTOId);
	tsTOId = setTimeout(startSearch,1000,false);
}

// Animiert Hintergründe der Eingabefelder, während die Suche läuft

function fieldsAnim(state,which) {
	if (state) {
		$('ifArt').addClass("loading");
		$('ifLage').addClass("loading");
	} else {
		$('ifArt').removeClass("loading");
		$('ifLage').removeClass("loading");
	}
}

// Liest Geo-Informationen aus Google-Placemark-XML

function getPlacemarkFromXml(xml) {
	var fc = xml.getElementsByTagName("result")[0];
	return {
		lat:fc.getAttribute('lat'),
		lng:fc.getAttribute('lng'),
		zoom:fc.getAttribute('zoom'),
		notfound:fc.getAttribute('notfound'),
		cantgeocode:fc.getAttribute('cantgeocode')
	};
}

// Startet die Suche anhand der Such-Felder:

function startSearch(forceTrigger) {
	searchLocation = $('searchlocation').value;
	searchCriteria = $('searchcriteria').value;

	// Wird Q- in Location oder Criteria gefunden, wird direkt auf das entspr. Exposee weitergeleitet
	if (searchLocation.toLowerCase().substr(0,2)=="q-") {
		location.href="/"+searchLocation;
	} else if (searchCriteria.toLowerCase().substr(0,2)=="q-") {
		location.href="/"+searchCriteria;
	}

	var geocode_fail_str =  '<div id="error">'+getText('search','geocode_fail')+'</div>';

	// Location hat sich geändert? Dann wird eine neue Suche angestoßen:

	if (searchLocation != oldSearchLocation) {
		// Vergleich mit im Cookie-Gespeicherter Location, wenn ungleich, wird im displayObject "newPlace" auf true gesetzt,
		// was einen Refresh auslöst

		var cookieLocation = unescape(Cookie.get('location'));
		if (cookieLocation != searchLocation || oldSearchLocation == '') {
			doObj.newPlace = true;
		}

		// Lade-Animationen:

		fieldsAnim(true,"lage");
		$('results').innerHTML = '<div id="result_loading"><img src="/img/loading_16.gif" alt="" /></div>';

		// Location an Geocoder+Cache übergeben

		var GCC = new GGeocodeCache();
		searchLocation = GCC.toCanonical(searchLocation);
		ajax.useXML = true;
		ajax.get("/get_geocache.php?location="+escape(searchLocation), function(xml) {

			// Geodaten auslesen, Lade-Animaton stoppen und entweder Ergebnise oder Fehler anzeigen:

			var placemark = getPlacemarkFromXml(xml);
			if (placemark.cantgeocode!=null) {
				$('results').innerHTML = geocode_fail_str;
				fieldsAnim(false,"art");
				fieldsAnim(false,"lage");
			} else if (placemark.lat!=null) {
				var searchCenterLoc = new GLatLng(placemark.lat, placemark.lng);
				doObj.initZoomLevel = Number(placemark.zoom);
				startSearchCoordinates(searchCenterLoc,false);
			} else {
				$('results').innerHTML = geocode_fail_str;
				fieldsAnim(false,"art");
				fieldsAnim(false,"lage");
			}

			// alte Location merken:
			oldSearchLocation = searchLocation;

		});

	} else if (searchCriteria != oldSearchCriteria || forceTrigger) {

		// Wenn sich das Suchkriterium geändert hat, neue Suche starten, mit gleichen Geo-Informationen wie zuvor als
		// Suchgrundlage für die Objekte:

		fieldsAnim(true,"art");
		$('results').innerHTML = '<div id="result_loading"><img src="/img/loading_16.gif" alt="" /></div>';
		if (searchMinLoc==undefined) {
			$('results').innerHTML = geocode_fail_str;
			fieldsAnim(false,"art");
			fieldsAnim(false,"lage");
		} else {
			ajax.get('/get_objects.php?criteria='+searchCriteria+
				'&minLoc='+searchMinLoc.lat()+"x"+searchMinLoc.lng()+'&maxLoc='+searchMaxLoc.lat()+"x"+searchMaxLoc.lng()+
				'&art='+$('art').getValue()+'&erwerb='+$('erwerb').getValue()+'&loc='+escape(searchLocation)+'&zoom='+doObj.initZoomLevel
				,function(xml) {
				fieldsAnim(false,"");
				doObj.parseXML(xml,false);
			});
		}
		oldSearchCriteria = searchCriteria;
	}

	// Such-Informationen in Cookie Speichern:

	setCookie();
	return false; // für onSubmit
}

// Lädt Suchinformationen anhand Such-ID (S-id)

function loadSearch(id) {
	ajax.get('/load_search.php?id='+id,function(xml) {
		var result = xml.firstChild;
		setSelected($('erwerb'),result.getAttribute('purchase'));
		setSelected($('art'),result.getAttribute('type'));
		$('searchlocation').value = searchLocation = getTextNode(result.getElementsByTagName('location')[0]);
		$('searchcriteria').value = searchCriteria = getTextNode(result.getElementsByTagName('criteria')[0]);
		var minLocs = result.getAttribute('minLoc').split("x");
		var maxLocs = result.getAttribute('maxLoc').split("x");
		var minLoc = new GLatLng(parseFloat(minLocs[0]), parseFloat(minLocs[1]));
		var maxLoc = new GLatLng(parseFloat(maxLocs[0]), parseFloat(maxLocs[1]));
		doObj.initZoomLevel = parseInt(result.getAttribute('zoom'));
		var latMid = (minLoc.lat()+maxLoc.lat())/2;
		var lngMid = (minLoc.lng()+maxLoc.lng())/2;
		var centerLoc = new GLatLng(latMid, lngMid);
		startSearchCoordinates(centerLoc,false);
	});
}

// Startet Suche mit entspr. Geokoordinaten als Suchbasis für Objekte

function startSearchCoordinates(centerLoc,dontRelocate) {
	var searchCriteria = $('searchcriteria').value;
	var radius = 0.5; // genauere Berechnung sp�ter...
	searchMinLoc = new GLatLng(centerLoc.lat()-radius,centerLoc.lng()-radius);
	searchMaxLoc = new GLatLng(Number(centerLoc.lat())+Number(radius),Number(centerLoc.lng())+Number(radius));
	doObj.searchCenter = centerLoc;
	ajax.get('/get_objects.php?criteria='+searchCriteria+'&minLoc='+searchMinLoc.lat()+"x"+searchMinLoc.lng()+'&maxLoc='+searchMaxLoc.lat()+"x"+searchMaxLoc.lng()+
			'&art='+$('art').getValue()+'&erwerb='+$('erwerb').getValue()+'&loc='+escape(searchLocation)+'&zoom='+doObj.initZoomLevel,function(xml) {
		doObj.parseXML(xml,dontRelocate);
		fieldsAnim(false,"");
	});
}

// Initialisiert Suche, wird beim laden der Seite aufgerufen:

function startSearchEngine() {
	getCookie();
	ajax.useXML=true;
	doObj = new DisplayObjects('search', 'results', 'map');
	var hrefSplit = location.href.split(/Q\-/i);
	if (hrefSplit.length>1) {
		doObj.onlyOneExposee(hrefSplit[1]);
	} else {
		var hrefSplit = location.href.split(/\#S\-/i);
		if (hrefSplit.length>1) {
			loadSearch(QIDtoID(hrefSplit[1]));
		} else {
			startSearch();
		}
	}
}

addOnLoad(startSearchEngine);




