/**
 * jQuery GoogleMaps
 * Version 0.1 - 13/08/2009
 * @author Flavien Bucheton
 *
 * Permet de gérer les plans googlemaps
 *
 * http://studio.yzeo.fr/wiki/doku.php/dev/plan/accueil
 **/

(function($) {
	var verifSettings = function(settings){
		var textErr = "";
		var erreur = false;

		if(settings.zoom < 1 || settings.zoom > 17 || isNaN(parseInt(settings.zoom))){
			textErr += "\n - Le niveau zoom est invalide (doit être compris entre 1 et 17) !";
			erreur = true;
		}

		if(settings.mode!="G_NORMAL_MAP" && settings.mode!="G_SATELLITE_MAP" && settings.mode!="G_HYBRID_MAP"){
			textErr += "\n - Le mode d'affichage est invalide (valeurs possibles: G_NORMAL_MAP, G_SATELLITE_MAP, G_HYBRID_MAP) !";
			erreur = true;
		}

		$.each(settings.multi,function(i){
			if(this.zoom < 1 || this.zoom > 17 || isNaN(parseInt(this.zoom))){
				textErr += "\n - Le niveau zoom du point "+i+" est invalide (doit être compris entre 1 et 17) !";
				erreur = true;
			}

			if(this.mode!="G_NORMAL_MAP" && this.mode!="G_SATELLITE_MAP" &&  this.mode!="G_HYBRID_MAP"){
				textErr += "\n - Le mode d'affichage du point "+i+" est invalide (valeurs possibles: G_NORMAL_MAP, G_SATELLITE_MAP, G_HYBRID_MAP) !";
				erreur = true;
			}
		});

		if(erreur){
			alert("----- ERREUR DE CONFIGURATION -----\n"+textErr);
		}
		return erreur;
	}

	var loadControl = function(gmap, settings){
		if (settings.displayMapControl){
			switch(settings.sizeMapControl){
				case "small" : gmap.addControl(new GSmallMapControl()); break;
				case "zoom" : gmap.addControl(new GSmallZoomControl()); break;
				default: gmap.addControl(new GLargeMapControl());
			}
		}
		if (settings.displayMapType){
			gmap.addControl(new GMapTypeControl(), eval("gmap."+settings.mode));
		}

		if (settings.displayMapScale) {
			gmap.addControl(new GScaleControl());
		}
	}

	var search = function(maDiv, gmap, geocoder, settings, multi){
		if (geocoder) {
			geocoder.getLatLng(settings.search, function(point){
				if (!point) {
					alert("Adresse non trouvée !");
				}else{
					if (multi) {
						loadPointMulti(gmap, point, settings, maDiv.point_def, maDiv.settings);
					}
					else{
						displayMarker = true;
						if (settings.multi) {
							displayMarker = false;
							maDiv.point_def = point;
						}
						loadPoint(gmap, point, settings, displayMarker);
					}
				}
			});
		}
	}

	var loadPoint = function(gmap, point, settings, marker){
		gmap.setCenter(point, settings.zoom,eval(settings.mode));

		if(marker){
			var marker = new GMarker(point);
			gmap.addOverlay(marker);

			if(settings.infobulle.titre!="" || settings.infobulle.adresse!=""){
				var html = settings.htmlInfoBulle.replace("\$1", settings.infobulle.titre);
				html = html.replace("\$2", settings.infobulle.adresse);

				GEvent.addListener(marker, "click", function() {
					marker.openInfoWindowHtml(html);
				});
				marker.openInfoWindowHtml(html);
			}
		}
	}

	var loadPointMulti = function(gmap, point, settings, point_def, settings_def){
		var marker = new GMarker(point);
		gmap.addOverlay(marker);

		GEvent.addListener(marker,"click", function() {
			gmap.setCenter(point, settings.zoom, eval(settings.mode));
			if (settings.infobulle.titre != "" || settings.infobulle.adresse != "") {
				var html = settings_def.htmlInfoBulle.replace("\$1", settings.infobulle.titre);
				html = html.replace("\$2", settings.infobulle.adresse);
				marker.openInfoWindowHtml(html);
			}
		});
		GEvent.addListener(marker,"infowindowclose",function(){
			gmap.setCenter(point_def, settings_def.zoom, eval(settings_def.mode));
		});
	}


	$.fn.extend({
		loadMap: function(options) {
			//Chargement des paramètres
			this.settings = {
				htmlInfoBulle: '<div class="infosbulle"><span class="plan-titre">$1</span><br /><br /><span class="plan-adresse">$2</span><br /><span class="plan-printer"><a href="javascript:window.print();" title="Imprimer le plan"><img src="images/imprimante.jpg" alt="Imprimer le plan" /></a></span></div>',
				displayMapType: true,
				displayMapScale: true,
				displayMapControl: true,
				sizeMapControl: "large",

				search: "47.0102,2.3730",
				infobulle: {
					titre: "",
					adresse: ""
				},
				zoom: 14,
				mode: "G_NORMAL_MAP",
				multi: ""
			};
			$.extend(this.settings, options);
			$.each(this.settings.multi,function(i){
				if(!this.mode){
					this.mode = "G_NORMAL_MAP";
				}
				if(!this.zoom){
					this.zoom = 14;
				}
			});

			//Vérification de la configuration
			if(verifSettings(this.settings)){ return false;	}

			if (GBrowserIsCompatible()) {
				this.gmap = new GMap2(document.getElementById(this.attr("id")));
				this.geocoder = new GClientGeocoder();
				loadControl(this.gmap, this.settings);
				search(this, this.gmap,this.geocoder, this.settings, false);

				var maDiv = this;
				$.each(this.settings.multi,function(i){
					search(maDiv, maDiv.gmap, maDiv.geocoder, this, true);
				});
			}

			return false;
		}
	});

})(jQuery);
