var gmaploaded = false;
var liste_suggestions = null;

$(document).ready( function() {
	liste_suggestions = $('#txt').Suggest( {
		list: $("#list-suggestions"),
		onchoose: function(o) {
			$("#txt").val($(this).text());
		},
		onselect: function(o) {
			$("#txt").val($(this).text());
		}
	} );
	$("#txt").bind('click', function() {
		liste_suggestions.close();
	} );
	
	;//Récupérer les coordonnées de l'adresse avant de soumettre la requête */
	$('#trouver').bind('submit', function() {
		resetAdresse();
		if( gmaploaded == true ) {
			localiser();
		} else {
			loadMaps(localiser);
		}
		gmaploaded = true;
		return false;
	} );
	
	$('#txt').one('focus', treatFocusInputAdresse);
} );

function resetAdresse() {
	if( $('#txt').val() == 'près de: ville ou adresse' ) {
		$('#txt').val("");
	}
}

function localiser() {
	var adresse = getAdresse( {id: 'txt'} );
	if( adresse !== null ) {
		geocoder = new GClientGeocoder();
		/* Récupérer les infos relatives à l'adresse spécifiée */
		geocoder.getLocations( adresse, treatGeocoderResponse );
	}
	;//On retourne false pour éviter que le formulaire soit soumis
	return false;
};


/**
 * Fonction callback de geocoder.getLocations()
 * Traite la réponse du geocoder
 * 
 * @param _googleResponse Reponse de Google au format JSON. Voir détails sur la doc
 * @return void
 */
function treatGeocoderResponse( _goocoderResponse )
{
	var nbPlacemark = 0;
	nbPlacemark = _goocoderResponse.Placemark.length;
	/* Message d'erreur avec pas de point trouvée */
	if( nbPlacemark < 1 ) { /* @todo */ return; }
	
	;/* submit avec coodonnees et adresse */
	if( nbPlacemark == 1 ) { 
		submit_query( {
			'g_adresse': _goocoderResponse.Placemark[0].address,
			'g_latitude': _goocoderResponse.Placemark[0].Point.coordinates[1],
			'g_longitude': _goocoderResponse.Placemark[0].Point.coordinates[0]
		} );
		return;
	}
	
	
	;// Enregistrement des informations concernant les lieux trouvés par Google
	;// puis, appel à une fonction pour traiter ces infos, typiquement: une fonction
	;// d'affichage
	var t_suggestions = new Array();
	for( var i=0; i<nbPlacemark; i++ ) {
		t_suggestions[i] = new Array();
		t_suggestions[i]['name'] = _goocoderResponse.name;
		t_suggestions[i]['adresse'] = _goocoderResponse.Placemark[i].address;
		t_suggestions[i]['latitude'] = _goocoderResponse.Placemark[i].Point.coordinates[1];
		t_suggestions[i]['longitude'] = _goocoderResponse.Placemark[i].Point.coordinates[0];
	}
	
	treatSuugestionsAdresses( t_suggestions );
};


/**
 * Met en valeur (gras <strong> par défaut) les correspondances de l'adresse rentrée avec les suggestions de google.
 * et appelle une fonction d'affichage.
 * 
 * @param array t_sugg
 * @param Object opts
 * @return
 */
function treatSuugestionsAdresses( t_sugg, opts )
{
	var _opts = opts || {};
	var tag1 = _opts.tag1 || "<strong>";
	var tag2 = _opts.tag2 || "</strong>";
	
	for( var i=0; i<t_sugg.length; i++ ) {
		var add_ = no_accent( getAdresse( {id: 'txt'} ).toLowerCase() );
		var add = add_.split(' ');
		var sugg = t_sugg[i]['adresse'];
		sugg = no_accent( sugg.toLowerCase() );
		var pos=-1;
		for( var j=0; j<add.length; j++ ) {
			pos = sugg.indexOf(add[j]);
			if( pos > -1 ) {
				var debut = t_sugg[i]['adresse'].substr(0, pos);
				var ins = tag1+t_sugg[i]['adresse'].substr(pos, add[j].length)+tag2;
				var fin = t_sugg[i]['adresse'].substr( pos+add[j].length);
				t_sugg[i]['adresse'] = debut+ins+fin;
				sugg = t_sugg[i]['adresse'];
				sugg = no_accent( sugg.toLowerCase() );
			}
		}
	}
	
	affiche_suggestions(t_sugg);
};

/**
 * Affiche les suggestions
 * 
 * @param t_suggestions
 * @return
 */
function affiche_suggestions(t_suggestions) {
	$("#list-suggestions").empty();
	for( var i=0; i<t_suggestions.length; i++ ) {
		$("#list-suggestions").append("<li class='li-suggestion'>"+t_suggestions[i]['adresse']+"</li>");
	}
	showSuggestions();
};

function showSuggestions() {
	liste_suggestions.update();
};

/**
 * remplit les champs value des balises dont l'attribut name est équivalent aux attributs
 * de l'objet options avec la valeur de ces derniers, et soumet le premier formulaire.
 * 
 * @param object options
 * @return void
 */
function submit_query( options )
{
	var opts = options || {};
	for( var k in opts ) {
		$("input[name='"+k+"']").attr('value', opts[k]);
	}
	
	document.getElementsByTagName('form')[0].submit();
	;//$("#trouver").submit();
	return false;
};

/**
 * Traite l'événement la zone de recherche par adresse a le focus en supprimant le texte par défaut
 * et en enlevant la classe css de base
 */
function treatFocusInputAdresse() {
	resetAdresse();
}













