/**
* Page		: carteOL.js
* Contenu	: Code javascript pour l'interface OL de la carte
* Date		: 23/12/09
* @author	Gael Sauvanet
* @version	1.0
*/
var map;					// Objet map

var controlDrag = null;				// Contrôleur de l'évenement drag
var controlMousePosition = null;

var layerMarkers;				// Couche contenant les marqueurs
var layerPOIs;				// Couche contenant les marqueurs
var layerCyclemap;				// Couche OpenCycleMap
var layerOSM;					// Couche OSM
var layerCloudmade;				// Couche CloudMade Géovélo
var layerGoogleStreets;				// Couche Google Maps Streets

var dynamic;					// Pour savoir si la carte est dynamique (zoom et autre)
var path_static;				// Numéro d'itinéraire pour le passage index -> feuille de route

var chargement=0;				// numéro d'itinéraire choisi quand on utilise un chargement d'itinéraire par la BDD. Egal à 0 sinon

var lastFeature = null;				// Gestion tooltip : dernier objet sélectionné
var tooltipPopup = null;			// Gestion tooltip : popup

/**
 * Initialise et prépare la carte OL
 */
function initialize(lat1,lon1,lat2,lon2,latc,lonc,z,i,dynamic_map,coordEtapes) {
	// Création de l'objet carte
	map = new OpenLayers.Map("map",
	{ 
		maxExtent: new OpenLayers.Bounds(-20037508,-20037508,20037508,20037508),
		numZoomLevels: 19,
		maxResolution: 156543.0339,
		units: 'm',
		projection: new OpenLayers.Projection("EPSG:900913"),
		displayProjection:  new OpenLayers.Projection("EPSG:4326"),
		controls: [
//			new OpenLayers.Control.LayerSwitcher(),
			new OpenLayers.Control.ScaleLine({geodesic: true}),
//			new OpenLayers.Control.Navigation(),
			new OpenLayers.Control.PanZoomBar()
		]
	});

	dynamic = dynamic_map;

	if (i!=0) chargement=i; // Si on a charger i(la solution choisie) par la BDD, on le met dans chargement
	path_static = i;

	if(dynamic)
	{
		// On adapte la carte à la taille de la fenêtre 
		resizeApp();
	}

	// Initialisation de l'outil de géocodage
	initialiserGeocoder();

	layerCloudmade = new OpenLayers.Layer.OSM("CloudMade Géovélo",
                 ["http://a.tile.cloudmade.com/e2555e93f9985265ba6af342920a8741/13838/256/",
                  "http://b.tile.cloudmade.com/e2555e93f9985265ba6af342920a8741/13838/256/",
		  "http://c.tile.cloudmade.com/e2555e93f9985265ba6af342920a8741/13838/256/"],
                 { type: 'png', getURL: getTileURL, displayOutsideMaxExtent: true, transitionEffect: 'resize'});
	map.addLayer(layerCloudmade);

/*
	layerGoogleStreets = new OpenLayers.Layer.Google(
	    "Google Streets", // the default
	    {numZoomLevels: 20}
	);
*/
	// Carte affichée par défaut
	if(LAYER_GOOGLE)
	{
		map.addLayer(layerGoogleStreets);
		map.setBaseLayer(layerGoogleStreets);
		if(dynamic) e('attribution').style.display = 'none';
	}
	else if(LAYER_CLOUDMADE)
		map.setBaseLayer(layerCloudmade);

	// Création de la couche des POIs
	layerPOIs = new OpenLayers.Layer.Vector("POIs");
	map.addLayer(layerPOIs);

	// Création de la couche contenant les marqueurs de départ & arrivée
	layerMarkers = new OpenLayers.Layer.Vector("Markers");
	map.addLayer(layerMarkers);

	// Création et positionnement des marqueurs
	if(lat1 == 0)
	{
		lat1 = MARKER1_LAT;
		lon1 = MARKER1_LON;
		lat2 = MARKER2_LAT;
		lon2 = MARKER2_LON;
	}
	markerDepart = new OpenLayers.Feature.Vector(LonLatToPoint(LonLatToM(new OpenLayers.LonLat(lon1,lat1))),null,iconDepart);
	markerArrivee = new OpenLayers.Feature.Vector(LonLatToPoint(LonLatToM(new OpenLayers.LonLat(lon2,lat2))),null,iconArrivee);
	markerDepart.attributes = 'depart';
	markerArrivee.attributes = 'arrivee';
	layerMarkers.addFeatures(markerDepart);
	layerMarkers.addFeatures(markerArrivee);
	layerMarkers.drawFeature(markerDepart);
	layerMarkers.drawFeature(markerArrivee);

	// Positionner la carte
	bounds = new OpenLayers.Bounds();

	lonmin=lon1;latmin=lat1;lonmax=lon1;latmax=lat1;
	if (lon2<lonmin) lonmin=lon2;
	if (lon2>lonmax) lonmax=lon2;
	if (lat2<latmin) latmin=lat2;
	if (lat2>latmax) latmax=lat2;

	if (coordEtapes!=null)
		for (var i=0; i<coordEtapes.length; i++)
		{
			if (coordEtapes[i][1]<lonmin) lonmin=coordEtapes[i][1];
			if (coordEtapes[i][1]>lonmax) lonmax=coordEtapes[i][1];
			if (coordEtapes[i][0]<latmin) latmin=coordEtapes[i][0];
			if (coordEtapes[i][0]>latmax) latmax=coordEtapes[i][0];
		}

	bounds.extend(LonLatToM(new OpenLayers.LonLat(lonmin,latmin)));
	bounds.extend(LonLatToM(new OpenLayers.LonLat(lonmax,latmax)));
	boundsarray = bounds.toArray();
	boundsarray[0] = boundsarray[0] - 100;
	boundsarray[1] = boundsarray[1] - 100;
	boundsarray[2] = boundsarray[2] + 100;
	boundsarray[3] = boundsarray[3] + 100;
	bounds = new OpenLayers.Bounds.fromArray(boundsarray);
	map.zoomToExtent(bounds);


	// Ajout du contrôle drag sur la couche des marqueurs
	controlDrag = new OpenLayers.Control.DragFeature(layerMarkers, {'onComplete': function(feature) {
//		feature.drag = false;
		lonlat = new OpenLayers.LonLat(feature.geometry.x,feature.geometry.y);
		ll = MToLonLat(lonlat);
		feature.style.graphicOpacity = 1;

		if (feature.attributes=='depart' || feature.attributes=='arrivee')
			xajax_selectionnerNoeud(ll.lon,ll.lat,feature.attributes);
		else
			xajax_selectionnerNoeud(ll.lon,ll.lat,feature.attributes.substring(0,5),feature.attributes.charAt(5));
		},
		'onStart': function(feature) {
//		feature.drag = true;
//		tooltipUnselect(null);
		feature.style.graphicOpacity = 0.5;
		lonlat_old=new OpenLayers.LonLat(feature.geometry.x,feature.geometry.y);
		ll_old=MToLonLat(lonlat_old);
		}});

	// Ajout du contrôle de position de la souris
	controlMousePosition = new OpenLayers.Control.MousePosition({
		formatOutput: function(lonLat) {
	       		return ''
	   	}});
	controlNavigation = new OpenLayers.Control.Navigation();

/*
	// Ajout du contrôle pour les tooltips
	var highlightCtrl = new OpenLayers.Control.SelectFeature(layerMarkers, {
		hover: true, highlightOnly: true, renderIntent: "temporary", eventListeners: {
			beforefeaturehighlighted: tooltipSelect,
			featureunhighlighted: tooltipUnselect } });
*/

	if(dynamic)	// Sur la feuille de route, on interdit de pouvoir déplacer/zommer la carte à la souris
	{
		map.addControl(controlMousePosition);
		map.addControl(controlDrag);
		map.addControl(controlNavigation);
//		map.addControl(highlightCtrl);
		controlDrag.activate();
//		highlightCtrl.activate();
		controlMousePosition.activate();
		controlNavigation.activate();
	}

	// Si on a choisi un itinéraire depuis la BDD et qu'il contient des étapes, on les initialise
	nbEtapes = coordEtapes.length;
	coordEtapes.unshift(new Array(lat1,lon1));
	coordEtapes.push(new Array(lat2,lon2));
	xajax_selectionnerListeNoeud(coordEtapes);

	if(typeof initialiserZone == 'function') initialiserZone();

}

/**
 * Appelé quand la souris passe sur un marqueur
 */
/*
function tooltipSelect(event)
{
	var feature = event.feature;
	var selectedFeature = feature;
	//if there is already an opened details window, don\'t draw the tooltip
	if(feature.popup != null || feature.drag == true){
		return;
	}
	//if there are other tooltips active, destroy them
	if(tooltipPopup != null){
		map.removePopup(tooltipPopup);
		tooltipPopup.destroy();
		if(lastFeature != null){
			delete lastFeature.popup;
			tooltipPopup = null;
		}
	}
	lastFeature = feature;

	tooltipPopup = new OpenLayers.Popup.FramedCloud("activetooltip",
	       feature.geometry.getBounds().getCenterLonLat(),
	       new OpenLayers.Size(60,10),
	       "&nbsp; " + feature.attributes,icon,false,null );

	//this is messy, but I'm not a CSS guru
	tooltipPopup.contentDiv.style.backgroundColor='#ffffff';
	tooltipPopup.contentDiv.style.overflow='hidden';
	tooltipPopup.contentDiv.style.padding='3px';
	tooltipPopup.contentDiv.style.margin='0';

        tooltipPopup.closeOnMove = true;
	tooltipPopup.autoSize = true;
	feature.popup = tooltipPopup;
	map.addPopup(tooltipPopup);
}
*/

/**
 * Appelé quand la souris sort du marqueur
 */
/*
function tooltipUnselect(event)
{
	if(event != null)
	{
		var feature = event.feature;
		if(feature != null && feature.popup != null){
			map.removePopup(feature.popup);
			delete feature.popup;
			tooltipPopup = null;
			lastFeature = null;
		}
	}
	else
	{
		var feature = lastFeature;
		if(feature != null && feature.popup != null){
			map.removePopup(feature.popup);
			delete feature.popup;
			tooltipPopup = null;
			lastFeature = null;
		}
	}
}
*/

/**
 * Affiche et sauvegarde une URL courte pour que l'utilisateur puisse garder son itinéraire calculé
 */
function afficherURL(tache,id)
{
	if (tache=="enregistrer") // On vient de index.php, l'utilisateur à cliquer sur "afficher l'URL"
	{
		debutChargement();
		// Enregistrement de l'itineraire
		if (ListeEtape!=null)
		{
			// On met dans un tableau la liste des lon,lat des étapes pour pouvoir sauvegarder dans la BDD
			ListeCoordEtape=new Array();
			for (i=1; i<ListeEtape.length; i++)
			{
				ll = new OpenLayers.LonLat(ListemarkerEtape[i].geometry.x,ListemarkerEtape[i].geometry.y);
				ll=MToLonLat(ll);
				ListeCoordEtape[i]=new Array(ll.lat,ll.lon);
			}
		}
		// Sauvegarde de l'itinéraire
		xajax_EnregistrerItineraire(lat1,lon1,lat2,lon2,solution_actuelle,ListeCoordEtape);
	}
	else if (tache=="afficher") // On vient de sauvegarder dans la BDD l'itinéraire, on a maintenant un ID unique à passer à l'utilisateur
	{
		e('permalink_div').style.display = 'block';
		e('permalink').style.display = 'none';
		// On construit l'adresse de la page
		var lien = URL_SITE + "index.php";
		lien += "?it="+id;
	
		// On informe l'adresse dans le champs texte que l'on rend visible
		var lien_input = e('lien');
		lien_input.value = lien;
		finChargement();
	}
}

/**
 * Cache les div de l'URL
 */
function cacherURL()
{
	e('permalink_div').style.display = 'none';
	e('permalink').style.display = 'block';
}

/**
 * Permet d'afficher/cacher la feuille de route
 */
function switchfeuille()
{
	if(feuille_visible)
	{
		feuille_visible = false;
		e('colonne_droite').style.display = 'none';
		e('cacherfeuille1').style.display = 'none';
		e('cacherfeuille2').style.display = 'block';
		e('conteneur').style.margin = '10px 10px 0 255px';
	}
	else
	{
		feuille_visible = true;
		e('colonne_droite').style.display = 'block';
		e('cacherfeuille1').style.display = 'block';
		e('cacherfeuille2').style.display = 'none';
		e('conteneur').style.margin = '10px 255px 0 255px';
		chargeAlti(solution_actuelle);
	}
}


