/**
 * geocoder
 */
var geocoder = new google.maps.Geocoder();
geocoder.firstItem = {};
var department_codes = ['18','28','36','37','41','45'];
var regions_bounds = new google.maps.LatLngBounds(
	new google.maps.LatLng(46.3,0),
	new google.maps.LatLng(49,3.2)
);

function geocode() {
	var query = document.getElementById(document.getElementById("search").value).value;
	if (query && query.trim)
		query = query.trim(); // trim space if browser supports
	if (query != geocoder.resultAddress && query.length > 1) {
		clearTimeout(geocoder.waitingDelay);
		geocoder.waitingDelay = setTimeout(function() {
			geocoder.geocode({
				address : query + ', France'
			}, geocodeResult);
		}, 300);
	} else {
		document.getElementById(document.getElementById("list_name").value).innerHTML = "";
		geocoder.resultAddress = "";
		geocoder.resultBounds = null;
	}
	// callback function
	function geocodeResult(response, status) {
		if (status == google.maps.GeocoderStatus.OK && response[0]) {
			geocoder.firstItem = response[0];
			clearListItems();
			var len = response.length;
			for ( var i = 0; i < len; i++) {
				if ( inRegion(response[i]) ) {
					addListItem(response[i]);
				}
			}
		} else if (status == google.maps.GeocoderStatus.ZERO_RESULTS) {
			document.getElementById(document.getElementById("list_name").value).innerHTML = "?";
			geocoder.resultAddress = "";
			geocoder.resultBounds = null;
		} else {
			document.getElementById(document.getElementById("list_name").value).innerHTML = status;
			geocoder.resultAddress = "";
			geocoder.resultBounds = null;
		}
	}
	
	function inRegion(response_item) {
		var location = response_item.geometry.location;
		if ( ! regions_bounds.contains(location) ) {
			return false;
		}
		for ( var j = 0; j < response_item.address_components.length ; j++ ) {
			var a = response_item.address_components[j];
			if ( ( jQuery.inArray('administrative_area_level_2',a.types) > -1 ) && ( jQuery.inArray(a.short_name,department_codes) > -1 ) ) {
				return true;
			}
		}
		return false;
	}
}
// by click on list
// function executed twice to override mapFirst()
function updateMap(respons) {
	function doIt(respons) {
		var responseFormat = respons.formatted_address;
		document.getElementById(document.getElementById("search").value).value = responseFormat.replace(', France', '');
		clearListItems();
	}
	doIt(respons);
	setTimeout(function() {
		doIt(respons)
	}, 500);
}
// by onchange
function mapFirst() {
	setTimeout(function() {
		clearListItems()
	}, 1000);
}

/**
 * Selectable dropdown list
 */

function addListItem(resp) {
	var listContainer = document.getElementById(document.getElementById("list_name").value);
	listContainer.style.display = 'block';
	var loc = resp || {};
	var row = document.createElement("li");
	var responseFormat = loc.formatted_address;
	row.innerHTML = responseFormat.replace(', France', '');
	row.className = "list_item";
	row.onclick = function() {
		updateMap(loc);
		jQuery('form[name=form-city]').submit();
	}
	listContainer.appendChild(row);
}
// clear list
function clearListItems() {
	var listContainer = document.getElementById(document.getElementById("list_name").value);
	listContainer.style.display = 'none';
	while (listContainer.firstChild) {
		listContainer.removeChild(listContainer.firstChild);
	}
}
