// making this a global variable so that it is accessible for
// debugging/inspecting in Firebug
var map = null;
var gclayers = null;
var toolbarPanel;
var navHistory;

//Parser WMC
var parserWMC = new OpenLayers.Format.WMC({'layerOptions': {buffer: 0,ratio: 1}});

//Proxy (nécessaires pour les WFS)
//OpenLayers.ProxyHost = contextPath+"/cgi-bin/proxy.cgi?url=";
OpenLayers.ProxyHost = contextPath+"/MapbuilderProxy.jsp?url=";

// BBox du Monde
var bounds = new OpenLayers.Bounds(-180,-90,180,90);

/** NOTE : TOUTE LA FONCTION initialisationCarto EST MAINTENANT INUTILE, ELLE EST CREEE AUTOMATIQUEMENT VIA reloadWMC.jsp, UN JSP INCLU DANS LA PAGE viewer.jsp **/
//function initialisationCarto(){
//
//	OpenLayers.Lang.setCode(language);
//
//	redimensionnement();
//    
//	map = new OpenLayers.Map('carte', {
//		controls: [],
//       	numZoomLevels: 1024,
//       	theme: null
//   });
//   
//   // Creation du tableau des informations sur les couches provenant du getCapabilities
//   gclayers = new Array();
//
//    var baselayer_wms = new OpenLayers.Layer.WMS(
//        "BMNG",
//        "http://mapsone.brgm.fr/bmng?map=/applications/mapserver/mapFiles/bmng.map",
//        {layers: 'bmng'}, 
//        {'isBaseLayer':true,
//    	 'singleTile':true}
//    );
//
//    // Events pour affichage de l etat de chargement
//    baselayer_wms.events.register( 'loadstart' , null , map_layer_loadstart );
//    baselayer_wms.events.register( 'loadend'   , null , map_layer_loadend   );
//    map.addLayer(baselayer_wms);
//
//    map_addControls();
//
//    map.zoomToMaxExtent()
//    
//}

function map_addControls(){
	map.addControl(new OpenLayers.Control.MousePosition({'div':OpenLayers.Util.getElement('positionSouris'),'numDigits':2}));
    map.addControl(new OpenLayers.Control.ScaleBar({'div':OpenLayers.Util.getElement('barreDEchelleGraphique'),'divisions':4,'singleLine':true,'minWidth':100,'maxWidth':150}));
	map.addControl(new OpenLayers.Control.Scale('barreDEchelleNumeriqueContenu'));
	map.addControl(new OpenLayers.Control.OverviewMap({'div':OpenLayers.Util.getElement('VueDEnsemble_Carte'),'mapOptions':{theme: null,numZoomLevels: 1,maxExtent: bounds,restrictedExtent: bounds}}));
	map.addControl(new OpenLayers.Control.LayerSwitcher({'div':OpenLayers.Util.getElement('ALP_Contenu'),'ascending':false}));

	navHistory = new OpenLayers.Control.NavigationHistory();
	map.addControl(navHistory);
	
	// Bouton information dans la toolbar
    var informationTB = new OpenLayers.Control.QueryTool();
    informationTB.displayClass = 'olControlInformation';
	
	// Bouton Reload dans la toolbar
	var reloadTB = new OpenLayers.Control({
		type: OpenLayers.Control.TYPE_BUTTON,
		trigger: function() {
			map_reloadalllayers(); 
	    },
		displayClass: "olControlReload"
    }); 
	
	// ToolBar haut de carte
	toolbarPanel = new OpenLayers.Control.Panel({div: document.getElementById("buttonbar")});
	toolbarPanel.addControls([
	                          new OpenLayers.Control.ZoomBox(), 
	                          new OpenLayers.Control.ZoomBoxOut(), 
	                          new OpenLayers.Control.ZoomToMaxExtent(),
	                          new OpenLayers.Control.Navigation(), 
	                          navHistory.previous, navHistory.next, 
	                          reloadTB,
	                          informationTB
	                          ]);
	map.addControl(toolbarPanel);
	toolbarPanel.activateControl(toolbarPanel.controls[0]);
	
	map_addEvents();
	
	// Suppression de la destruction à la sortie, pour éviter de casser le reload (en effet sous IE et moindre mesure sous FF, lors du rechargement, sur l'event unload, les couches sont supprimées et entrainent la sauvegarde de WMC erronnées)
	map.unloadDestroy = null;
}

function map_removeEvents(){
	map.events.remove("addlayer");
	map.events.remove("changelayer");
	map.events.remove("removelayer");
	map.events.remove("moveend");
	map.events.remove("zoomend");
}
function map_addEvents(){
	map.events.on({
        "addlayer": this.map_callSaveContext,
        "changelayer": this.map_callSaveContext,
        "removelayer": this.map_callSaveContext,
        "moveend": this.map_callSaveContext,
        "zoomend": this.map_callSaveContext,
        scope: this
    });
}

/**
 * Sauvegarde le WMC en session
 * @return
 */
function map_callSaveContext(){
	var wmc = "wmc="+escape(parserWMC.write(map, {'gclayers':gclayers}));

	var xhr= getXMLHttpRequest();
	xhr.open("POST",  host+"/context?request=saveContext"+getHash(), true);
	xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
   	xhr.send(wmc);
}

/**
 * Switch la visibilite de la couche : visible/cachee
 * @param id
 * @return
 */
function switchLayerVisibility(id){
	var curLayer = map.layers[id];
	curLayer.setVisibility(! curLayer.getVisibility());
}

function map_resizeLayerSwitcherIfNeeded(){
	var windowHeight = getWindowHeight(); windowHeight += 15;
	var LSMaxSize = windowHeight - 127 - ( 51 + 32 ); // (le 32 provient de la taille du footer)
	var LSOffset = $('LayersDiv').offsetHeight;
	var newLSSize = Math.min( LSOffset , LSMaxSize );
	// alert( LSMaxSize + " / " + LSOffset + " /" + newLSSize );
	$('ALP_Contenu').style.height = newLSSize + "px";
}

/**
 * Switch la visibilite du menu des options etendues dans le layerswitcher
 * @param id
 * @return
 */
function switchLayerExtendedOptions(id){
	var lEOStyle = $('layerExtendedOptions_' + id ).style;
	if( lEOStyle.display != "block" ){
		lEOStyle.display = "block";
		$('switchLayerExtendedOptions_' + id ).src = "theme/img/fleche_boite_ouvert.gif";
	} else {
		lEOStyle.display = "none";
		$('switchLayerExtendedOptions_' + id ).src = "theme/img/fleche_boite_ferme.gif";
	}
	map_resizeLayerSwitcherIfNeeded();
}

/**
 * Deplace de layer dans la liste des layers
 * @param id
 * @param sens
 * @return
 */
function moveLayer(id,sens){
	map.raiseLayer(map.layers[id],sens);
}

/**
 * Supprimer le layer de la liste des layers
 * @param id
 * @return
 */
function removeLayer(id){
	var curLayer = map.layers[id];
	var gclayer = map_getgclayerbyid(curLayer.id);
	map.removeLayer(curLayer,curLayer.isBaseLayer);
	// Décochage de la couche des différents arbres, si besoin
	var cbox = $(gclayer.uuid);
	if( cbox )
		cbox.checked = false;
	// Suppression du gclayer aussi
	if( gclayer ) // rajout d'un petit test pour être sur de ne pas supprimer quelque chose qui n'existe en fait pas
		default_deleteElemFromArrayByElem(gclayers,gclayer);
}

/**
 * Change l opacite du layer en utilisant le slider
 * @param elem
 * @param newopacity
 * @return
 */
function changeOpacityLayerBySlider(elem,newopacity){
	var id = elem.id.substring(elem.id.lastIndexOf('_')+1);
	var curLayer = map.layers[id];
	curLayer.setOpacity(newopacity / 100);
//	$('lsLayerMiniInfosOpacity-'+id).innerHTML = newopacity;
}
function changecompleteOpacityLayerBySlider(elem,newopacity){
	var id = elem.id.substring(elem.id.lastIndexOf('_')+1);
	var curLayer = map.layers[id];
	curLayer.setOpacity(newopacity / 100);
	$('lsLayerMiniInfosOpacity-'+id).innerHTML = newopacity;
}

function initSRSLabel(id){
	var projAsString = map.getProjection();
	var SRS = projAsString;
	switch(projAsString){
		case "EPSG:4326":
			SRS = "WGS 84";
			break;
		case "EPSG:27582":
			SRS = "Lambert 2";
			break;
	}
	$(id).innerHTML = SRS;
}

/**
 * Affiche/Cache la vue d ensemble (minimap)
 * @return
 */
function RestoreReduceVDE(){
	var isReduce = ( $('VueDEnsemble_Carte').style.display == "block" );
	
	$('VueDEnsemble_Carte').style.display = isReduce ? "none" : "block";
	$('VDEReduire').style.display = isReduce ? "none" : "inline";
	$('VDERestaurer').style.display = isReduce ? "inline" : "none";
}
/**
 * Affiche/Cache la liste des couches actives
 * @return
 */
function map_RestoreReduceALP(){
	var isReduce = ( $('ALP_Contenu').style.display == "block" );
	
	$('ALP_Contenu').style.display = isReduce ? "none" : "block";
	$('ALPReduire').style.display = isReduce ? "none" : "inline";
	$('ALPRestaurer').style.display = isReduce ? "inline" : "none";
	
	// Attention, ceci n'est qu'une bidouille pour contouner un bug de ExtJS qui fait que les Sliders ne sont pas
	// bien initialisés (et même buggués) quand on les fabrique dans un conteneur étant display:none
	// Donc ici, on supprime les existants (qui ont des chances d'être buggés)
	// et on les refait une fois la fenêtre visible
	if( !isReduce ){
		var layers = this.map.layers.slice();
        if (!this.ascending) { layers.reverse(); }
		for(var i=0, len=map.layers.length; i<len; i++) {
			var vraii = layers.length - ( i + 1 );
            var layer = layers[i];
            var baseLayer = layer.isBaseLayer;

            if (layer.displayInLayerSwitcher && !layer.isBaseLayer) {
            	// On supprime le Slider avant de le recréer
            	$('opacitySlider_'+vraii).innerHTML = '';
            	// On recréé le Slider
				var sliderValue = layer.opacity * 100;
				new Ext.Slider({
					id: 'opacitySlider_slider_'+vraii+'',
			        renderTo: 'opacitySlider_'+vraii+'',
			        width: 120,
			        value: sliderValue,
			        increment: 10,
			        minValue: 0,
			        maxValue: 100,
			        plugins: new Ext.ux.SliderTip(),
			        listeners: { change : changeOpacityLayerBySlider,  changecomplete : changecompleteOpacityLayerBySlider}
			    });
//				$("layerExtendedOptions_"+vraii).style.display = "none";
            }
        }
	}
	map_resizeLayerSwitcherIfNeeded();
}

/**
 * Dirige la vue carte sur le pays selectionne
 * @param country
 * @return
 */
function goToExtentCountry(country){
	if (country != 'selectCountry'){
		var projAsString = map.getProjection();

		var p1 = new OpenLayers.Geometry.Point(countryList[country].minX, countryList[country].minY);
		var p2 = new OpenLayers.Geometry.Point(countryList[country].maxX, countryList[country].maxY);
		var q1 = OpenLayers.Projection.transform(p1, new OpenLayers.Projection('WGS84'), new OpenLayers.Projection(projAsString));
		var q2 = OpenLayers.Projection.transform(p2, new OpenLayers.Projection('WGS84'), new OpenLayers.Projection(projAsString));

		var bounds = new OpenLayers.Bounds(q1.x, q1.y, q2.x, q2.y);
	
		map.zoomToExtent(bounds, false);
	}
	document.getElementById("gotoInput").options[0].selected = true;
}

/**
 * VERIFIER LES APPELANTS DE CETTE FONCTION (SUPPRESSION DU PARAMETRE)
 * @return
 */
function map_saveWMC(){
	var wmc = parserWMC.write(map, {'gclayers':gclayers});
	$('savecontextforminputwmc').value = wmc;
	$('savecontextforminputfilename').value = $('inputSaveWMC').value;
	document.savecontextform.submit();
	
	openSaveWMCWindow();
}

function map_saveKML(){
	var wmc = parserWMC.write(map, {'gclayers':gclayers});
	$('savekmlforminputwmc').value = wmc;
	$('savekmlforminputfilename').value = $('inputSaveKML').value;
	document.savekmlform.submit();
	
	openSaveKMLWindow();
}

/**
 * VERIFIER UTILITE ET SUPPRIMER LE CAS ECHEANT
 * @return
 */
function loadAndReadWMC() { 
	var wmc = document.getElementById("inputLoadWMC").files.item(0).getAsBinary();
	
 	readWMC(wmc);                    
}

/**
 * VERIFIER UTILITE ET SUPPRIMER LE CAS ECHEANT
 * @param wmc
 * @return
 */
function readWMC(wmc){
	
	// On envoie le WMC à la session et on recharge la page
	// Envoie du WMC
	var xhr= getXMLHttpRequest();
	xhr.open("POST",  host+"/context?request=saveContext"+getHash(), true);
	xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
   	xhr.send(wmc);	
   	// rechargement de la page
   	window.location=host+"/viewer.jsp";
   	
   	/*
	
	// Si une carte existe, on la détruit
	if (map){
		map.events.remove("addlayer");
		map.events.remove("changelayer");
		map.events.remove("removelayer");
		map.events.remove("moveend");
		map.events.remove("zoomend");

		map.destroy();
	}

	try {
      	map = parserWMC.read(wmc, {map: 'carte'});
		map_initGcLayer();
      	map_addControls();
    } catch(err) {
		alert(err);
		window.location=host+"/viewer.jsp";
    }
    document.getElementById("inputLoadWMC").value="";
    openLoadWMCWindow();
	map_callSaveContext();
	*/
}

/**
 * VERIFIER UTILITE ET SUPPRIMER LE CAS ECHEANT
 * @param wmc
 * @return
 */
function DELETE_readWMCFromSearch(wmc){
	// on est pas sur la carte, on y va
	gotoOnglet('zcoMapViewer');
	
	// Si une carte existe, on la détruit
	if (map)
		map.destroy();
	
	try {
		OpenLayers.Lang.setCode(language);
		initCountryList();
		redimensionnement();

    	map = parserWMC.read(wmc, {map: 'carte'});

		map_initGcLayer();

      	map_addControls();
    } catch(err) {
		alert(err);
		window.location=host+"/viewer.jsp";
    }
    document.getElementById("inputLoadWMCFromSearch").value="";
}

/**
 * VERIFIER UTILITE ET SUPPRIMER LE CAS ECHEANT
 * @param name
 * @return
 */
function readWMCFromServer(name){
	var n = 'f' + Math.floor(Math.random() * 99999);
	var d = document.createElement('DIV');
	d.innerHTML = '<iframe style="display:none" src="wmc/'+name+'" id="'+n+'" name="'+n+'" onload="AIM.loaded(\''+n+'\')"></iframe>';
	document.body.appendChild(d);
	
	var i = document.getElementById(n);
	i.onComplete = readWMCFromSearch;
}

/**
 * Pour un layer, switch entre layer queryable et layer not queryable, et leve un event
 * @param id
 * @return
 */
function map_switchlayerqueryability(id){
	var curLayer = map.layers[id];
	curLayer.queryable = !curLayer.queryable;
	map.events.triggerEvent("changelayer", {
        layer: curLayer, property: "queryable"
    });
}

function map_initGcLayer(){
	// On refait une liste complémentaire de couches
	gclayers = new Array();
	// On remplit cette liste complémentaire
	for( var i = 0 ; i < map.getNumLayers() ; i++ ){
		
		var curLayer = map.layers[i];
		
		// Representation interne du layer dans tel que defini dans le getcapabilities
	    var keywordslist = new Array();
	    // ajouter le code pour remplir la liste des mots clefs
	    var srslist = new Array();
	    // ajouter le code pour remplir la liste des srs
	    var styleslist = new Array();
	    
	    var gcLayer = { 
	    		id: curLayer.id,
	    		gcloaded: false,
	    		queryable: null,
	    		opaque: null,
	    		cascaded: null,
	    		name: curLayer.params.LAYERS,
	    		title: curLayer.name,
	    		summary: "",
	    		keywords: keywordslist,
	    		srs: srslist,
	    		latlonbbox: null,
	    		scalehints: '',
	    		styles: styleslist
	    };
	    gclayers.push(gcLayer);

		loadJSON(host+"/capabilitiesControler?method=getCapabilitiesLayer&serverUrl="+curLayer.url+"&layerName="+curLayer.params.LAYERS+"&layerId="+curLayer.id+getHash(),  map_setgclayer);		
	}
}

/**
 * Ajoute un layer a la carte, en creant automatiquement son gclayer associe permettant de recuperer des informations dans le getcapabilities
 * @param _title
 * @param _url
 * @param _name
 * @param _hidden
 * @return
 */
function map_addLayerOGC(_title,_url,_name,_hidden,_uuid,_serverTitle){
	var _visibility = true;
	if(_hidden)
		_visibility = false;
	
    var wmsToAdd = new OpenLayers.Layer.WMS(
            _title,
            _url,
            {layers: _name, transparent: 'TRUE' }, 
            {'singleTile':true,'opacity':1.0,'visibility':_visibility,'queryable':true,'ratio':1}
        );
    
    // Events pour affichage de l etat de chargement
    wmsToAdd.events.register( 'loadstart' , null , map_layer_loadstart );
    wmsToAdd.events.register( 'loadend'   , null , map_layer_loadend   );
    
    
    map.addLayer(wmsToAdd);
    
    // Representation interne du layer dans tel que defini dans le getcapabilities
    var keywordslist = new Array();
    // ajouter le code pour remplir la liste des mots clefs
    var srslist = new Array();
    // ajouter le code pour remplir la liste des srs
    var styleslist = new Array();
    
    var gclayer = { 
    		id: wmsToAdd.id,
    		gcloaded: false,
    		queryable: null,
    		opaque: null,
    		cascaded: null,
    		name: _name,
    		title: _title,
    		summary: "",
    		keywords: keywordslist,
    		srs: srslist,
    		latlonbbox: null,
    		scalehints: '',
    		styles: styleslist,
    		serverTitle: _serverTitle
    };
    if( _uuid )
    	gclayer.uuid = _uuid;
    gclayers.push(gclayer);
    
    // MAJ du LayerSwitcher
    // ID de la couche à modifier
    var idx = map.getLayerIndex(map.getLayer(wmsToAdd.id));
    // ServiceTitle
    if( gclayer.serverTitle != null ){
    	var lsservicetitlelink = $('ls-servicetitlelink-'+idx);
    	if( lsservicetitlelink ){
    		lsservicetitlelink.innerHTML = gclayer.serverTitle;
    		lsservicetitlelink.className = "";
    	}
    }
    
    loadJSON(host+"/capabilitiesControler?method=getCapabilitiesLayer&serverUrl="+_url+"&layerName="+_name+"&layerId="+wmsToAdd.id+getHash(),  map_setgclayer);
}

/**
 * Utilisation d'un tableau tabLayersCatalog (voir par exemple layerTree.jsp) construit depuis le catalogue ou par chargement d'un WMC. 
 * voir la classe Layer.getStrTab() pour le contenu.
 */
function map_addLayerCatalogOrWMC(layer){
	
	var _isBaseLayer = false;
	if( layer['isOLBaseLayer'] == 'true')
		_isBaseLayer = true;;
	
	var _visibility = true;
	if(layer['visibility'] == 'false')
		_visibility = false;

	var _queryable = true;
	if(layer['queryable'] == 'false')
		_queryable = false;		
	
	var _gcqueryable = false; 
    if(layer['gcqueryable'] == 'true') 
        _gcqueryable = true; 
	
	var _opacity = 1.0;
	if( layer['opacity'] != "null")
		_opacity = layer['opacity'];
	
    var wmsToAdd = new OpenLayers.Layer.WMS(
            layer['title'],//titre
            layer['serverUrl'],//url
            {layers: layer['name']//name
            	, transparent: 'TRUE'	}, 
            {'isBaseLayer':_isBaseLayer, 'singleTile':true,'opacity':_opacity,'visibility':_visibility,'queryable':true,'ratio':1}
        );
    
    // Events pour affichage de l etat de chargement
    wmsToAdd.events.register( 'loadstart' , null , map_layer_loadstart );
    wmsToAdd.events.register( 'loadend'   , null , map_layer_loadend   );
    
    // Representation interne du layer dans tel que defini dans le getcapabilities
    var keywordslist = new Array();
    // ajouter le code pour remplir la liste des mots clefs
    var srslist = new Array();
    // ajouter le code pour remplir la liste des srs
    var styleslist = new Array();
    
    var extentArray = layer['extent'].split(';');
    var extentBbox = new OpenLayers.Bounds(extentArray[0],extentArray[1],extentArray[2],extentArray[3]);
    
    var gclayer = { 
    		id: wmsToAdd.id,
    		uuid: layer['id'],
    		gcloaded: false,
    		queryable: _gcqueryable, 
    		opaque: null,
    		cascaded: null,
    		name: ( layer['name'] == "null" ) ? null : layer['name'],
    		title: ( layer['title'] == "null" ) ? null : layer['title'],
    		summary: ( layer['description'] == "null" ) ? null : layer['description'],
    		keywords: keywordslist,
    		srs: srslist,
    		latlonbbox: extentBbox,
    		scalehints: '',
    		owner: ( layer['owner'] == "null" ) ? null : layer['owner'],
    		provider: ( layer['provider'] == "null" ) ? null : layer['provider'],
    		accessConstraints: ( layer['accessConstraints'] == "null" ) ? null : layer['accessConstraints'],
    		dataURL: ( layer['dataURL'] == "null" ) ? null : layer['dataURL'],
    		metadataURL: ( layer['metadataURL'] == "null" ) ? null : layer['metadataURL'],
    		legendURL: ( layer['legendURL'] == "null" ) ? null : layer['legendURL'],
    		styles: styleslist,
    		serverTitle: ( layer['serverTitle'] == "null" ) ? null : layer['serverTitle'],
    		wfsURL: layer['wfsURL'],
    		wfsGeom: layer['wfsGeom'], 
			wfsSrs: layer['wfsSrs']    		
    };
    gclayers.push(gclayer);
    
    map.addLayer(wmsToAdd);
    
    // MAJ du LayerSwitcher
    // ID de la couche à modifier
    var idx = map.getLayerIndex(map.getLayer(wmsToAdd.id));
    // AccessConstraints
    if( gclayer.accessConstraints != null ){
    	var lsaccessconstraints = $('ls-accessconstraints-'+idx);
    	if( lsaccessconstraints ){
    		lsaccessconstraints.innerHTML = gclayer.accessConstraints;
    	}
    }	
//    alert(" lsaccessconstraints ");
    // Owner
    if( gclayer.owner != null ){
    	var lsownerlink = $('ls-ownerlink-'+idx);
    	if( lsownerlink ){
    		lsownerlink .innerHTML = gclayer.owner;
    		lsownerlink .className = "";
    	}
    }
//    alert(" lsownerlink ");
    // Legend
    if( gclayer.legendURL != null ){
    	var lslegendlink = $('ls-legendlink-'+idx);
    	if( lslegendlink ){
	    	lslegendlink.innerHTML = '<a class="fakeLink lsLink" onclick="openLegendsWindow('+idx+')">' + OpenLayers.i18n('lswitcherinfositemLegendDisplay') + '</a>'
	    	lslegendlink.className = "";
    	}
    }
//    alert(" lslegendlink ");
    // DataURL
    if( gclayer.dataURL != null ){
    	var lsdataurllink = $('ls-dataurllink-'+idx);
    	if( lsdataurllink ){
    		lsdataurllink .innerHTML = '<a href="'+gclayer.dataURL+'" target="_blank" class="fakeLink lsLink">' + OpenLayers.i18n('lswitcherinfositemDataURLDisplay') + '</a>';
    		lsdataurllink .className = "";
    	}
    }
//    alert(" lsdataurllink ");
    // MetadataURL
    if( gclayer.metadataURL != null ){
    	var lsmetadataurllink = $('ls-metadataurllink-'+idx);
    	if( lsmetadataurllink ){
    		lsmetadataurllink.innerHTML = '<a href="'+gclayer.metadataURL+'" target="_blank" class="fakeLink lsLink">' + OpenLayers.i18n('lswitcherinfositemMetadataDisplay') + '</a>';
    		lsmetadataurllink.className = "";
    	}
    }
//    alert(" lsmetadataurllink ");
    // ServiceTitle
    if( gclayer.serverTitle != null ){
    	var lsservicetitlelink = $('ls-servicetitlelink-'+idx);
    	if( lsservicetitlelink ){
    		lsservicetitlelink.innerHTML = gclayer.serverTitle;
    		lsservicetitlelink.className = "";
    	}
    }
//    alert(" lsservicetitlelink ");
    // WFS available
    if( gclayer.wfsURL && gclayer.wfsURL != "null" ){
    	var lswfsavailable = $('ls-wfsavailable-'+idx);
    	if( lswfsavailable ){
    		lswfsavailable.style.display = "block";
    	}
    }
//    alert(" lswfsavailable ");
    // uuid : si il y en a un on tente de cocher la case correspondant à la couche dans l'un des deux arbres
    if( gclayer.uuid ){
    	var cbox = $(gclayer.uuid);
    	if( cbox )
    		cbox.checked = true;
    }
    
    // latlonbbox
    if ( gclayer.latlonbbox ){ 
    	
    }
    
    // On léve l'événement changeLayer pour signifier qu'on a fait des modifications après l'ajout du layer
    map.events.triggerEvent("changelayer", {
        layer: wmsToAdd, property: "name"
    });
}

function map_cocheTree(){
	for( var i = 0 ; i < gclayers.length ; i++ ){
		var gclayer = gclayers[i];
	    // uuid : si il y en a un on tente de cocher la case correspondant à la couche dans l'un des deux arbres
	    if( gclayer.uuid ){
	    	var cbox = $(gclayer.uuid);
	    	if( cbox )
	    		cbox.checked = true;
	    }
	}
}

/**
 * Retourne le gclayer correspondant a l id donne en parametres
 * @param id
 * @return
 */
function map_getgclayerbyid(id){
	for( var i = 0 ; i < gclayers.length ; i++ ) {
		if( gclayers[i].id == id )
			return gclayers[i];
	}
	return false;
}

/**
 * Retourne le gclayer correspondant à l'uuid donné en paramètres
 * @param uuid
 * @return
 */
function map_getgclayerbyuuid(uuid){
	for( var i = 0 ; i < gclayers.length ; i++ ){
		if( gclayers[i].uuid == uuid )
			return gclayers[i];
	}
	return false;
}

/**
 * Supprime un layer à partir de son uuid
 * @param uuid
 * @return
 */
function map_removeLayerFromTree(uuid){
	var gclayer = map_getgclayerbyuuid(uuid);
	if( gclayer ){ // Petit test, des fois qu'on supprime une couche qui n'existe déjà plus
		var layer = map.getLayer(gclayer.id);
		map.removeLayer(layer,layer.isBaseLayer);
		default_deleteElemFromArrayByElem(gclayers,gclayer);
	}
}

function map_setgclayer(json){
	var curgcLayer = map_getgclayerbyid(json.id);
	if( curgcLayer ){
		curgcLayer.gcloaded = true;
		curgcLayer.queryable = ( json.queryable == "true" );
		var styleslist = new Array();
		var Style = {
	    		name: "null",
	    		title: "null",
	    		summary: "null",
	    		legendurl: json.legendurl 
	    };
		styleslist.push(Style);
		curgcLayer.styles = styleslist;
		curgcLayer.legendURL = json.legendurl;
		curgcLayer.latlonbbox = new OpenLayers.Bounds(json.llbboxminx, json.llbboxminy, json.llbboxmaxx, json.llbboxmaxy);
		
		var curLayer = map.getLayer(json.id);
		var curLayerIndex = map.getLayerIndex(curLayer);
		
		// Une fois qu'on a bien tout initialisé, on va mettre à jour ce qui doit être mis à jour.
		 $('ls-legendlink-' + curLayerIndex).innerHTML = '<a class="fakeLink lsLink" onclick="openLegendsWindow(\''+curLayerIndex+'\');">' + OpenLayers.i18n('lswitcherinfositemLegendDisplay') + '</a>';
		
	}
}

/**
 * Zoom jusqu a l extent de la couche id (try/catch pour gérer les extents erronnés qui font planter).
 * @param id
 * @return
 */
function map_zoomToLayerExtent(id){
	var oldBounds=map.getExtent();
	var bounds = map_getgclayerbyid( map.layers[id].id ).latlonbbox;
	try{
		map.zoomToExtent(bounds, false);
	}catch(e){
		map.zoomToExtent(oldBounds, false);
	}
}
/**
 * Fonction appelée lors du raffraichissement de la page
 * @return
 */
function map_reload(){
	var n = 'f' + Math.floor(Math.random() * 99999);
	var d = document.createElement('DIV');
	d.innerHTML = '<iframe style="display:none" src="reloadWMC.jsp" id="'+n+'" name="'+n+'" onload="AIM.loaded(\''+n+'\')"></iframe>';
	document.body.appendChild(d);
	
//	var i = document.getElementById(n);
//	i.onComplete = readWMCFromSearch;
	
/*	var xhr= getXMLHttpRequest();
	xhr.onreadystatechange = function() { map_reloadHandler(xhr); };
	xhr.open("GET",  host+"/context?request=refresh"+getHash(), true);
   	xhr.send(null);*/
}

/**
 * Fonction appelée lors du retour de la jsp context/refresh (lors d'un raffraichissement de la page)
 * @param xhr
 * @return
 */
function map_reloadHandler(xhr){
	if (xhr.readyState==4) {
		var reponse = xhr.responseText;

		if (reponse != 'NACK'){
			readWMCFromSearch(reponse);		
		}
		else{
			if (map)
				map.destroy();
			initialisationCarto();
		}
	}
}

/**
 * Recharge toute les couches (attention, actuellement on ne peut pas dire que ça marche vraiment...)
 * @return
 */
function map_reloadalllayers(){
	for(var i=0; i<map.getNumLayers(); i++){
		map.layers[i].redraw();
	}
}

/*
 * Gestion des couches en cours de chargement pour affiche d'information
 */

// Liste des couches en cours de chargement
var currentLoadingLayers = new Array();

/**
 * Fonction executee lors du demarrage du chargement d une couche ( on ajoute cette couche a la liste des couches en cours de chargement et on maj l affichage des infos)
 * @param event
 * @return
 */
function map_layer_loadstart(event){
	currentLoadingLayers.push(event.object.name);
	map_update_LoadingStatus();
	var fonctionaappeler = "map_layer_loadtimeout('"+event.object.id+"')";
	// Timer de 30 secondes, après quoi la couche est indiquée comme ne répondant peut être pas...
	setTimeout(fonctionaappeler,1000);
}

/**
 * Fonction executee lors de la fin de chargement d une couche ( on retire cette couche a la liste des couches en cours de chargement et on maj l affichage des infos)
 * @param event
 * @return
 */
function map_layer_loadend(event){
	var curLayer = event.object;
	// On met à jour la flag disant que la couche est lente ou non
	var gccurLayer = map_getgclayerbyid(curLayer.id);
	var curLayerIndex = map.getLayerIndex(curLayer);
	gccurLayer.isslow = false;
	var spanToChange = $('ls-layerisslow-' + curLayerIndex);
	if( spanToChange != null)
		spanToChange.innerHTML = '';
	// On retire la couche de la liste des couches à charger
	var tempcLL = new Array();
	for( var i = 0 ; i < currentLoadingLayers.length ; i++ ){
		if( currentLoadingLayers[i] != curLayer.name )
			tempcLL.push(currentLoadingLayers[i]);
	}
	currentLoadingLayers = tempcLL;
	map_update_LoadingStatus();
}

/**
 * Fonction executee lors d un time out sur une couche (on affiche le petit warning a cote du nom de la couche dans le layer switcher)
 * @param event
 * @return
 */
function map_layer_loadtimeout(id){
	var failedLayer = map.getLayer(id);
	if( failedLayer == null )
		return;
	var gcfailedLayer = map_getgclayerbyid(id);
	var failedLayerIndex = map.getLayerIndex(failedLayer);
	var name = failedLayer.name;
	
	gcfailedLayer.isslow = false;
	
	var tempcLL = new Array();
	for( var i = 0 ; i < currentLoadingLayers.length ; i++ ){
		if( currentLoadingLayers[i] == name ){ // La couche était encore dans les couches à charger => on indique qu'elle a peut être eu un probleme  
//			alert( name + "n'a pas répondu assez vite" );
			gcfailedLayer.isslow = true;
		} else {
			// on en profite pour mettre quand même la liste à jour en virant la couche trop longue (sinon elle va rester ad vitam eternam)
			tempcLL.push(currentLoadingLayers[i]);
		}
	}	
	currentLoadingLayers = tempcLL;
	// on met à jour l'affichage des couches en cours de chargement
	map_update_LoadingStatus();
	// on met aussi à jour l'affichage du statut de la couche
	var spanToChange = $('ls-layerisslow-' + failedLayerIndex);
	if( spanToChange != null )
		if( gcfailedLayer.isslow )
			spanToChange.innerHTML = '<img src="theme/img/attention.png" alt="'+OpenLayers.i18n('lswitcherlayerisslow')+'" title="'+OpenLayers.i18n('lswitcherlayerisslow')+'" style="margin-right:5px; height:10px;" />';
		else
			spanToChange.innerHTML = '';
}

/**
 * Fonction de MAJ de l affichage du status des couches en chargement
 * @return
 */
function map_update_LoadingStatus(){
	if( currentLoadingLayers.length > 0 ){
		$('LoadingStatus').style.display = "block";
		var outputHTML  = 'Loading...<br/>';
		for( var i = 0 ; i < currentLoadingLayers.length ; i++ ){
		    outputHTML += '<img src="theme/img/loading.gif" alt="" style="width:12px; height:12px;" /> ' + currentLoadingLayers[i] + '<br/>'; 
			$('LoadingStatus').innerHTML = outputHTML;
		}
	} else {
		$('LoadingStatus').innerHTML = "";
		$('LoadingStatus').style.display = "none";
	}
}

/**
 * Cette fonction supprime toutes les couches de la carte
 * @return
 */
function map_removeAllLayers(){
	var taille = map.layers.length;
	var cpt = taille - 1;
	while( cpt >= 0 ){
		if( ! map.layers[cpt].isBaseLayer )
			map.removeLayer(map.layers[cpt] );
		cpt --;
	}
}