/**
* Page		: barredroite.js
* Contenu	: Code javascript pour la gestion de la feuille de route
* Date		: 24/08/10
* @author	Gael Sauvanet
* @version	1.0
*/

var feuille_visible = true;	// Pour savoir si la feuille de route est visible ou non

var distance = [];	// tableau des distances des itinéraires

var alti = [];		// tableau des altitudes des itinéraires
var min_alti;		// valeur min des altitudes
var max_alti;		// valeur max des altitudes
var feuilleAffichee = "";
var indexFDR = 0;

/**
 * maj les infos de distance et de temps
 */
function maj_distance()
{
	// On affiche la distance
	if(distance[solution_actuelle] < 1000)
		$j('#infos-distance').html(distance[solution_actuelle] + ' m');
	else
		$j('#infos-distance').html(distance[solution_actuelle]/1000 + ' km');

	// On calcule les deux temps approximatifs de l'itinéraire
	var temps1 = Math.round(distance[solution_actuelle] * 0.004);	// 15 km/h -> 60/15000
	var temps2 = Math.round(distance[solution_actuelle] * 0.006);	// 10 km/h -> 60/10000

	// Au minimum on affichera un temps de parcours d'1 minute
	if(temps1 == 0)
		temps1 = 1;
	if(temps2 == 0)
		temps2 = 1;

	// On affiche le temps de parcours
	if(temps1 == temps2)
	{
		if(temps1 == 1) 
			$j('#infos-temps').html(temps1 + ' min');
	}
	else
		$j('#infos-temps').html(temps1 + '-' + temps2 + ' min');

}

/**
 * Requête de chargement du profil altimétrique en JSON
 */
function maj_alti()
{
	if(typeRequete == 1)
		$j.ajax({
			dataType:'jsonp',
			url: URL_ALTI + parseInt(defItineraire.lon1*10000) + '_' + parseInt(defItineraire.lat1*10000) + '_' + parseInt(defItineraire.lon2*10000) + '_' + parseInt(defItineraire.lat2*10000) + 'p.fdr',
			jsonp: false,
			jsonpCallback: "alti_jsonp",
			success: onLoadALTI,
			error: function(){alert('Erreur chargement profil altimétrique');}
		    });
}

/**
 * Maj le profil altimetrique si tout est ok
 */
function onLoadALTI(r)
{
	var reponse = r;
	alti = reponse.alti;

	min_alti = 5000;
	max_alti = 0;

	for (var i=0; i<alti.length; i++)
	{
		for (var j=0; j<alti[i].length; j++)
		{
			if(alti[i][j][1] < min_alti)
				min_alti = alti[i][j][1];
			else if(alti[i][j][1] > max_alti)
				max_alti = alti[i][j][1];
		}
	}

	min_alti = min_alti-10;
	max_alti = max_alti+10;

	chargeAlti(solution_actuelle);
}

/**
 * Fonction pour afficher sur le graphique le profil altimétrique
 */
function chargeAlti(num_itineraire)
{
	if(typeRequete != 1)return;
	if(((dynamic) && (feuille_visible))||(!dynamic))
		$j(function () {
		    $j.plot($j('#profil'), [alti[num_itineraire-1]], {
			series: {
			    lines: { show: true },
			    colors: ["#d18b2c", "#d18b2c"]

			},
			grid: {
			    backgroundColor: { colors: ["#fff", "#eee"] }
			},
			colors: ["#5e7a16c"],
			yaxis: {
			    min: min_alti,
			    max: max_alti,
			    tickFormatter: function (v, axis) { return v.toFixed(axis.tickDecimals) +"m" }
			},
			xaxis: {
			    ticks: 0
			}
		    });
		});
}

/**
 * Fonction pour afficher sur le graphique le profil altimétrique de 2 itinéraires
 */
function chargeAlti2(num_itineraire, num_itineraire2)
{
	if(typeRequete != 1)return;
	if(((dynamic) && (feuille_visible))||(!dynamic))
	{
		$j(function () {
		    $j.plot($j("#profil"), [{data:alti[num_itineraire2-1],lines:{lineWidth:2}},{data:alti[num_itineraire-1],lines:{lineWidth:2}}], {
			series: {
			    lines: { show: true }
			},
			grid: {
			    backgroundColor: { colors: ["#fff", "#eee"] }
			},
			colors: ["#A6A6A6", "#5e7a16"],
			yaxis: {
			    min: min_alti,
			    max: max_alti,
			    tickFormatter: function (v, axis) { return v.toFixed(axis.tickDecimals) +"m" }
			},
			xaxis: {
			    ticks: 0
			}
		    });
		});
	}
}

/**
 * Requête de chargement de la feuille de route en JSON
 */
function maj_fdr()
{
	$j.ajax({
		dataType:'jsonp',
		url: URL_FDR + parseInt(defItineraire.lon1*10000) + '_' + parseInt(defItineraire.lat1*10000) + '_' + parseInt(defItineraire.lon2*10000) + '_' + parseInt(defItineraire.lat2*10000) + '_' + solution_actuelle + 'p.fdr',
		jsonp: false,
		jsonpCallback: "fdr_jsonp",
		success: onLoadFDR,
		error: function(){alert('Erreur chargement feuille de route');}
	    });
}

/**
 * Génération du code HTML de la feuille de route
 * paramètre implicite: variable globale dynamic
 * @param feuille tableau de données de feuille de route
 * @returns {String} feuille de route sous forme de tableau HTML
 */
function genererFDR(feuille)
{	
	if(defItineraire.lon1 == 0 || defItineraire.lat1 == 0 || defItineraire.lon2 == 0 || defItineraire.lat2 == 0)
	{
		return;
	}
	var contenu = '';

	if(dynamic)
		contenu += '<table border="0" cellpadding="3" cellspacing="0">';
	
	else
		contenu += '<table cellpadding="5" cellspacing="0">';
	
	var nb_route = 0;
	var Etape=1;
	for (var i=0; i<feuille.length; i++)
	{
		nb_route++;
		
		var lienZoom = "";
		if(dynamic && typeof(feuille[i].lat) != 'undefined' && feuille[i].lat != 0)
		{
			lienZoom = 'style="cursor:pointer" onclick="zoomFDR(\'pos\','+i+')" id="ligne-fdr-'+i+'"';
		}
		if(nb_route%2 == 1)
			contenu += '<tr '+lienZoom+'>';
		else
			if(dynamic)
				contenu += '<tr bgcolor="#f1e4ff" '+lienZoom+'>';
			else
				contenu += '<tr bgcolor="#ffffff">';
	
		var indic;
		var image;
	
		if(feuille[i].type == 1)
			image_type = '<img src="res/img/pistecyclable.png" height="40" width="40" title="piste cyclable" alt="piste cyclable" />';
		else if(feuille[i].type == 2)
			image_type = '<img src="res/img/voiecyclable.png" height="40" width="40" title="bande cyclable" alt="bande cyclable" />';
		else if(feuille[i].type == 3)
			image_type = '<img src="res/img/voiecyclable.png" height="40" width="40" title="bande cyclable" alt="bande cyclable" />';
		else if(feuille[i].type == 5)
			image_type = '<img src="res/img/velopieton.png" height="40" width="40" title="voie partag&eacute;e pi&eacute;ton" alt="voie partag&eacute;e pi&eacute;ton" />';
		else if(feuille[i].type == 4)
			image_type = '<img src="res/img/velobus.png" height="40" width="40" title="voie partag&eacute;e bus" alt="voie partag&eacute;e bus"/>';
		else if(feuille[i].type == 20 && i < feuille.length - 1 && feuille[i-1].type == 21 && feuille[i+1].type == 21)
			image_type = '<img src="res/img/gare_etape.png" title="gare" alt="gare"/>';
		else if(feuille[i].type == 20 && i < feuille.length - 1 &&  feuille[i+1].type == 21)
			image_type = '<img src="res/img/gare_dep.png" title="gare" alt="gare"/>';
		else if(feuille[i].type == 20 && feuille[i-1].type == 21)
			image_type = '<img src="res/img/gare_arr.png" title="gare" alt="gare"/>';
		else if(feuille[i].type == 10)
			image_type = '<img src="res/img/fdr-pieton.png" height="40" width="40" title="trajet à pied" alt="trajet à pied"/>';
		else if(feuille[i].type == 21)
			image_type = '<img src="res/img/fdr-train.png" height="40" width="40" title="train" alt="train"/>';
		else
			image_type = '';
	
		if(feuille[i].nom == '')
		{
			switch (feuille[i].type) {
				case '1':
					feuille[i].nom = 'la piste cyclable';
					break;
				case '2':
					feuille[i].nom = 'la bande cyclable';
					break;
				case '3':
					feuille[i].nom = 'la bande cyclable';
					break;
				case '4':
					feuille[i].nom = 'voie partag&eacute;e bus';
					break;
				case '5':
					feuille[i].nom = 'voie partag&eacute;e pi&eacute;ton';
					break;
				default: 
					feuille[i].nom = 'la route';
					break;
			}
		} 
		else
				feuille[i].nom = '<b>'+feuille[i].nom+'</b>';
	
		if((i==0)&&(feuille[i].rondpoint == 0))
		{
			indic = 'prendre ' + feuille[i].nom;
			image = 'fleche-devant.png';
		}
		else if(feuille[i].rondpoint == 1)
		{
			var nom_rondpoint = "";
			if(typeof(feuille[i].nom_rondpoint) != "undefined")
			{
				nom_rondpoint = " (" + feuille[i].nom_rondpoint + ")";
			}
			
			var temp = 'ère';
			if(feuille[i].direction > 1)
				temp = 'ème';
			
			if(feuille[i].direction == 0)
				indic = 'au rond-point'+nom_rondpoint+', sortir sur ' + feuille[i].nom;	
			else
				indic = 'au rond-point'+nom_rondpoint+', prendre la ' + feuille[i].direction + temp + ' sortie sur ' + feuille[i].nom;	
	
			image = 'rond-point.png';					
		}
		else if(feuille[i].direction < -50)
		{
			indic = 'prendre &agrave; gauche ' + feuille[i].nom;	
			image = 'fleche-gauche.png';		
		}			
		else if((feuille[i].direction >= -50)&&(feuille[i].direction < -25))
		{			
			indic = 'prendre l&eacute;g&egrave;rement &agrave; gauche ' + feuille[i].nom;	
			image = 'fleche-gauche2.png';
		}			
		else if((feuille[i].direction >= -25)&&(feuille[i].direction < 25))
		{
			indic = 'continuer sur ' + feuille[i].nom;
			image = 'fleche-devant.png';
		}
		else if((feuille[i].direction >= 25)&&(feuille[i].direction < 50))
		{
			indic = 'prendre l&eacute;g&egrave;rement &agrave; droite ' + feuille[i].nom;
			image = 'fleche-droite2.png';
		}			
		else if(feuille[i].direction >= 50)
		{
			indic = 'prendre &agrave; droite ' + feuille[i].nom;
			image = 'fleche-droite.png';
		}
		
		if(feuille[i].type==21)indic = 'Ligne ' + feuille[i].nom;;
		if(feuille[i].type==20)indic = 'Gare de ' + feuille[i].nom;;
	
		if(dynamic)
		{
			if(feuille[i].type < 20)
				contenu += '<td width="175">' + indic + ' (' + feuille[i].distance + 'm)</td><td width="40">'+image_type+'</td>';
			else
				contenu += '<td width="175">' + indic + '</td><td width="40">'+image_type+'</td>';
			if(feuille[i].etape==1) // Si le tronçon courant correspond à une étape. On ajoute une ligne au tableau pour marquer l'étape
			{
				add=document.getElementById("adresseEtape"+Etape).value;// On récupère l'adresse de l'étape
				if(mode_colonne_droite == 6 && typeof(defItineraire.ListemarkerEtape[Etape].attributes.poi) != 'undefined' && defItineraire.ListemarkerEtape[Etape].attributes.poi != "")add = defItineraire.ListemarkerEtape[Etape].attributes.poi;
				contenu += '</tr>';
				contenu += '<tr bgcolor="#c1b8cf">';
	
				contenu +=' <td width="175"> Etape : <b id="label_etape_fdr_'+Etape+'">'+ add + '</b></td><td width="40"><img src="res/img/balade/etape'+Etape+'.png" height="38" width="38" alt="&eacute;tape" /></td>';
				Etape+=1;// On passe à la recherche de l'étape suivante
			}
		}
		else
		{
			// lien vers la mini-carte
			var minicarte = "";
			if(typeof(indicesMiniCarte) != 'undefined'){
				// détermination d'une autre URL
				var autreEnsembleMiniCarte = {};
				for(var idx in indicesMiniCarte)autreEnsembleMiniCarte[idx] = true;
				if(i in autreEnsembleMiniCarte)
					delete autreEnsembleMiniCarte[i];
				else
					autreEnsembleMiniCarte[i] = true;
				var UrlAutreConf = window.location.href;
				var posParam = UrlAutreConf.lastIndexOf("&miniCarte=");
				if(posParam != -1)
				{
					UrlAutreConf = UrlAutreConf.substring(0,posParam);
				}
				var chaineNumeros = "";
				for(var idx in autreEnsembleMiniCarte){
					if(chaineNumeros != "")chaineNumeros += ",";
					chaineNumeros += idx;
				}
				if(chaineNumeros != "")UrlAutreConf += "&miniCarte=" + chaineNumeros;
			}
			
			var chaineMiniCarte = "";
			if(ZONE_MINI_CARTE)
			{
				if(i in indicesMiniCarte)
				{	// on doit afficher une mini-carte ici et le lien pour l'enlever
					chaineMiniCarte += '<br><br><div id="mini-carte-'+i+'" class="mini-carte"></div>';
					chaineMiniCarte += '<a href="'+UrlAutreConf+'" class="lien-mini-carte">Cacher la mini-carte</a>';
				}
				else
				{	// on met un lien d'affiche de mini-carte
					chaineMiniCarte = '<a href="'+UrlAutreConf+'&ligneModifiee='+i+'" class="lien-mini-carte">Mini-carte</a>';
				}
			}
			
			contenu += '<td width="70"><center><img src="res/img/' + image + '" height="30" width="30" /></center></td>';
			contenu += '<td width="500"><span class=texte_feuillederoute>' + indic + '</span>'+chaineMiniCarte+'</td>';
			contenu += '<td width="110"><center>' + feuille[i].distance + 'm</center></td>';
			contenu += '<td width="60"><center>'+image_type+'</center></td>';
	
			if(feuille[i].etape==1) // Si le tronçon courant correspond à une étape. On ajoute une ligne au tableau pour marquer l'étape
			{
				add=$j("#adresse_etape"+Etape).val(); // On récupère l'adresse de l'étape
				if(mode_colonne_droite == 6 && typeof(defItineraire.ListemarkerEtape[Etape].attributes.poi) != 'undefined' && defItineraire.ListemarkerEtape[Etape].attributes.poi != "")add = defItineraire.ListemarkerEtape[Etape].attributes.poi;
				contenu += '</tr>';
				contenu += '<tr bgcolor="#c1b8cf">';
				contenu += '<td width="70"><center><img src="res/img/picto_etape'+Etape+'.png" height="38" width="38" alt="&eacute;tape" /></center></td>';
				contenu += '<td width="500"><span class=texte_feuillederoute><b>Etape</b> : <b id="label_etape_fdr_'+Etape+'">'+ add + '</b></span></td>';
				contenu += '<td width="110"><center> </center></td>';
				contenu += '<td width="60"><center> </center></td>';
				Etape+=1; // On passe à la recherche de l'étape suivante
			}
		}
		contenu += '</tr>';
	}
	contenu += '</table>';
	return contenu;
}

/**
 * Met à jour l'affichage de la feuille de route
 */
function maj_affichageFDR()
{
	indexFDR = -1;
	$j('#fdr_contenu2').html(genererFDR(feuilleAffichee));
	if(typeof(indicesMiniCarte) != 'undefined')
	{
		for(var i in indicesMiniCarte)
		{
			fdr_mini_carte(i);
		}
		if(typeof(ligneModifiee) != 'undefined')
		{
			$j('body').scrollTo($j("#mini-carte-"+ligneModifiee+" :parent"));
		}
	}
	if(dynamic)
	{
		$j("#fdr_contenu").scrollTo(0,0);
		$j('#adresse_depart').html($j('#adresseDepart').val());
		$j('#adresse_arrivee').html($j('#adresseArrivee').val());
		$j("#ligne-fdr-arrivee").removeClass("fdr_highlight");
	}	
}

/**
 * Chargement de la feuille de route
 */
function onLoadFDR(r)
{
	var reponse = r; 
	feuilleAffichee = reponse.feuille;

	maj_affichageFDR();
}

/**
 * Gestion de la navigation dans la feuille de route
 * @param type type d'action ("vue-ensemble":zoomer sur l'emprise de l'itinéraire, "pos": passer à un numéro de ligne, "delta": se déplacer à partir de la ligne actuelle)
 * @param num si type vaut "pos" ou "delta", nombre approprié
 */
function zoomFDR(type,num)
{
	if(defItineraire.lon1 == 0 || defItineraire.lat1 == 0 || defItineraire.lon2 == 0 || defItineraire.lat2 == 0)
	{
		messageModal("Merci de définir un point de départ et un point d'arrivée");
		return;
	}
	$j("#fdr_cadre tr").removeClass("fdr_highlight");
	if(type == "vue-ensemble")
	{
		bounds_itineraire = new OpenLayers.Bounds();
		bounds_itineraire.extend(LonLatToM(new OpenLayers.LonLat(defItineraire.lon1,defItineraire.lat1)));
		bounds_itineraire.extend(LonLatToM(new OpenLayers.LonLat(defItineraire.lon2,defItineraire.lat2)));
		for(var i = 0; i < nbEtapes; i++)
		{
			bounds_itineraire.extend(new OpenLayers.LonLat(defItineraire.ListemarkerEtape[i+1].geometry.x,defItineraire.ListemarkerEtape[i+1].geometry.y));
		}
		map.zoomToExtent(bounds_itineraire);
		marqueurPoint.cacher();
		$j("#fdr_contenu").scrollTo($j("#ligne-fdr-depart"));
		indexFDR = -1;//le curseur de ligne revient à sa position initiale
		return;
	}
	else if(type == 'pos')
	{
		indexFDR = num;
		if(num  == -2)indexFDR = feuilleAffichee.length;// cas où on clique sur la ligne "arrivée"
	}
	else if(type == 'delta')
	{
		indexFDR  += num;
		if(indexFDR < 0)indexFDR = 0;
		if(indexFDR > feuilleAffichee.length)indexFDR = feuilleAffichee.length;
	}
	map.zoomTo(18);
	if(indexFDR == feuilleAffichee.length)// cas de la ligne "arrivée"
	{
		marqueurPoint.positionner(defItineraire.lon2,defItineraire.lat2);
		map.setCenter(LonLatToM(new OpenLayers.LonLat(defItineraire.lon2,defItineraire.lat2)));
	-	$j("#ligne-fdr-arrivee").addClass("fdr_highlight");
		if(type == 'delta')$j("#fdr_contenu").scrollTo($j("#ligne-fdr-arrivee"));
	}
	else
	{
		marqueurPoint.positionner(feuilleAffichee[indexFDR].lon,feuilleAffichee[indexFDR].lat);
		map.setCenter(LonLatToM(new OpenLayers.LonLat(feuilleAffichee[indexFDR].lon,feuilleAffichee[indexFDR].lat)));
	-	$j("#ligne-fdr-"+indexFDR).addClass("fdr_highlight");
		if(type == 'delta')$j("#fdr_contenu").scrollTo($j("#ligne-fdr-"+indexFDR));
	}
}

