google.load("maps", "2.x");

var map;	// Carte
var markers = "";	// Marqueurs d'adresses
var action = "default";	// Action declenchee par l'utilisateur

function resizeMap(mapWidth, mapHeight) {
	document.getElementById('countryMap').style.width = mapWidth + 'px';
	document.getElementById('countryMap').style.margin = '10px auto 0px auto';
}


function setSizeMap() {
	var mapSize = map.getSize();
	var mapWidth = mapSize.width;
	var mapHeight = mapSize.height;

	// Redimensionne la carte avec une largeur maximum de 600 px
	if (mapWidth > 600) {
		mapWidth = 600;
		resizeMap(mapWidth, mapHeight);
		map.checkResize();
	}
}


function initializePoint(pointData) {
	var text = google.maps.Xml.value(pointData.getElementsByTagName("text")[0]);
	var pointLatitude = google.maps.Xml.value(pointData.getElementsByTagName("latitude")[0]);
	var pointLongitude = google.maps.Xml.value(pointData.getElementsByTagName("longitude")[0]);
	var point = new google.maps.LatLng(pointLatitude, pointLongitude);
	var marker = new google.maps.Marker(point);

	google.maps.Event.addListener(marker, "mouseover", function() {
		marker.openInfoWindowHtml(text);
	});
	
	google.maps.Event.addListener(marker, "infowindowopen", function() {
		google.maps.Event.clearListeners(map, "dragend");
		google.maps.Event.clearListeners(map, "moveend");
	});
	
	google.maps.Event.addListener(marker, "infowindowclose", function() {
		google.maps.Event.addListener(map, "dragend", onZoomDragMove);
		google.maps.Event.addListener(map, "moveend", onZoomDragMove);
	});

	map.addOverlay(marker);
}

function onZoomDragMove() {
	action = "dblclick";

	// Supprimme les marqueurs precedents
	map.clearOverlays();

	// Affiche les marqueurs
	if (map.getZoom() > 8) {
		setMarkers();
	}
}

function dblclickOnMap(overlay, dblclickPoint) {
	// Supprimme les marqueurs precedents
	map.clearOverlays();

	// Remet les listes a zero
	document.getElementById("tx_axdir_pi1[region]").value = 0;
	document.getElementById("tx_axdir_pi1[department]").value = 0;

	// Regle le zoom a 9 minimum
	if (map.getZoom() < 9) {
		map.setZoom(9);
	}

	if (action = "default") {
		map.addControl(overviewMapCtrl);
	}
	
	action = "dblclick";

	// Affiche les marqueurs
	setMarkers();
}

function initDblClickMap() {
	// Parse les marqueurs d'adresses
	var xmlDoc = google.maps.Xml.parse(markers);
	var numIndex = xmlDoc.documentElement.getElementsByTagName("numIndex");
	// Ajoute les marqueurs d'adresses
	for (var i = 0; i < numIndex.length; i++) {
		initializePoint(numIndex[i]);
	}
}

function initSelectMap() {
	// Instance de la carte
	map = new google.maps.Map2(document.getElementById("countryMap"));

	// Dimensionne la carte
	setSizeMap();
	
	// Parse les marqueurs d'adresses
	var xmlDoc = google.maps.Xml.parse(markers);
	var numIndex = xmlDoc.documentElement.getElementsByTagName("numIndex");
	if (numIndex.length > 0) {
		// Calcule les coordonnees maximales des marqueurs d'adresses
		var maxLat = -90;
		var maxLng = -180;
		var minLat = 90;
		var minLng = 180;

		for (var i = 0; i < numIndex.length; i++) {
			var iLat = Number(google.maps.Xml.value(numIndex[i].getElementsByTagName("latitude")[0]));
			maxLat = (iLat > maxLat) ? iLat : maxLat;
			minLat = (iLat < minLat) ? iLat : minLat;

			var iLng = Number(google.maps.Xml.value(numIndex[i].getElementsByTagName("longitude")[0]));
			maxLng = (iLng > maxLng) ? iLng : maxLng;
			minLng = (iLng < minLng) ? iLng : minLng;
		}

		var initSW = new google.maps.LatLng(minLat, minLng);
		var initNE = new google.maps.LatLng(maxLat, maxLng);
		var initRect = new google.maps.LatLngBounds(initSW, initNE);

		// Calcule de centre de la carte
		var centerLat = minLat+((maxLat-minLat)/2);
		var centerLng = minLng+((maxLng-minLng)/2);
		
		// Zoom optimal
		var startZoom = map.getBoundsZoomLevel(initRect);
		
		// Zoom maximum = 11
		startZoom = startZoom > 10 ? 11 : startZoom;

		// Repositionne la carte
		map.setCenter(new google.maps.LatLng(centerLat, centerLng), startZoom);

		// Ajoute les marqueurs d'adresses
		for (var i = 0; i < numIndex.length; i++) {
			initializePoint(numIndex[i]);
		}

		// Controles de la carte
		smallMapCtrl = new google.maps.SmallMapControl();
		//largeMapCtrl = new google.maps.LargeMapControl();
		scaleCtrl = new google.maps.ScaleControl();
		mapTypeCtrl = new google.maps.MapTypeControl();
		overviewMapCtrl = new google.maps.OverviewMapControl();

		// Ajoute les controles sur la carte
		map.addControl(smallMapCtrl);
		//map.addControl(largeMapCtrl);
		map.addControl(scaleCtrl);
		map.addControl(mapTypeCtrl);
		map.addControl(overviewMapCtrl);

		// Detecte les evenements
		google.maps.Event.addListener(map, "dblclick", dblclickOnMap);
		google.maps.Event.addListener(map, "dragend", onZoomDragMove);
		google.maps.Event.addListener(map, "zoomend", onZoomDragMove);
		google.maps.Event.addListener(map, "moveend", onZoomDragMove);

	}
	else {
		alert("Aucun résultat correspond aux critéres de recherche.");
		initDefaultMap();
	}
}

function initDefaultMap() {
	// Instance de la carte
	map = new google.maps.Map2(document.getElementById("countryMap"));

	// Dimensionne la carte
	setSizeMap();

	// Coordonnees par defaut de la carte de France
	var centerLat = 46.860191;
	var centerLng = 1.735839;
	var initSW = new google.maps.LatLng(42.147114, -4.877929);
	var initNE = new google.maps.LatLng(51.193115, 8.349609);
	var initRect = new google.maps.LatLngBounds(initSW, initNE);

	// Zoom optimal
	var startZoom = map.getBoundsZoomLevel(initRect);

	// Initialise la carte
	map.setCenter(new google.maps.LatLng(centerLat, centerLng), startZoom);

	// Controles de la carte
	smallMapCtrl = new google.maps.SmallMapControl();
	//largeMapCtrl = new google.maps.LargeMapControl();
	scaleCtrl = new google.maps.ScaleControl();
	mapTypeCtrl = new google.maps.MapTypeControl();
	overviewMapCtrl = new google.maps.OverviewMapControl();
	
	// Ajoute les controles sur la carte
	map.addControl(smallMapCtrl);
	//map.removeControl(largeMapCtrl);
	map.addControl(scaleCtrl);
	map.addControl(mapTypeCtrl);
	// Suprimme les controles non souhaites sur la carte par defaut
	map.removeControl(overviewMapCtrl);

	// Detecte les evenements
	google.maps.Event.addListener(map, "dblclick", dblclickOnMap);
	google.maps.Event.addListener(map, "dragend", onZoomDragMove);
	google.maps.Event.addListener(map, "zoomend", onZoomDragMove);
	google.maps.Event.addListener(map, "moveend", onZoomDragMove);
	
}

function setAlertText(str) {
	document.getElementById('alert').innerHTML = '<p>' + str + '</p>';
}

function setMap() {
	switch(action) {
		// Selection d'une carte
		case "select":
			initSelectMap();
		break;
		// Double clic sur la carte
		case "dblclick":
			initDblClickMap();
		break;
		// Affichage par defaut de la carte de France
		case "default":
			initDefaultMap();
		break;
	}
}

function setMarkers() {
	switch(action) {
	
		// Selection d'une carte
		case "select":
			xmlhttp = google.maps.XmlHttp.create();
			xmlhttp.open('GET', 'index.php?tx_axdir_pi1[region]='+document.getElementById("tx_axdir_pi1[region]").value+'&tx_axdir_pi1[department]='+document.getElementById("tx_axdir_pi1[department]").value+'&tx_axdir_pi1[mapPageId]='+document.getElementById("tx_axdir_pi1[mapPageId]").value+'&tx_axdir_pi1[group]='+document.getElementById("tx_axdir_pi1[group]").value+'&eID=tx_axdir_pi1_mapdata', true);
			xmlhttp.onreadystatechange = function() {
				if (xmlhttp.readyState == 4) {
					if (xmlhttp.status != 200)
						setAlertText("Impossible d'acc&eacute;der aux donn&eacute;es cartographiques.");
					else {
						markers = xmlhttp.responseText;
						if (!markers) {
							setAlertText('Donn&eacute;es cartographiques erron&eacute;es');
						}
						else {
							setMap();
							document.getElementById("alert").style.display = "none";
						}
					}
				}
			};
			xmlhttp.send(null);
		break;
		
		// Double clic sur la carte
		case "dblclick":
			var currentZoom = map.getZoom();
			if (currentZoom > 8) {
			 	var mapBounds = map.getBounds();
				var currentSW = mapBounds.getSouthWest();
				var currentNE = mapBounds.getNorthEast();
				var currentMinLat = currentSW.lat();
				var currentMinLng = currentSW.lng();
				var currentMaxLat = currentNE.lat();
				var currentMaxLng = currentNE.lng();
				var currentCenter = map.getCenter();

				xmlhttp = google.maps.XmlHttp.create();
				xmlhttp.open('GET', 'index.php?tx_axdir_pi1[rect][minLat]='+currentMinLat+'&tx_axdir_pi1[rect][minLng]='+currentMinLng+'&tx_axdir_pi1[rect][maxLat]='+currentMaxLat+'&tx_axdir_pi1[rect][maxLng]='+currentMaxLng+'&tx_axdir_pi1[mapPageId]='+document.getElementById("tx_axdir_pi1[mapPageId]").value+'&tx_axdir_pi1[group]='+document.getElementById("tx_axdir_pi1[group]").value+'&eID=tx_axdir_pi1_mapdata', true);
				xmlhttp.onreadystatechange = function() {
					if (xmlhttp.readyState == 4) {
						if (xmlhttp.status != 200)
							setAlertText("Impossible d'acc&eacute;der aux donn&eacute;es cartographiques.");
						else {
							markers = xmlhttp.responseText;
							if (!markers) {
								setAlertText('Donn&eacute;es cartographiques erron&eacute;es');
							}
							else {
								setMap();
								document.getElementById("alert").style.display = "none";
							}
						}
					}
				};
				xmlhttp.send(null);
			}
	break;

	// Affichage de la carte de France par defaut
	case "default":
		setMap();
		document.getElementById("alert").style.display = "none";
	break;
	}
}

function setAction() {
	if (document.getElementById("tx_axdir_pi1[region]").value != 0 || document.getElementById("tx_axdir_pi1[department]").value != 0) {
		action = "select";
	}
}

function init() {
	if (google.maps.BrowserIsCompatible()) {
		setAction();
		setMarkers();
	}
	else {
		alert("Désolé, mais votre navigateur n'est pas compatible avec Google Maps");
	}
}

function makeMarkerList(latitude, longitude, group, pid) {
	xmlhttp = google.maps.XmlHttp.create();
	xmlhttp.open('GET', 'index.php?tx_axdir_pi1[marker][lat]='+latitude+'&tx_axdir_pi1[marker][lng]='+longitude+'&tx_axdir_pi1[group]='+group+'&tx_axdir_pi1[mapPageId]='+pid+'&eID=tx_axdir_pi1_markerlist', true);
	xmlhttp.onreadystatechange = function() {
		if (xmlhttp.readyState == 4) {
			if (xmlhttp.status != 200)
				setAlertText("Impossible d'ex&eacute;cuter le fichier PHP.");
			else {
				var out = xmlhttp.responseText;
				if (!out) {
					setAlertText('Aucune r&eacute;ponse.');
				}
				else {
					document.getElementById("markerlist").innerHTML = out;
					window.scrollBy(0, 600);
				}
			}
		}
	};
	xmlhttp.send(null);
}

// Affichage du plan d'acces
function displayMap(lat, lng, zoom, txt) {
	if (google.maps.BrowserIsCompatible()) {
		var point = new google.maps.LatLng(lat, lng);
		map.setCenter(point, zoom);
		map.addControl(scaleCtrl);
		if (txt) {
			map.openInfoWindowHtml(point, txt);
		}
	}
	else {
		alert("Désolé, mais votre navigateur n'est pas compatible avec Google Maps");
	}
	window.location.href = String(window.location).replace(/\#.*$/, "") + "#aMap";
}

