//Définition des variables globales 
var map;
var bulle;
var point0 = [];
var pointEnd0 = [];
var waypoints0 = [];
var markersArray = [];
//tout les points
var titrePointInfo = []; 
var sTitrePointInfo = [];
//start
var titreStartPointInfo = []; 
var sTitreStartPointInfo = [];
//end
var titreEndPointInfo = []; 
var sTitreEndPointInfo = [];
//waypoints
var titrewaypointInfo = [];
var sTitrewaypointInfo = [];
//Visible ou invisible ?
var tabVisible = [];

window.onload = function(){
	if (navigator.geolocation) {
	  navigator.geolocation.getCurrentPosition(success);
	} else {
	  error('Geo Location is not supported');
	}

	function success(position){
		var coords = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
		
		var options = {
			center: coords,
			zoom: 15,
			mapTypeId: google.maps.MapTypeId.HYBRID,
			styles:[{"featureType":"poi","elementType":"labels","stylers":[{"visibility":"off"}]},{"featureType":"poi","elementType":"labels.text.stroke","stylers":[{"visibility":"off"}]}]
		};

		// Instanciation de la carte google
		map = new google.maps.Map(document.getElementById("mapSection"), options);

		// Options d'affichage de la carte
		var GeoMarker = new GeolocationMarker(map);
		GeoMarker.setCircleOptions({fillColor: '#808080'});
		google.maps.event.addListenerOnce(GeoMarker, 'position_changed', function() {
			map.setCenter(this.getPosition());
			map.fitBounds(this.getBounds());
		});
		google.maps.event.addListener(GeoMarker, 'geolocation_error', function(e) {
			alert('There was an error obtaining your position. Message: ' + e.message);
		});

		//Definition de la variable google ici pour eviter l'affichage de plusieurs parcours en meme temps
		directionsDisplay =  new google.maps.DirectionsRenderer({suppressMarkers: true});
		infowindow = new google.maps.InfoWindow({size: new google.maps.Size(150,50)});

	}//sucess
}//window.onload

//Obtenir les infos sur le point de start ou le end
function pointStartEnd(str, arg){
	//Parser les infos obtenues avec le AJAX
	lines = str.split("||");
	//console.log(lines);
	if(arg == 0){ //C'est le point start
		point0.length = 0; //Vider les tableaux
		titreStartPointInfo.length = 0;
		sTitreStartPointInfo.length = 0;

		//Stocker les informations
		point0.push(parseFloat(lines[1]));
		point0.push(parseFloat(lines[2]));

		titreStartPointInfo.push(lines[4]);
		sTitreStartPointInfo.push(lines[5]);
		tabVisible.push(1);
		//console.log("start", point0);
	}
	if(arg == 1){ //C'est le point end
		pointEnd0.length = 0; //Vider les tableaux
		titreEndPointInfo.length = 0;
		sTitreEndPointInfo.length = 0;

		//Stocker les informations
		pointEnd0.push(parseFloat(lines[1]));
		pointEnd0.push(parseFloat(lines[2]));

		titreEndPointInfo.push(lines[4]);
		sTitreEndPointInfo.push(lines[5]);
		tabVisible.push(1);
		//console.log("end", pointEnd0);
	}
	affichageGeneral();
}

//Obtenir les informations sur les waypoints
function getWayPoints(str){
	lines = str.split("||");
	waypoints0.length = 0;
	tabVisible.length = 0;
	//console.log(lines);
	for(var i = 0; i<lines.length; i++){
		if (parseFloat(lines[i]) && lines[i] != 1 && lines[i] != 0){ // Tester si c'est bien une latitude/longitude
			//console.log(lines[i]);
			waypoints0.push(lines[i]); //Si c'est le cas, on l'enregistre
		}

		if((lines[i] == 0 || lines[i] == 1) && lines[i] != ""){
			if(lines[i] == 1){
				//console.log("le point est visible", lines[i]);
				tabVisible.push(1);
			}
			else{
				//console.log("le point n'est pas visible", lines[i]);
				tabVisible.push(0);
			}
			//console.log(lines[i]);
		}

		if(lines[i][0] != "<"){
			if(titrewaypointInfo.indexOf(lines[i]) == -1 && lines[i] != "" && waypoints0.indexOf(lines[i]) == -1 && lines[i] != 1 && lines[i] != 0){
				//console.log("t : ", lines[i]);
				titrewaypointInfo.push(lines[i]); 
				i += 1;
				sTitrewaypointInfo.push(lines[i]);
				//console.log("st : ", lines[i]);
			}

		}
	}
	affichageGeneral();
}

//Afficher le parcours en temps réel sur la map
function affichageGeneral(){
	//Fonction JQuery pour afficher le parcours sur la map
	jQuery(function() {
		var waypoints = [];
		effacerInfos();
		//Prendre la latitude et la longitude du point de départ
		if(point0.length>0){
			waypoints.push({"Geometry":{"Latitude":parseFloat(point0[0]),"Longitude":parseFloat(point0[1])}});
			titrePointInfo.push(titreStartPointInfo[0]);
			sTitrePointInfo.push(sTitreStartPointInfo[0]);
		}

		//Prendre la longitude et la longitude des waypoints
		if(waypoints0.length>0){
			copie = waypoints0;
			copieTitre = titrewaypointInfo;
			copieStitre = sTitrewaypointInfo;
			//console.log(titrewaypointInfo, sTitrewaypointInfo);
			while(copie.length > 0){
				waypoints.push({"Geometry":{"Latitude":parseFloat(copie[0]),"Longitude":parseFloat(copie[1])}});
				copie.shift(); copie.shift(); //retirer copie[0] et copie[1]
				titrePointInfo.push(copieTitre[0]); sTitrePointInfo.push(copieStitre[0]);
				copieTitre.shift(); copieStitre.shift();
			}
		}

		//Prendre la lagitude et la longitude du point de fin
		if(pointEnd0.length>0){
			waypoints.push({"Geometry":{"Latitude":parseFloat(pointEnd0[0]),"Longitude":parseFloat(pointEnd0[1])}});
			titrePointInfo.push(titreEndPointInfo[0]);
			sTitrePointInfo.push(sTitreEndPointInfo[0]);  
		}

		//Initialisation des variables de google; Un google.maps.DirectionsRenderer par parcours
		directionsService = new google.maps.DirectionsService();

		//Lancer la fonction de nettoyage
		effacerMarker();

		//Lancement des fonctions d'affichage
		loadMap(map, directionsDisplay);
		fitBounds(map, waypoints);

		//Lancer le calcul + affichage du parcours
		calcRoute(directionsService, directionsDisplay, waypoints);

	});//jQuery(function()
}//affichageGeneral

function effacerInfos(){
	titrePointInfo.length = 0;
	sTitrePointInfo.length = 0;
}

//Effacer les markers de la map
function effacerMarker(){
	//On supprime les markers présents sur la map un à un
	for(var i = 0; i < markersArray.length; i++){
		markersArray[i].setMap(null);
	}
	markersArray.length = 0;
}

//instancier la map
function loadMap(map, directionsDisplay){
	//Instanciation des options
	var myOptions = {
		zoom: 13,
		mapTypeId: window.google.maps.MapTypeId.HYBRID,
		//styles : retirer les labels de Google
		styles:[{"featureType":"poi","elementType":"labels","stylers":[{"visibility":"off"}]},{"featureType":"poi","elementType":"labels.text.stroke","stylers":[{"visibility":"off"}]}]
	};
	map.setOptions(myOptions);
	directionsDisplay.setMap(map);
}//loadMap

//Creer le tableau de waypoints
function fitBounds(map, stops) {
	var bounds = new window.google.maps.LatLngBounds();
	//Pour tout les waypoints, on crée la variable google de Lat et Lon
	jQuery.each(stops, function (key, val) {
		var myLatlng = new google.maps.LatLng(val.Geometry.Latitude, val.Geometry.Longitude);
		bounds.extend(myLatlng);
	});
	map.fitBounds(bounds);
}//fitBounds


//Afficher la route sur la map
function calcRoute(directionsService, directionsDisplay, stops) {
	//Declaration des variables
	var batches = [];
	var itemsPerBatch = 10; //Limite imposée par Google
	var itemsCounter = 0;
	var wayptsExist = stops.length > 0;

	//Tant qu'il y a encore des waypoints dans le tableau
	while (wayptsExist) {
		var subBatch = [];
		var subitemsCounter = 0;

		for (var j = itemsCounter; j < stops.length; j++){
			subitemsCounter++;
			subBatch.push({
				location: new window.google.maps.LatLng(stops[j].Geometry.Latitude, stops[j].Geometry.Longitude),
				stopover: true
			});
			if (subitemsCounter == itemsPerBatch){ 
				//Si on atteint la limite, on arrête et on fait un nouveau tableau (on continue la boucle)
				break;
			}
		}
		itemsCounter += subitemsCounter;
		batches.push(subBatch);
		wayptsExist = itemsCounter < stops.length;
		itemsCounter--;
	}//while

	var combinedResults;
	var unsortedResults = [{}];
	var directionsResultsReturned = 0;

	for (var k = 0; k < batches.length; k++) {
		//Le point de départ, d'arrivé et les waypoints
		var lastIndex = batches[k].length - 1;
		var start = batches[k][0].location;
		var end = batches[k][lastIndex].location;
				
		var waypts = [];
		waypts = batches[k];
		waypts.splice(0, 1);
		waypts.splice(waypts.length - 1, 1);

		var request = {
			origin: start,
			destination: end,
			waypoints: waypts,
			travelMode: window.google.maps.TravelMode.WALKING
		};

		(function (kk) {
			//On lance le calcul de la route
			directionsService.route(request, function (result, status) {
				if (status == window.google.maps.DirectionsStatus.OK) {
					var unsortedResult = { order: kk, result: result };
					unsortedResults.push(unsortedResult);

					directionsResultsReturned++;

					if (directionsResultsReturned == batches.length){
						//Remettre en ordre les points
						unsortedResults.sort(function (a, b) { return parseFloat(a.order) - parseFloat(b.order); });
						var count = 0;
						for (var key in unsortedResults){
							if (unsortedResults[key].result != null){
								if (unsortedResults.hasOwnProperty(key)){
									if (count == 0)
										combinedResults = unsortedResults[key].result;
									else {
										combinedResults.routes[0].legs = combinedResults.routes[0].legs.concat(unsortedResults[key].result.routes[0].legs);
										combinedResults.routes[0].overview_path = combinedResults.routes[0].overview_path.concat(unsortedResults[key].result.routes[0].overview_path);

										combinedResults.routes[0].bounds = combinedResults.routes[0].bounds.extend(unsortedResults[key].result.routes[0].bounds.getNorthEast());
										combinedResults.routes[0].bounds = combinedResults.routes[0].bounds.extend(unsortedResults[key].result.routes[0].bounds.getSouthWest());
									}
									count++;
								}
							}
						}

						directionsDisplay.setDirections(combinedResults);
						//Creer les markers et rajouter les informations dans les infobulles
						var legs = combinedResults.routes[0].legs;
						//console.log(tabVisible);
						for (var i=0; i < legs.length;i++){
							if(tabVisible[i] == 1){
								//console.log(titrePointInfo[i]);
								createMarker(directionsDisplay.getMap(), legs[i].start_location, titrePointInfo[i], sTitrePointInfo[i], "red");
							}
							else{
								createMarker(directionsDisplay.getMap(), legs[i].start_location, titrePointInfo[i], sTitrePointInfo[i], "blue");
							}
						}
						//Dernier point (ou premier s'il n'y a qu'un marker sur la map)
						var i=legs.length;
						if(tabVisible[i] == 1){
							createMarker(directionsDisplay.getMap(), legs[legs.length-1].end_location, titrePointInfo[i], sTitrePointInfo[i], "red");
						}
						else{
							createMarker(directionsDisplay.getMap(), legs[legs.length-1].end_location, titrePointInfo[i], sTitrePointInfo[i], "blue");
						}
						
					}
				}
			});
		})(k);//function(kk)
	}//for de calcRoute
}//calcRoute

function createMarker(map, latlng, label, html, icon) {

	icon = "http://www.google.com/mapfiles/marker.png"; //http://google.com/mapfiles/ms/micons/red-dot.png

	var contentString = '<b>'+label+'</b><br>'+html;

	var marker = new google.maps.Marker({
		position: latlng,
		map: map,
		icon: new google.maps.MarkerImage(icon),
		title: label,
		zIndex: Math.round(latlng.lat()*-100000)<<5
	});

	marker.myname = label;

	markersArray.push(marker);

	google.maps.event.addListener(marker, 'click', function() {
		infowindow.setContent(contentString); 
		infowindow.open(map,marker);
	});

	return marker;
}//createMarker