/*	--------------------
	Affichage de la carte Google, des régions sous forme de polygones cliquables, et des autres entrées sous forme de libellés
	Le script utilise JQuery, il faut donc utiliser la librairie dans la page
	Comme il est impossible d'appeler en AJAX des données issues d'un autre domaine, il faut créer plusieurs fichiers qui récupèreront les informations demandées.
		filename_geo	Pour les coordonnées géographiques des zones à afficher
		filename_contenu	Pour les coordonnées géographiques des libellés à ajouter sur la carte
	2009-04-29,	Marc Brillault
	2009-06-23	Ajout des cartes sur les pages région et résultats de recherche (Marc Brillault)
	Merci à Mike Williams pour ses scripts (http://econym.org.uk/gmap/)
	--------------------	*/

var map = '';

//	Couleurs des régions, dans cet ordre : contour région, fond région, opacité région, contour région vide, fond région vide, opacité région vide, contour page région, intérieur page région, opacité page région
if(!couleurs_regions)
	var couleurs_regions = new Array('#FFFFFF', '#990000', 0.5, '#FFFFFF', '#B54E36', 0.5, '#FFFFFF', '#FFFFFF', 0);
if(typeof(window[racine]) == 'undefined')
	var racine = '';

var polys		=	new Array();
var noms		=	new Array();
var liens		=	new Array();
var contenus	=	new Array();
var nombres		=	new Array();
var mousepos	=	new Array(0, 0);
var count_label	=	0;

$(document).ready(function() {
	$().mousemove(function(e) {
		mousepos = Array(e.pageX, e.pageY);
	});
});
	
function google_maps(url, type) {
	if(!url)
		url = '';
	if(!type)
		type = 'index';
	file_geo = (!window.rep_templates) ? filename_geo : racine+rep_templates+'/lib/AJAX/geo.php5';
	
	//	On a besoin d'un div #map, dans lequel on affichera un titre et le div de la carte
	if((type == 'index' || type == 'type' || type == 'region' || type == 'departement' || type == 'ville') && GBrowserIsCompatible() && $('#map').length) {
		//	On ajuste sa hauteur au formulaire, s'il existe
		if($('#moteur-index').length && type == 'index') {
			hauteur_moteur = $('#moteur-index').height();
			$('#map').css('height', hauteur_moteur+'px');
		}
		$('#map').removeClass('nojs');
		$('#map').addClass('loading');
		
		//	Appel AJAX contenant les infos désirées
		$.get(
			file_geo,
			{
				url:	url
			},
			function(data) {
				if(data) {
					//	On isole chacun des composants
					geo = data.split('|');
					
					//	Ajout du titre et du div qui va contenir la carte
					$('#map').prepend('<h3>'+geo[0]+'</h3><div id="google_map"></div>');
					//	On dimensionne ce dernier div en fonction de celle du moteur, au besoin
					if($('#moteur-index').length && type == 'index') {
						hauteur_titre = $('#map h3').height()+10;	//	10 pour 4 de padding haut et bas, et 2 de marge haute
						$('#google_map').css('height', hauteur_moteur-hauteur_titre+'px');
					}

					//	Création de la carte
					map = new GMap2(document.getElementById("google_map"));
					map.setMapType(G_SATELLITE_MAP);
					
					//	Si on est sur la home, on désactive le dragging
					//	Sur les autres pages, on autorise le zoom à la souris, et on ajoute les contrôles de déplacement et de zoom
					if(type == 'index')
						map.disableDragging();
					
					
					//	On centre sur la vue adéquate
					var ll_point = new GLatLng(geo[1], geo[2]);
					var ll_bounds = new GLatLngBounds(
						new GLatLng(geo[3], geo[6]), 
						new GLatLng(geo[5], geo[4])
					);
					
					//	Si on n'a pas d'info de zoom, on centre autour de la région dont on a les coordonnées
					//	Si l'information de zoom est fournie, on zoome manuellement à cette valeur (Cas des régions mal localisées)
					if(geo[7] == 0)
						map.setCenter(ll_point, map.getBoundsZoomLevel(ll_bounds));
					else
						map.setCenter(ll_point, parseInt(geo[7]));
						
					//	Cas particulier de la sitemap : Google effectue un zoom trop large pour cadrer toute la France
					//	On zoome au niveau inférieur. et on déplace légèrement la carte. La Bretagne sera tronquée, mais ça n'empêche pas l'utilisation de la carte.
					if(map.getZoom() < 5) {
						map.setZoom(map.getZoom()+1);
						map.panBy(new GSize(-20, 10));
					}

					affiche_liens(url, type);
					
					if(type == 'index' || type == 'type') {
						GEvent.addListener(map, 'mousemove', function(point) {
							zone = false;
							for(var i = 0; i < polys.length; i++) {
								if (polys[i].Bound.contains(point)) {
									if(polys[i].Contains(point)) {
										zone = true;
										//	On supprime un éventuel div
										$('#gmap_layer').remove();
										//	On crée le div 
										$('body').append('<div id="gmap_layer"><h2>'+noms[i]+'</h2>'+contenus[i]+'</div>');
										$('#gmap_layer').css({
											left:	mousepos[0]+10,
											top:	mousepos[1]+10
										});
										cursor = (nombres[i] != 0) ? 'pointer' : 'auto';
										//	On change le curseur en pointeur si on a des offres sur la région en question
										$('#google_map').css('cursor', cursor);
									}
								}
							}
							if(!zone) {
								//	On remet le curseur par défaut
								$('#google_map').css('cursor', 'auto');
								$('#gmap_layer').remove();
							}
						});
						
						GEvent.addListener(map, 'click', function(overlay, point) {
							//	Gestion du clic
							if(!overlay) {
								for(var i = 0; i < polys.length; i++) {
									if(polys[i].Bound.contains(point)) {
										if(polys[i].Contains(point) && nombres[i] != 0) {
											//	On tracke le clic (Omniture)
											//s.tl(document.getElementById('map'), 'o', 'carte:'+liens[i]);
											omniture_track(document.getElementById('map'), 'o', 'Op:FR:France:carte:'+liens[i]);
											document.location.href = racine+liens[i]+'.html';
										}
									}
								}
							}
						});
						
						GEvent.addListener(map, 'mouseout', function(latlng) {
							//	Suppression du div si on sort de la carte par une région en bordure de carte
							$('#gmap_layer').remove();
						});
						
						$('#gmap_layer').hover(function() {
							//	Suppression du div si on passe dessus en hover (pour éviter de sortir de la carte via le div)
							$('#gmap_layer').remove();
						});
					}
				}
			}
		);
	}
}

function google_maps_region(url, type) {
	file_contenu = (window.filename_contenu) ? filename_contenu : rep_templates+'/lib/AJAX/liens.php5';
	if(type != 'region' && type != 'recherche')
		return false;
	//	Si on n'a pas de résultats, il est inutile de montrer une carte
	if(!$('#nb_results').length)
		return false;
	//	Si, dans le cas d'une recherche, c'est une ville qui est sélectionnée, on n'active pas la carte
	if(location.href.indexOf('f_ville') > 0)
		return false;
	
	//	On commence par créer le pod au-dessus du formulaire de gauche
	$('#colonne_gauche form').prepend('<div id="lien_carte"><h3>Carte</h3><p id="carte_clic"><b>Visualiser les villes disponibles</b> sur la carte</p><p class="submit"><span>Afficher</span></p></div>');
	$('#lien_carte p').click(function() {
		if($('#grande_google_map').length) {
			//	on modifie le texte du lien
			$('#lien_carte span').text('Afficher');
			//	Si la carte est déjà présente sur la page, on la supprime
			$('#grande_google_map').slideUp('normal', function() {$('#grande_google_map').remove(); $('#info_carte').remove();});
		}
		else {
			//	on modifie le texte du lien
			$('#lien_carte span').text('Masquer');
			//	On crée le div "Google maps" sur la page principale
			$('#nb_results').before('<p class="info" id="info_carte">Survolez les points sur la carte pour afficher le nom de la ville et les offres disponibles.</p>')
			$('#nb_results').before('<div id="grande_google_map" class="loading" style="display: none;"></div>');
			$('#grande_google_map').slideDown('normal', function() {
				//	On ajoute la carte Google
				url_page = window.location.href;

				parametres = (location.href.indexOf('?') > 0) ? location.href.substring(location.href.indexOf("?")+1, location.href.length) : '';
				$.get(
					file_geo,
					{
						url:	url,
						params:	parametres
					},
					function(data) {
						if(data) {
							//	On isole chacun des composants
							geo = data.split('|');
							
							map = new GMap2(document.getElementById("grande_google_map"));
							$('#grande_google_map').removeClass('loading');
							map.setMapType(G_SATELLITE_MAP);
							//map.enableScrollWheelZoom();
							map.addControl(new GLargeMapControl3D());
							map.addControl(new GMapTypeControl());
							//map.disableDragging();
							
							//	On centre sur la vue adéquate
							var ll_point = new GLatLng(geo[1], geo[2]);
							var ll_bounds = new GLatLngBounds(
								new GLatLng(geo[3], geo[6]), 
								new GLatLng(geo[5], geo[4])
							);
							
							//	Si on n'a pas d'info de zoom, on centre autour de la région dont on a les coordonnées
							//	Si l'information de zoom est fournie, on zoome manuellement à cette valeur (Cas des régions mal localisées)
							if(geo[7] == 0)
								map.setCenter(ll_point, map.getBoundsZoomLevel(ll_bounds));
							else
								map.setCenter(ll_point, parseInt(geo[7]));
								
							//	Si on est sur une page région, on ajoute le contour de la région
							if(type == 'region' || type == 'recherche') {
								parametres = (location.href.indexOf('?') > 0) ? location.href.substring(location.href.indexOf("?")+1, location.href.length) : '';
								$.get(
									file_contenu,
									{
										url:	url,
										params:	parametres
									},
									function(data) {
										affiche_region(data, true);
										affiche_villes(url);
									}
								);
							}
						}
					}
				);			
			});
		}
	});
}

function affiche_villes(url_region) {
	var icon_ville			=	new GIcon(G_DEFAULT_ICON);
	icon_ville.image		=	rep_templates+'/img/point_ville.png';
	icon_ville.iconSize		=	new GSize(9, 9);
	icon_ville.iconAnchor	=	new GPoint(5, 9);
	icon_ville.shadowSize	=	new GSize(0, 0);
	markerOptions			=	{ icon:icon_ville };
	parametres = (location.href.indexOf('?') > 0) ? location.href.substring(location.href.indexOf("?")+1, location.href.length) : '';

	$.get(
		rep_templates+'/lib/AJAX/villes.php5',
		{
			url: url_region,
			params:	parametres
		},
		function(data) {
			//	On récupère d'abord chacune des lignes retournées
			tab_retour = data.split('#');
			num = 0;
			tab_villes = new Array;
			for(num_ligne in tab_retour) {
				ligne = tab_retour[num_ligne];
				tab_ligne = ligne.split('|');
				//	Si on a des coordonnées pour ce point, on l'affiche
				if(tab_ligne[2] != 0) {
					num++;
					latlng = new GLatLng(tab_ligne[2], tab_ligne[3]);
					tab_villes[latlng] = tab_ligne;
					point_ville = new GMarker(latlng, markerOptions);
					map.addOverlay(point_ville);
					
					GEvent.addListener(point_ville, 'mouseover', function(coords) {
						//	On supprime un éventuel autre div qui serait resté
						$('#gmap_layer').remove();
						//	On ajoute le div à l'endroit où se trouve la souris
						var offre = (tab_villes[coords][4] > 1) ? 'offres' : 'offre';
						$('body').append('<div id="gmap_layer"><h2>'+tab_villes[coords][0]+'</h2>'+tab_villes[coords][4]+' '+offre+' à partir de '+tab_villes[coords][5]+'€</div>');
						$('#gmap_layer').css({
							left:	mousepos[0]+10,
							top:	mousepos[1]+10
						});
					});
					
					GEvent.addListener(point_ville, 'mouseout', function() {
						$('#gmap_layer').remove();					
					});
					
					GEvent.addListener(point_ville, 'click', function(coords) {
						//	On envoie sur la page de destination
						document.location.href = tab_villes[coords][1];
					});
				}
			}
		}
	);
}

function affiche_point(url_ville, num, tab_data) {
	//	Affiche un point sur lequel on peut passer la souris pour avoir plus d'infos
	file_contenu = (window.filename_contenu) ? filename_contenu : rep_templates+'/lib/AJAX/liens.php5';

	$.get(
		file_contenu,
		{
			url: url_ville
		},
		function(data) {
			tab_data[num] = data.split('|');
			if(tab_data[num][2] != 0) {
				var icon_ville= new GIcon(G_DEFAULT_ICON);
				icon_ville.image = rep_templates+'/img/point_ville.png';
				icon_ville.iconSize = new GSize(9, 9);
				icon_ville.iconAnchor = new GPoint(5, 9);
				icon_ville.shadowSize = new GSize(0, 0);
				
				markerOptions = { icon:icon_ville };
				
				latlng = new GLatLng(tab_data[num][2], tab_data[num][3]);
				
				eval("point_ville"+num+" = new GMarker(latlng, markerOptions)");
				map.addOverlay(eval("point_ville"+num));
				
				GEvent.addListener(eval("point_ville"+num), 'mouseover', function() {
					//alert(data);
					//	On supprime un éventuel autre layer
					$('#gmap_layer').remove();
					
					$('body').append('<div id="gmap_layer"><h2>'+tab_data[num][0]+'</h2>'+'</div>');
					$('#gmap_layer').css({
						left:	mousepos[0]+10,
						top:	mousepos[1]+10
					});
				});
			}
		}
	);
}

function affiche_liens(url, type) {
	file_contenu = (window.filename_contenu) ? filename_contenu : rep_templates+'/lib/AJAX/liens.php5';

	//	On affiche la liste des liens sur la carte (régions si on est sur l'index, villes sur la page région, etc)
	$.get(
		file_contenu,
		{
			url:	url
		},
		function(data) {
			if(data) {
				tab = data.split('#');
				for(var i = 0; i < tab.length; i++) {
					//	Si on est sur la page d'accueil, ou sur une des pages mer, campagne ou montagne, on affiche les régions
					//	Sinon, on affiche le contenu sous forme de vignettes
					if(type != 'index' && type != 'type')
						affiche_lien(tab[i]);
					else
						affiche_region(tab[i], false);
				}
			}
		}
	);
}

function affiche_lien(tab) {
	//	utilise les fonctions elabel pour afficher chacun des liens sur la carte
	if(tab) {
		var tab_geo = tab.split('|');
		var label = new ELabel(new GLatLng(tab_geo[2], tab_geo[3]), '<a href="'+tab_geo[1]+'.html">'+tab_geo[0]+'</a>', 'g_label label_'+count_label);
		map.addOverlay(label);
		$('.label_'+count_label).each(function() {
			var width = $(this).width();
			var height = $(this).height();
			var dec_w = Math.round(width/2);
			var dec_h = Math.round(height/2);
			$(this).css({
				'position': 'relative',
				'left':		'-'+dec_w+'px',
				'top':		dec_h+'px'
			});
		});
		count_label++;
	}
}

function affiche_region(tab, is_region) {
	if(tab == '')
		return;
	//	On crée un polygone avec les infos fournies
	var bound = new GLatLngBounds();
	tab = tab.split('|');
	coordinates = tab[10];
	//if(tab[9] == 0)
		//return;
	tab_coord = coordinates.split('*');
	var points = new Array();
	for(i = 0; i < tab_coord.length; i++) {
		tmp = tab_coord[i].split(';');
		if(typeof(tmp[0]) != 'undefined' && typeof(tmp[1]) != 'undefined') {
			points[i] = new GLatLng(parseFloat(tmp[1]), parseFloat(tmp[0]));
			bound.extend(points[i]);
		}
	}
	if(is_region) {
		contour	=	couleurs_regions[6];
		couleur	=	couleurs_regions[7];
		transp	=	couleurs_regions[8];
	}
	else if(tab[8] != 0) {	
		contour	=	couleurs_regions[0];
		couleur	=	couleurs_regions[1];
		transp	=	couleurs_regions[2];
		contenus.push(tab[8]+' offres à partir de '+tab[9]+' &euro;');
	}
	else {
		contour	=	couleurs_regions[3];
		couleur	=	couleurs_regions[4];
		transp	=	couleurs_regions[5];
		if(type == 'type')
			contenus.push('Aucune location '+url+' disponible');
		else
			contenus.push('Aucune location disponible');
	}
	var poly = new GPolygon(points, contour, 1, 1, couleur, transp, {clickable:false});
	poly.Bound = bound;
	polys.push(poly);
	noms.push(tab[0]);
	liens.push(tab[1]);
	nombres.push(tab[8]);
	map.addOverlay(poly);
}