/*
 * Created on 28 janv. 2008
 *
 * Fonctions de gestion des maillons, cot� client
 * (liste de maillons, colorier les maillons, etc ...)
 * s'appuie sur les utilitaires SVG / VML
 */

// En mode SVG, inclure
// <script language="JavaScript" type="text/javascript" src="../include/js/addeo_svg_utils.js"></script>

var VERT_MAILLON = "#00CC00";
var ORANGE_MAILLON ="#ff9933";
var ROUGE_MAILLON = "#ff0000";
var NOIR_MAILLON = "#000000";
var GRIS_MAILLON = "#ADADAD";

/**
 * Retourne des noeuds "actifs", lignes, poly, etc ... situes dans l'arbre d'un element svg (balise <g id=... >
 * @param doc,		 		SVG obj
 * @param elementName, 		Nom de l'élément SVG
 * @return array JS 
 */
function lire_liste_noeuds_element_svg(doc, elementName)
{
	var liste;
	var liste2;
	var i, j, node;
	
	liste = getNodeList_SVGElement(doc, elementName);				// liste de tous les noeud de cet elt (y compris texte, attributs, comments ...)	
	
	if(!liste)								return null;
	if(typeof liste == "undefined")			return null;
		
	liste2 = new Array();											// la liste a retourner 
	
	j = 0;
	for(i=0; i < liste.length; i++)		{
		node = liste[i];

		if(typeof node == "undefined")			continue;
		if(node.nodeType != 1)					continue;													// on ne prend que les noeuds "elements" ...
		if((node.nodeName == "polygon") || (node.nodeName == "polyline") || (node.nodeName == "line")){		// ... qui nous interessent
			liste2[j] = node;
			j++;
		}
	}

	return(liste2);	
}

/**
 * Changer_couleur_liste_noeuds(liste_noeuds, couleur)
 * la couleur s'applique au noeud de type polygon & polyline
 * @param liste_noeuds	- array 	
 * @param couleur		- string au format #dddddd 
 * @return null
 */
function changer_couleur_liste_noeuds(liste_noeuds, couleur)
{
	var i, node;
	
	if(liste_noeuds == null)				return;
	for(i=0; i < liste_noeuds.length; i++)	{
		node = liste_noeuds[i];
		
		if((node.nodeName == "polyline") || 	(node.nodeName == "line"))	{
			if(mode_SVG)				node.setAttribute('stroke', couleur);	
			else 						node.setAttribute('strokecolor', couleur);		// mode_VML
		}
		if(node.nodeName == "polygon")
			if(mode_SVG)				node.setAttribute('fill', couleur);		
	}
}

/**
 * Change les couleurs d'un liste de maillons
 * @param doc
 * @param maillons
 * @param couleur
 * @return null
 */
function changer_couleur_liste_maillons(doc, maillons, couleur)
{
	var i;
	for(i=0; i < maillons.length; i++)			changer_couleur_maillon(doc, maillons[i], couleur);	
}

/**
 * Modifie la couleur d'un maillon
 * La couleur s'applique aux noeuds utiles de ce maillon
 * @param doc
 * @param nom_maillon
 * @param couleur
 * @return null
 */
function changer_couleur_maillon(doc, nom_maillon, couleur)
{
	var noeuds_maillon;
	noeuds_maillon = lire_liste_noeuds_element_svg(doc, nom_maillon);
	changer_couleur_liste_noeuds(noeuds_maillon, couleur);
}

function changer_texte_maillon(doc, nom_maillon, texte_str, couleur)
{
	maillon = getSVGelement(doc, nom_maillon);
	if(maillon == null)				return false;
	
	maillon.firstChild.nodeValue = texte_str;			// maj du texte
	maillon.setAttribute('fill', couleur);				// maj de la couleur

}

/**
 * Maj des couleurs de tous les maillons retournes par le serveur
 * @param table
 * @return null
 */
function maj_couleur_maillons(table)
{
	var i, N;
	var maillon_xml;
	var nom_maillon, couleur;
	var doc;
	var now, o_date, delta, str_time_rocade;
	
	if(mode_SVG)			doc = getSVGDoc("Calque_1");		// acces au document SVG (actuellement repere par une balise <embed id="..."> )
	else 					doc = getVMLDoc("Calque_1");		// VML : acces au document VML (actuellement dans une Iframe )
		
	N = table.length;
	for(i=0; i<N; i++)		{
		maillon_xml = table[i];
		couleur = lire_couleur_maillon_xml (maillon_xml);
		nom_maillon = maillon_xml['id'];
		changer_couleur_maillon(doc, nom_maillon, couleur);
	}
	
	if(liste_maillons.time_R && liste_maillons.time_U)		{
		str_time_rocade	= liste_maillons.time_R;
		str_time_urbain = liste_maillons.time_U;
		o_dateR = convertir_date_serveur_2_client(str_time_rocade);
		o_dateU = convertir_date_serveur_2_client(str_time_urbain);
		if(o_dateR && o_dateU)		{
			delta = o_dateU.getTime() - o_dateR.getTime();	 // delta en ms
			if (delta > 30*60*1000)					griser_maillons_rocade(table);
		}	
	}	
}

/**
 * Lit la couleur d'un maillon XML
 * @param m
 * @return string couleur ou GRIS_MAILLON ("#ADADAD") si pas d'état sur le maillon ou type différent de R ou U
 */
function lire_couleur_maillon_xml(m)
{
	var etat = m['trafficStatus'];
	var type = m['type'];
	
	if(!etat)				return(GRIS_MAILLON); 
	
	etat = etat.toUpperCase();
	type = type.toUpperCase();
	
	if(type == "R")			return (lire_couleur_maillon_rocade(etat));
	if(type == "U")			return (lire_couleur_maillon_urbain(etat));
	
	return(GRIS_MAILLON);	
}

/**
 * Retourne une constante de la couleur en fonction de l'état d'un maillon de rocade
 * @param etat, - string -	FREEFLOW / HEAVY / CONGESTED / UNKNOWN
 * @return - CONSTANT string - VERT_MAILLON / ORANGE_MAILLON / ROUGE_MAILLON / GRIS_MAILLON (aussi si etat null ou pas dans la liste)
 */
function lire_couleur_maillon_rocade(etat)
{
	if(etat == "FREEFLOW")	 	return(VERT_MAILLON);
	if(etat == "HEAVY")		 	return(ORANGE_MAILLON);
	if(etat == "CONGESTED")	 	return(ROUGE_MAILLON);
	if(etat == "UNKNOWN")	 	return(GRIS_MAILLON);
	
	return(GRIS_MAILLON);	
}

/**
 * Retourne une constante de la couleur en fonction de l'état d'un maillon urbain
 * @param etat - string - FREEFLOW / DENSE / HEAVY / CONGESTED / UNKNOWN
 * @return  - CONSTANT string - VERT_MAILLON / ORANGE_MAILLON / ROUGE_MAILLON / NOIR_MAILLON / GRIS_MAILLON (aussi si etat null ou pas dans la liste)
 */
function lire_couleur_maillon_urbain(etat)
{
	if(etat == "FREEFLOW")		return(VERT_MAILLON);
	if(etat == "DENSE")			return(ORANGE_MAILLON);	
	if(etat == "HEAVY")			return(ROUGE_MAILLON);
	if(etat == "CONGESTED")		return(NOIR_MAILLON); 
	if(etat == "UNKNOWN")		return(GRIS_MAILLON); 
	return(GRIS_MAILLON);	
}

/**
 * Attribut la couleur grise (GRIS_MAILLON) à la liste de maillons fournis
 * @param table_maillons
 * @return
 */
function griser_maillons_rocade(table_maillons)
{
	var doc;
	var N;
	var maillon_xml;
	
	if(mode_SVG)		doc = getSVGDoc("Calque_1");		// acces au document SVG (actuellement repere par une balise <embed id="..."> )
	else 				doc = getVMLDoc("Calque_1");		// VML : acces au document VML (actuellement dans une Iframe )
	
	N = table_maillons.length;
	for(i=0; i<N; i++)		{
		maillon_xml = table_maillons[i];
		if(maillon_xml.type.toUpperCase() == 'R')	{
			nom_maillon = maillon_xml['id'];
			changer_couleur_maillon(doc, nom_maillon, GRIS_MAILLON);
		}
	}
}