var map;
var Markers = new Array();
var TableCorrespondance = new Array();
var elemactifs = new Array();
var cata;
var ida;
var villea;
var sauveHTML;

// TODO : rendre dynamique
var TableCategories = new Array("","TravauxD", "Travaux", "GDChantiers");
var TableCategoriesActives = new Array(true,true, true, true);

var TableLieus = new Array("Toulouse", "Blagnac");
var TableLieusActifs = new Array(true, true);

/*var guid_detail = "marker_http://cg46.systonic.com/default.asp?id=";*/
var guid_detail = "marker_http://cg46/default.asp?id=";
var zoomdefaut = 9;
var centredefaut = new GLatLng(44.448487178796235,1.437835693359375);
/////////////////////////////////////////////////////////

//utilisation du filtre par lieu
var filtreLieu = true;

//utilisation du filtre par categorie
var filtreCat = true;

var nbmarkers;

var sourcexml;
var sourcexslt;

//Affichage Carto
function  LoadCartoGeoRSS (urlxml)
{


  	if (GBrowserIsCompatible())
	{	
	 
	
        var mapTypes = [];
        mapTypes.push(G_NORMAL_MAP);
		mapTypes.push(G_SATELLITE_MAP);	 
        mapTypes.push(G_PHYSICAL_MAP);	  		
	   
	    map = new GMap2(document.getElementById("map"),{mapTypes:mapTypes});	
		  
       //map = new GMap2(document.getElementById("map"));

       map.setCenter(centredefaut, zoomdefaut);  // TODO : Recuperer le 1er point et le zoom en fonction du "bounds"(?)
       
	   map.addControl(new GLargeMapControl());
       map.addControl(new GMapTypeControl());
	   map.enableContinuousZoom()
	   map.enableScrollWheelZoom()

	   //map.addMapType(G_PHYSICAL_MAP); 
	   
	  
	   //Appel flux GeoRSS via Ajax et lancement des traitements si succes
	  new Ajax.Request(urlxml, {method: 'get', onSuccess: traitement});		

	  map.setMapType(G_NORMAL_MAP); 
	  

	  

	      
	} 
}


function ChargeKML (murl)
{
    geoXml = new GGeoXml(murl);
	map.addOverlay(geoXml);		
}



//Traitement
function traitement (obj) 
{
	
	//mise a jour de la variable globale
	sourcexml = obj.responseXML;

	//Appel serveur pour recup xslt
	GDownloadUrl("rss.xslt", function(data, responseCode) 
	{ 
	  	sourcexslt = GXml.parse(data); 
	
		//traitement liste
		trasnformeRSS (sourcexml, "listeActu");

		//traitement carto
		PositionneGeoPoints (sourcexml);
		
		
		
		if (ida!="")
			GoFiche2(ida);
		else if (cata!="")
		{
			MajTisseoCat(cata);
		}
		else if (villea!="")
		{			
			MajTisseoLieu(villea);
		}



	});



}



//retourne XLST qui transforme le flux GeoRSS - obsolete
function RecupXSLT()
{
	var xmlStrXSLT = "<?xml version=\"1.0\" encoding=\"utf-8\"?><xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"><xsl:template match=\"/rss\"><div class=\"channel\"><xsl:for-each select=\"channel/item\"><div class=\"item\" id=\"marker_{guid}\" onmouseover=\"itemover(this.id)\"   onmouseout=\"itemout(this.id)\"><div class=\"title\"><xsl:element name=\"a\"><xsl:attribute name=\"href\"><xsl:value-of select=\"link\"/>ssss</xsl:attribute><xsl:value-of select=\"title\"/></xsl:element></div><div class=\"description\"><xsl:value-of select=\"description\" disable-output-escaping=\"yes\" /></div><div class=\"pubDate\"><xsl:value-of select=\"pubDate\" /></div></div></xsl:for-each></div></xsl:template></xsl:stylesheet>";		
	var d = new DOMParser();
	var xS = d.parseFromString(xmlStrXSLT, "text/xml");
	if(Sarissa.getParseErrorText(xS) != Sarissa.PARSED_OK) return alert(Sarissa.getParseErrorText(xS));
	return xS;
} 



//Transformation XSLT et mise a jour de la liste
function trasnformeRSS(docxml, idliste)
{	
	//Sarissa.updateContentFromURI(sFromUrl, oTargetElement, xsltproc, callback, skipCache);

	var xsltProc  = new XSLTProcessor();
	
	//xsltDoc = RecupXSLT();		
   	//xsltProc.importStylesheet(xsltDoc);	   
	
	xsltProc.importStylesheet(sourcexslt);	   
		
	var fragment = xsltProc.transformToFragment(docxml, document);
	$(idliste).innerHTML = "";
	$(idliste).appendChild(fragment);	
	
	sauveHTML = $(idliste).innerHTML;
}	

//Retourne la valeur d'un noeud donne
function getValeur(node)
{


	var texte = node.textContent;	  			  
	//Bug IE - il ne connait pas textContent
	 if (!texte)
  	{			  
		 texte = node.text;
	}
	return texte;
}



//Fonction de Postionnement des points a partir d'un flux GEORSS
function PositionneGeoPoints (xml)
{	
	var items = xml.documentElement.getElementsByTagName("item"); 
	var bounds = new GLatLngBounds;
	nbmarker = items.length;
	
	for (var i = 0; i < items.length; i++) 
	{	
		//Recuperation des donnees du flux XML  // TODO passer par fonction xPath
		
		var guid = getValeur(items[i].getElementsByTagName("guid")[0]);
		var titre = getValeur(items[i].getElementsByTagName("title")[0]);
		var texte = getValeur(items[i].getElementsByTagName("description")[0]);
		var lien = getValeur(items[i].getElementsByTagName("link")[0]);	
		var categorie = getValeur(items[i].getElementsByTagName("category")[0]);
		var alerte = getValeur(items[i].getElementsByTagName("alerte")[0]);
		
		if (items[i].getElementsByTagName("featurename").length>0)		
			var lieu = getValeur(items[i].getElementsByTagName("featurename")[0]);	
		else
			var lieu = getValeur(items[i].getElementsByTagName("georss:featurename")[0]);			
		
		if (items[i].getElementsByTagName("lat").length>0)		
			var latitude = getValeur(items[i].getElementsByTagName("lat")[0]);	
		else
			var latitude = getValeur(items[i].getElementsByTagName("geo:lat")[0]);	
				
			
		if (items[i].getElementsByTagName("long").length>0)
			var longitude = getValeur(items[i].getElementsByTagName("long")[0]);	
		else
			var longitude = getValeur(items[i].getElementsByTagName("geo:long")[0]);	
		
		if (alerte == "1"){
			picto = GetPicto("alerte", "");
		}else{
			picto = GetPicto(categorie, "");
		}
			
		var point = new GLatLng(parseFloat(latitude),  parseFloat(longitude));		

		var id = "marker_" + guid ;
		
		//Agrandissement de la zone en fonction des points
		bounds.extend(point);		  
		
		//incrementation du tableau de marqueur pour l'interactivite
		
		Markers[i]=createMarker(point, texte, picto, id);				
	
		TableCorrespondance[i] = id;
		elemactifs[i] = id;
	
		TableCategories[i] = categorie;
		TableLieus[i] = lieu;		

		//Affichage du point sur la carte
		map.addOverlay(Markers[i]);			
	 }		 		  

	//determination du centre du rectangle
	//map.setCenter(bounds.getCenter());		
			
	//determination du zoom en fonction de la taille du rectangle
	//var newzoom = map.getBoundsZoomLevel(bounds);		  
	//map.setZoom(newzoom);			
		
	//affichage des points dans la carte
	//map.addOverlay(Markers);	
}

function getMarker(id)
{	
	return Markers[TableCorrespondance.indexOf(id)]; 
}

function GoFiche2(pk_actualite)
{
	var iddiv = guid_detail + pk_actualite;

	GoFiche (iddiv);
	$("listeActu").hide();
	$("detailActu").show();

}


function suivant(id)
{
	ide = elemactifs.indexOf(id);
	s = ide + 1;
	if (s>elemactifs.length-1) s = 0;
	ids = elemactifs[s];
	GoFiche(ids);
	//Effect.SlideDown('detailActu');
}

function precedent(id)
{
	ide = elemactifs.indexOf(id);
	p = ide - 1;
	if (p<0) p = elemactifs.length-1;
	idp = elemactifs[p];	
	GoFiche(idp);
	//Effect.SlideDown('detailActu');

}

function GoFiche(id)
{
	index = TableCorrespondance.indexOf(id);
	var mtemp = getMarker(id);        
	map.panTo(mtemp.getLatLng());             
	var noeud = sourcexml.documentElement.getElementsByTagName("item")[index];
	var xsltProc  = new XSLTProcessor();     
	xsltProc.importStylesheet(sourcexslt);      
	var str = new XMLSerializer().serializeToString(noeud) ;
	var domd = new DOMParser().parseFromString(str, "text/xml");
	var fragment = xsltProc.transformToFragment(domd, document);
	var newDocument = xsltProc.transformToDocument(domd);
	$("detailActu").innerHTML = "";
	if (!newDocument.documentElement)
	{                                              
		$("detailActu").appendChild(fragment);                                   
	}
	else
	{
		if (newDocument.documentElement.innerHTML)
		{
			contenuFF = newDocument.documentElement.innerHTML;
			contenuFF = Remplace(contenuFF,"&lt;","<");
			contenuFF = Remplace(contenuFF,"&gt;",">");
			$("detailActu").innerHTML = contenuFF;			
		}
		else
		{
			$("detailActu").appendChild(fragment);  
		}
		

			
	}
}


function goListe ()
{
	$("listeActu").show();
	$("detailActu").hide();
}

//Evenement click
function  itemclick(id)
{	
	ide = elemactifs.indexOf(id)

	
	var mtemp = getMarker(id);
	
	mtemp.closeInfoWindow();

	
	cat = getValeur(sourcexml.documentElement.getElementsByTagName("item")[ide].getElementsByTagName("category")[0]);		

	alerte = getValeur(sourcexml.documentElement.getElementsByTagName("item")[ide].getElementsByTagName("alerte")[0]);

	
	if (alerte == "1"){mtemp.setImage(GetPicto("alerte", "over"));}else{mtemp.setImage(GetPicto(cat, "over"));};
	
	itemout(id)
		
	GoFiche(id);
	
		
	$("listeActu").hide();
	$("detailActu").show();
}


//Evenement Over
function  itemover(id)
{	
	
	var mtemp = getMarker(id);
	if (mtemp)
	{	
		ide = TableCorrespondance.indexOf(id)
		map.panTo(mtemp.getLatLng());		
		cat = getValeur(sourcexml.documentElement.getElementsByTagName("item")[ide].getElementsByTagName("category")[0]);
		alerte = getValeur(sourcexml.documentElement.getElementsByTagName("item")[ide].getElementsByTagName("alerte")[0]);
		if (alerte == "1"){mtemp.setImage(GetPicto("alerte", "over"));}else{mtemp.setImage(GetPicto(cat, "over"));};	
		$(id).style.background = "#8ac2e5";
		$(id).style.cursor = "pointer";		
	}
}

//Evenement Out
function  itemout(id)
{	
	var mtemp = getMarker(id);
	if (mtemp)
	{
		ide = TableCorrespondance.indexOf(id)
		cat = getValeur(sourcexml.documentElement.getElementsByTagName("item")[ide].getElementsByTagName("category")[0]);
		alerte = getValeur(sourcexml.documentElement.getElementsByTagName("item")[ide].getElementsByTagName("alerte")[0]);
		if (alerte == "1"){mtemp.setImage(GetPicto("alerte", "out"));}else{mtemp.setImage(GetPicto(cat, "out"));};
		$(id).style.background = "white";
	}
}

//Afficher tous les points
function showALL ()
{

	elemactifs.clear();
	
	//Parcours de tous les points
	for (var i = 0; i < Markers.length; i++) 
	{		
		
		Markers[i].show();
		$(TableCorrespondance[i]).show();
		TableLieusActifs[i] = true;
		TableCategoriesActives[i] = true;
		
		elemactifs.push(TableCorrespondance[i]);
	}		
}


//Afficher tous les points
function CacheALL ()
{

	elemactifs.clear();
	
	//Parcours de tous les points
	for (var i = 0; i < Markers.length; i++) 
	{		
		
		Markers[i].show();
		$(TableCorrespondance[i]).hide();
		TableLieusActifs[i] = false;
		TableCategoriesActives[i] = false;
	}		
}



//reinitialisation etat table lieu avec valeur passe en prametre - utile lorsqu'on ne veut pas de filtre croise
function ReInitLieu (val)
{		
	for (var i = 0; i < TableLieusActifs.length; i++) 	
	{
		TableLieusActifs[i] = val;
	}
}

//reinitialisation etat table categorie avec valeur passe en prametre - utile lorsqu'on ne veut pas de filtre croise
function ReInitCat (val)
{
	for (var i = 0; i < TableCategoriesActives.length; i++) 
	{
		TableCategoriesActives[i] = val;	
	}
}




//retourne vrai si le lieu passe en parametre est actif
function LieuActif (mlieu)
{
	if (filtreCat)
		return TableLieusActifs[TableLieus.indexOf(mlieu)];
	else
		return true;
}

//retourne vrai si la categorie passe en parametre est active
function CatActif (mcat)
{
	if (filtreLieu)
		return TableCategoriesActives[TableCategories.indexOf(mcat)];
	else
		return true;
}

//Active le lieu et recharge la carto
function ActiveLieu (mlieu)
{
	TableLieusActifs[TableLieus.indexOf(mlieu)] = true;
}

//Active la categorie et recharge la carto
function ActiveCategorie (mcat)
{
	TableCategoriesActives[TableCategories.indexOf(mcat)] = true;
}





function ReinitCarto()
{

	//$("listeActu").innerHTML = sauveHTML;

	elemactifs.clear();

	
	//Parcours de tous les points
	for (var i = 0; i < Markers.length; i++) 
	{
		if (CatActif(TableCategories[i]) && LieuActif(TableLieus[i]))
		{
			elemactifs.push(TableCorrespondance[i]);
			Markers[i].show();
			$(TableCorrespondance[i]).show();
			$(TableCorrespondance[i]).style.display="block";			
		}
		else
		{
			Markers[i].hide();
			$(TableCorrespondance[i]).hide();			
			$(TableCorrespondance[i]).style.display="none";
		}
	}

	goListe ();
}



// retourne le picto en fonction de la categorie
function GetPicto(categorie, tp)
{
	if(tp=="over")
		return "design/pictos/" + categorie + "_over.png";
	else
		return "design/pictos/" + categorie + ".png";
}



// placement un point sur la carto + layer sur mouseover
function createMarker(point, texte, picto, id) 
{        
    var icon = new GIcon();	
	icon.image = picto; 	
	icon.iconSize = new GSize(38, 38);		
	icon.iconAnchor = new GPoint(15, 20);
	icon.infoWindowAnchor = new GPoint(10, 5);
    var marker = new GMarker(point, icon);
	
	texte = $(id).innerHTML;

	texte = "<div class='popgoogle' style='width:200px'>" + texte + "</div>"
	
	GEvent.addListener(marker, "mouseover", function () {itemover(id);});  
    
    GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(texte);});
			
    GEvent.addListener(marker, "mouseout", function() { itemout(id); });
	
    return marker;
}

function Remplace(expr,a,b) 
{
	var i=0
	while (i!=-1) 
	{
		i=expr.indexOf(a,i)
		if (i>=0) 
		{
			expr=expr.substring(0,i)+b+expr.substring(i+a.length)
			i+=b.length
		}
	}
	return expr
}
