var rendererOptions = {
	map: map,
	preserveViewport: true,
}

var directionDisplay;

var directionsService = new google.maps.DirectionsService();

var map;

var markers = []; // arrêts
var stepDisplay;

var staticMarkers = [];

var is_admin = false;

var start = '';
var end = '';

var numero_ligne = null;

var color_ligne = [null, "#222222","#f8b900","#2e90cd","#eb831a","#f3a40f", "#50a128", "#005126", "#ab68a1", "#6633FF", "#eb831a", "#c06d1c", "#6c145e", "#007bc5", "#eb831a", "#b00a24", "#0078b4", "#99c8e0", "#696eab", "#c68a36", "#c68a36", "#3C7479", "#b7a31b"];

var polylines = [];

var markerIcon;

var points = [];

var routes = [];
var request; // itinéraire

// DOM
var infos;
var inputMarker;
var inputTitle;
var inputDescription;
var buttonEnregistrer;
var inputDepart;


function init()
{
	// ====== Create a Client Geocoder ======
	var geo = new google.maps.Geocoder();

	// ====== Create the Map ======
	var latlng = new google.maps.LatLng(45.84287395457696, 1.2136808144531264);
	var myOptions = {
	      zoom: 9,
	      center: latlng,
	      mapTypeId: google.maps.MapTypeId.ROADMAP
	};
	map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

	// Instantiate an info window to hold step text.
	stepDisplay = new google.maps.InfoWindow();

	var bounds = new google.maps.LatLngBounds();
}


function itineraire()
{
	inputDepart = $("#origine");
	inputDestination = $("#destination");

	init();
}


function itineraireAdmin()
{
	is_admin = true;

	infos = $("#infosPoints");
	inputMarker = $("#point_index");
	inputTitle = $("#point_nom");
	buttonEnregistrer = $("#add_point");
	inputDepart = $("#origine");
	inputDestination = $("#destination");

	infos.css('display','none');

	init();

	// ===== Events =====

	// placement d'un marker
	google.maps.event.addListener(map, 'click', function(event) {
		var marker = placeMarker(event.latLng);
		markers.push(marker);
		calcRoute(getRoute());
	});

}


//
// Défini le numéro de la ligne qui sera utilisé pour les marqueurs par exemple
//
function setNumeroLigne(numero)
{
	numero_ligne = numero;

	// set icon
	markerIcon = new google.maps.MarkerImage('/extra/images/pictos_lignes/'+ numero_ligne +'.png',
		// This marker is 20 pixels wide by 32 pixels tall.
		new google.maps.Size(33, 34),
		// The origin for this image is 0,0.
		new google.maps.Point(0,0),
		// The anchor for this image is the base of the flagpole at 0,32.
		new google.maps.Point(30, 30)
	);
}


//
// création d'un marker
//
function placeMarker(location, numero)
{


	if(is_admin)
	{
                var marker = new google.maps.Marker({
                        position: location,
                        map: map,
                        draggable: true,
                        clickable: true,
                        title: ''
                });

                marker.setTitle('');
                //marker.description = '';
                marker.set('description','');

                marker.icon = markerIcon

		markers.push(marker);

		saveMarker(findMarkerIndex(marker));

		// recalcule de la position du marker en cas de déplacement
		google.maps.event.addListener(marker, "dragend", function() {
			saveMarker(findMarkerIndex(marker));
			calcRoute(getRoute());
		});

		// au clic sur le marker
		google.maps.event.addListener(marker, 'click', function(event)
		{
			// on affiche le formulaire d'infos
			infos.css('display','block');

			// on récupère l'index du marker dans le tableau des markers
			marker = markers[findMarkerIndex(marker)];

			// on remplis le formulaire avec les infos sur marker
			inputMarker.val(findMarkerIndex(marker));
			inputTitle.val(marker.title);
			FCKeditorAPI.GetInstance('point[description]').SetHTML(unescape(marker.description));

			infos.marker = marker;
		});

		// au clic sur le bouton "enregistrer"
		buttonEnregistrer.click(function(){
			setInfosMarker();
		});
	}

        else{

            var marker = new google.maps.Marker({
                    position: location,
                    map: map,
                    draggable: false,
                    clickable: true,
                    title: ''
            });

            marker.setTitle('');
            //marker.description = '';
            marker.set('description','');

            marker.icon = markerIcon

            var test = "1";

            var contentString = '<div id="content">'+
                'Voir le plan de la '+
                '<a href="http://rdthvdev.althea-groupe.com/extra/index.php/?numero='+ numero +'&commit=Afficher">'+
                'ligne '+ numero +'</a>'+
                '</div>';

            var infowindow = new google.maps.InfoWindow({
                content: contentString
            });

            google.maps.event.addListener(marker, 'click', function() {
                    infowindow.open(map,marker);
            });

            infowindow.close(map,marker);


        }

	return marker;
}


//
// Returns the index of the marker in the polyline.
//
function findMarkerIndex(marker) {
  var index = -1;

  for (var  i = 0; i < markers.length; ++i) {
    if (markers[i] == marker) {
      index = i;
      break;
    }
  }
  return index;
}


//
// Récupère le nombre de marqueurs
//
function countMarkers()
{
	deleteDuplicateMarker();

	var count = 0;

	for(var i = 0; i < markers.length; i++)
	{
		if(markers[i] != null)
		{
			count++;
		}
	}

	return count;
}


//
// enregistrement des infos du marqueur selectionné
//
function setInfosMarker()
{
	// référence du marker
	var markerIndex = inputMarker.val();

	if(markerIndex.length < 1)
		return false;

	inputMarker.val('');
	marker = markers[markerIndex];

	// nouvelles infos
	var title = inputTitle.val();
	var description = FCKeditorAPI.GetInstance('point[description]').GetHTML();
	//description = escape(description);

	// on enregistre les informations du marqueur
	marker.setTitle(title);
	marker.set('description', description);

	attachMarkerInfoBulle(marker, title, description);

	if(title.length < 0)
	{
		marker.setIcon(null);
	}

	// on masque le formulaire
	infos.css('display','none');
	// on vide les champs du formulaire
	inputTitle.val('');
	FCKeditorAPI.GetInstance('point[description]').SetHTML('');

	saveMarker(markerIndex);
}


//
// création d'une infobulle sur un marqueur
//
function attachMarkerInfoBulle(marker, title, description)
{
	var infoBulle = '<strong>'+title+'</strong><br />'+description;

	google.maps.event.addListener(marker, 'click', function() {
		stepDisplay.setContent(infoBulle);
		stepDisplay.open(map, marker);
	});

	if(title.length > 0)
	{
		marker.icon = markerIcon;
	}
	else {
		marker.icon = null;
	}
}



//
// Suppression du marqueur selectionné
//
function deleteMarker()
{
	// suppression des doublons éventuels
	deleteDuplicateMarker()

	// référence du marker
	var markerIndex = inputMarker.val();

	markers[markerIndex].setMap(null);

	markers[markerIndex] = null;

	$('input[name="points['+markerIndex+'][position]"]').remove();
	$('input[name="points['+markerIndex+'][nom]"]').remove();
	$('input[name="points['+markerIndex+'][description]"]').remove();

	// on masque le formulaire
	infos.css('display','none');

	calcRoute(getRoute());
}


//
// clic sur le bouton "reinitwaypoints" pour réinitialiser les markers
//
function deleteAllMarkers(){
	for(var i = 0; i < markers.length; i++) {
		if( markers[i] ) {
			markers[i].setMap(null);
		}
	}
	markers = [];

	$('#infosPoints input[type="hidden"]').remove();

	calcRoute(getRoute());
}


//
// récupération de la route courante formatée
//
function getRoute()
{
	start = inputDepart.val();

	end = inputDestination.val();

	var waypts = [];

	deleteDuplicateMarker();

	for (var i = 0; i < markers.length; i++) {
		if( markers[i] )
		{
			waypts.push({location:markers[i].position, stopover:false});
		}
	}

	request = {
	    origin: start,
	    destination: end,
	    waypoints: waypts,
	    travelMode: google.maps.DirectionsTravelMode.DRIVING,
	    optimizeWaypoints: true
	};

	return request;
}


//
// Mise en mémoire d'une route formatée
//
function saveRoute(request)
{
	routes.push(request);
}

//
// calcule de l'itinéraire
//
function calcRoute(request)
{
	// on efface l'itinéraire calculé précédemment
	for(var j = 0; j < polylines.length; j++)
	{
		polylines[j].setMap(null);
	}

	/*if(directionDisplay)
	{
		directionDisplay.setMap(null);
	}

	directionDisplay = new google.maps.DirectionsRenderer(rendererOptions);
	directionDisplay.setMap(map);*/

	directionsService.route(request, function(response, status) {
		if (status == google.maps.DirectionsStatus.OK) {
			//directionDisplay.setDirections(response);
			//var steps = response.trips[0].routes[0].steps;
			var steps = response.routes[0].legs[0].steps; // modification de l'API ? (constaté le 25/05/2010)

			for(var i = 0; i < steps.length; i++)
			{
				polylineOptions = {
					map: map,
					strokeColor: color_ligne[numero_ligne],
					strokeOpacity: 0.7,
					strokeWeight: 5,
					path: steps[i].lat_lngs,
				}
				polylines.push(new google.maps.Polyline(polylineOptions));
			}

			removeStaticMarkers();
			placeStaticMarker(steps[0].lat_lngs[0]);
			placeStaticMarker(steps[steps.length -1].lat_lngs[steps[steps.length - 1].lat_lngs.length -1]);
		}
	});
}


function placeStaticMarker(location)
{
	var marker = new google.maps.Marker({
		position: location,
	    map: map,
		draggable: true,
		clickable: true,
		title: ''
	});

	marker.setTitle('');
	marker.set('description', '');

	marker.icon = markerIcon

	if(is_admin)
	{
		// au clic sur le marker
		google.maps.event.addListener(marker, 'click', function(event)
		{
			// on affiche le formulaire d'infos
			infos.css('display','block');

			// on récupère l'index du marker dans le tableau des markers
			marker = markers[findMarkerIndex(marker)];

			if(marker == undefined)
				return false;

			// on remplis le formulaire avec les infos sur marker
			inputMarker.val(findMarkerIndex(marker));
			inputTitle.val(marker.getTitle());
			FCKeditorAPI.GetInstance('point[description]').SetHTML(unescape(marker.get('description')));

			infos.marker = marker;
		});

		// au clic sur le bouton "enregistrer"
		buttonEnregistrer.click(function(){
			setInfosMarker();
		});
	}

	staticMarkers.push(marker);

	return marker;
}

function removeStaticMarkers()
{
	for(var i = 0; i < staticMarkers.length; i++)
	{
		staticMarkers[i].setMap(null);
	}
	staticMarkers = [];
}


//
// Suppresion des doublons dans la liste des marqueurs
//
function deleteDuplicateMarker()
{
	for (var i = 0; i < markers.length; i++)
	{
		if( markers[i+1] != undefined && markers[i] != null && markers[i].position == markers[i+1].position )
		{
			markers[i+1] = null;
		}
	}
}


//
//sauvegarde du marqueur (création d'un input hidden)
//
function saveMarker(markerIndex)
{
	var marker = markers[markerIndex];

	if( $('input[name="points['+markerIndex+'][position]"]').val() == undefined ) {
		infos.append('<input type="hidden" name="points['+markerIndex+'][position]" value="'+marker.getPosition()+'" />');
		infos.append('<input type="hidden" name="points['+markerIndex+'][nom]" value="'+marker.getTitle()+'" />');
		infos.append('<input type="hidden" name="points['+markerIndex+'][description]" value="'+marker.get('description')+'" />');
	}
	else
	{
		$('input[name="points['+markerIndex+'][position]"]').val(marker.getPosition());
		$('input[name="points['+markerIndex+'][nom]"]').val(marker.getTitle());
		$('input[name="points['+markerIndex+'][description]"]').val(marker.get('description'));
	}
}


//
// Chargement d'un marqueur
//
function loadMarker(position, title, description, zoom_ligne)
{
	var lat = position.substring((position.indexOf('(', 0) + 1), position.indexOf(',', 0));
	var lng = position.substring((position.indexOf(' ', 0) + 1), position.indexOf(')', 0));

	position = new google.maps.LatLng(lat,lng);
        map.setZoom(zoom_ligne);

	var marker = placeMarker(position);
	marker.setTitle(title);
	marker.set('description', description);
	attachMarkerInfoBulle(marker, title, description);

	saveMarker(findMarkerIndex(marker));
}


//
// Chargement d'un marqueur indépendemment
//
function loadMarkerStatic(position, title, description)
{
	var lat = position.substring((position.indexOf('(', 0) + 1), position.indexOf(',', 0));
	var lng = position.substring((position.indexOf(' ', 0) + 1), position.indexOf(')', 0));

	position = new google.maps.LatLng(lat,lng);


	var marker = new google.maps.Marker({
		position: position,
                map: map,
		draggable: false,
		clickable: true,
		title: '',
	});

	// set icon
	var markerIcon = new google.maps.MarkerImage('/extra/images/pictos_lignes/'+ numero_ligne +'.png',
		// This marker is 20 pixels wide by 32 pixels tall.
		new google.maps.Size(33, 34),
		// The origin for this image is 0,0.
		new google.maps.Point(0,0),
		// The anchor for this image is the base of the flagpole at 0,32.
		new google.maps.Point(30, 30)
	);

	marker.icon = markerIcon;

	if(title.length < 1)
	{
		marker.visible = false;
	}

	marker.setTitle(title);
	marker.set('description', description);
	attachMarkerInfoBulle(marker, title, description)

	markers.push(marker);
}


//
// Calcule des routes sauvegardées (Affichage des routes)
//
function loadSavedRoute(start, end, waypoints, numero_ligne, zoom_ligne)
{
	var waypts = [];
        map.setZoom(zoom_ligne);
	// formatage des waypoints (coordonnées)
	for(var i = 0; i < waypoints.length; i++)
	{
		position = waypoints[i];
		var lat = position.substring((position.indexOf('(', 0) + 1), position.indexOf(',', 0));
		var lng = position.substring((position.indexOf(' ', 0) + 1), position.indexOf(')', 0));
		position = new google.maps.LatLng(lat,lng);

		waypts.push({location:position, stopover:false});
	}

	// écriture des données de la route
	request = {
	    origin: start,
	    destination: end,
	    waypoints: waypts,
	    travelMode: google.maps.DirectionsTravelMode.DRIVING,
	};

	directionsService.route(request, function(response, status) {
		if (status == google.maps.DirectionsStatus.OK) {
			/*var directionDisplayObject = new google.maps.DirectionsRenderer(rendererOptions);
			directionDisplayObject.setMap(map);
			directionDisplayObject.setDirections(response);*/

			setNumeroLigne(numero_ligne);
			//var steps = response.trips[0].routes[0].steps;
			var steps = response.routes[0].legs[0].steps; // modification de l'API ? (constaté le 25/05/2010)

			for(var step = 0; step < steps.length; step++)
			{
				polylineOptions = {
					map: map,
					strokeColor: color_ligne[numero_ligne],
					strokeOpacity: 0.7,
					strokeWeight: 5,
					path: steps[step].lat_lngs,
				}
				polylines.push(new google.maps.Polyline(polylineOptions));
			}

			placeMarker(steps[0].lat_lngs[0], numero_ligne);
			placeMarker(steps[steps.length -1].lat_lngs[steps[steps.length - 1].lat_lngs.length -1], numero_ligne);
		}
	});

}

