/*----------------------------------------------------------------------------------+
| Script / classes: search.js                                                       |
| ---------------------------                                                       |
| Provide the AJAX / Google / Autocomplete code for the search form                 |
| Dependencies: moodle_core                                                         |
+----------------------------------------------------------------------------------*/

AutoComplete = function(field_prefix) {

	var f_lookup = $(field_prefix + '_lookup');
	var f_geocode = $(field_prefix + '_geocode');
	var f_geotext = $(field_prefix + '_geotext');
	var f_criteria = $(field_prefix + '_criteria_fields');
	
	// Add suggestion div ...
	var f_suggest = document.createElement('div');
	f_suggest.setAttribute('id', field_prefix + '_suggest');
	f_lookup.parentNode.appendChild(f_suggest);
	f_suggest = $(field_prefix + '_suggest');

	var fn_call;
	var timer;
	
	updateView(false);
	var geo = new GClientGeocoder();
	geo.setBaseCountryCode('FR');

	f_lookup.addEvent('keyup', function(event) {
		if(event.code == 13) {
			// nothing on enter for now
		} else if(event.code == 27) { // escape
			updateView(false);
		} else {
			if(timer) clearTimeout(timer);
			timer = setTimeout(reload, 400);
		}
	});
	
	function reload() {
		if(f_lookup.value.length >= 2) {
			geo.getLocations(f_lookup.value, function(places) {
				f_suggest.innerHTML = "";
				if(places.Status.code == 200) {
					$each(places.Placemark, function(item, index, object) {
						if(item.AddressDetails.Country.CountryNameCode != "") {
							addPlaceToList( makeAddress(item), function(){
								setPlace(item); callBack(item); return false;
							} );
						}
					});
				}
				updateView(true);
			});
		} else {
			f_suggest.innerHTML = "";
			updateView(true);
		}
	}

	function updateView(active) {
		if(active) { // search going on
			f_lookup.style.display = "inline";
			f_suggest.style.display = f_suggest.innerHTML == "" ? "none" : "block";
		} else if(f_geotext.value == "") { // no search, no existing address
			f_lookup.style.display  = "inline";
			f_suggest.style.display = "none";
		} else { // no search, but existing address
			f_lookup.style.display  = "none";
			f_suggest.innerHTML = "";
			f_criteria.style.display = "block";
			addPlaceToList(f_geotext.value, function(){
				f_suggest.innerHTML = "";
				updateView(true);
				reload();
				return false;
			});
			f_suggest.style.display = "block";
		}
	}
	
	function addPlaceToList(innerHTML, onclick) {
		var el = document.createElement("a");
		el.setAttribute("href", "#");
		el.innerHTML = innerHTML;
		el.onclick = onclick;
		f_suggest.appendChild(el);
	}

	this.setCallBack = function(fn) { fn_call = fn; }

	function callBack(Placemark) {
		if($type(fn_call) == 'function') fn_call(Placemark);
	}

	function setPlace(Placemark, fn_call) {
		f_geocode.value = Placemark.Point.coordinates.join(",");
		f_geotext.value = makeAddress(Placemark);
		updateView(false);
	}
   
	function makeAddress(Placemark) {
		with(Placemark.AddressDetails) {
			if(Accuracy <= 4) {
				try {
					with(Country.AdministrativeArea.SubAdministrativeArea) {
						return Locality.LocalityName + ", " + SubAdministrativeAreaName + ", " + Country.CountryName;
					}
				} catch(e) { }
			}
			return Placemark.address;
		}
	}
	
}

RentalSearch = function(el_form, inst_auto) {
	var form = $(el_form);
	with(form) {
		for(var i=0; i<form.elements.length; i++) {
			if(elements[i].type.match(/^select/)) {
				elements[i].onchange = function() {
					form.send();
				}
			}
		}
	}
	form.set( 'send', {
		url: form.action + "?ajax=1&t=" + Math.random(), method: 'get',
		onSuccess: function(txt,xml){
			try
			{
				var res = JSON.decode(txt);
			}
			catch(e)
			{
				alert("Error in data format:\n" + txt);
			}
			with(form.elements['within_km']) {
				var last_val = options[selectedIndex].value;
				options.length = 0;
				for(var i=0; i<res.zone_stats.length; i++)
				{
					var opt = new Option(res.zone_stats[i][1], res.zone_stats[i][0], res.zone_stats[i][0] == last_val);
					form.elements['within_km'].options[i] = opt;
				}
			}
			$('geo_result_size').innerHTML = res.result_size;
		},
		onFailure: function(instance) {
			alert("Error fetching data. Status: " + instance.status);
		}
	});
	inst_auto.setCallBack(function() {
		form.send();
	});
}
