// 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;
var simulatedLayers = new Array();

//Parser WMC
var parserWMC = new OpenLayers.Format.WMC({'layerOptions': {buffer: 0,ratio: 1}});

//Proxy (n�cessaires pour les WFS)
OpenLayers.ProxyHost = contextPath+"/MapbuilderProxy.jsp?url=";

function map1g_addControls(){
	map.addControl(new OpenLayers.Control.MousePosition({'div':OpenLayers.Util.getElement('positionSouris'),'numDigits':2}));
	map.addControl(new OpenLayers.Control.Scale('barreDEchelleNumeriqueContenu'));

	navHistory = new OpenLayers.Control.NavigationHistory();
	map.addControl(navHistory);
}

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
    });
}

/**
 * Switch la visibilite de la couche : visible/cachee
 * @param id
 * @return
 */
function switchLayerVisibility(id){
	var curLayer = map.layers[id];
	curLayer.setVisibility(! curLayer.getVisibility());
}

/**
 * Deplace de layer dans la liste des layers
 * @param id
 * @param sens
 * @return
 */
function moveLayer(id,sens){
	map.raiseLayer(map.layers[id],sens);
}



function initSRSLabel(id){
	var projAsString = map.getProjection();
	var SRS = projAsString;
	switch(projAsString){
		case "EPSG:4326":
			SRS = "WGS 84";
			$('4326').style.fontWeight='bold';
			$('4258').style.fontWeight='';
			$('3034').style.fontWeight='';
			break;
		case "EPSG:27582":
			SRS = "Lambert 2";
			break;
		case "EPSG:4258":
			SRS = "ETRS89";
			$('4326').style.fontWeight='';
			$('4258').style.fontWeight='bold';
			$('3034').style.fontWeight='';
			break;
		case "EPSG:3034":
			SRS = "ETRS89 / ETRS-LCC";
			$('4326').style.fontWeight='';
			$('4258').style.fontWeight='';
			$('3034').style.fontWeight='bold';
			break;
	}
	$(id).innerHTML = SRS;
}

/*
 * 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,30000);
}

/**
 * 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";
	}
}

/**
 * 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);
	}
}

function map_zoomToLayerExtentID(West, South, East, North){
	var oldBounds=map.getExtent();
	var extentBbox = new OpenLayers.Bounds(West,South,East,North);
	try{
		map.zoomToExtent(extentBbox, false);
	}catch(e){
		map.zoomToExtent(oldBounds, false);
	}
}

/**
 * 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;
}

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);		
	}
}

/**
 * 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"
    });
}

/**
 * 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;
}

/**
 * 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);
	}
}

/**
 * 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;
}

/**
 * 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);
}

/**
 * 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, _minScaleDenominator, _maxScaleDenominator, _version, _extent,_legendURL){
	
	var _visibility = true;
	if(_hidden)
		_visibility = false;
	
    var wmsToAdd = new OpenLayers.Layer.WMS(
            _title,
            _url,
            {layers: _name, transparent: 'TRUE',version:_version }, 
            {'isBaseLayer':false, '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   );
    
    // 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 = ( _extent ) ? _extent.split(';') : "-30;35;30;70".split(";") ;
    var extentBbox = new OpenLayers.Bounds(extentArray[0],extentArray[1],extentArray[2],extentArray[3]);
    
    var gclayer = { 
    		id: wmsToAdd.id,
    		gcloaded: false,
    		queryable: null,
    		opaque: null,
    		cascaded: null,
    		name: _name,
    		title: _title,
    		summary: "",
    		keywords: keywordslist,
    		srs: srslist,
    		latlonbbox: extentBbox,
    		scalehints: '',
    		styles: styleslist,
    		serverTitle: _serverTitle, 
    		countryAddress:"",
    		minScaleDenominator: _minScaleDenominator,
    		maxScaleDenominator: _maxScaleDenominator,
    		legendURL: (_legendURL == "null" ) ? null : _legendURL
    };
    
    if( _uuid )
    	gclayer.uuid = _uuid;
    gclayers.push(gclayer);
    
    
    map.addLayer(wmsToAdd);
    
    
    // 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);
}

function map_setgclayerSimulatedLayer(json){
	//alert("test");
	var curgcLayer = map_getgclayerbyid(json.id);
	if( curgcLayer ){
		//alert("ds1="+json.title);
		curgcLayer.title=json.title;
		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);
		curgcLayer.address= json.address;
		curgcLayer.postCode= json.postCode;
		curgcLayer.city= json.city;
		curgcLayer.email= json.email;
		curgcLayer.contactOrganization=json.contactOrganization;
		curgcLayer.contactPerson=json.contactPerson;
		curgcLayer.keywords = json.keywordList.split(',');
		//curgcLayer.country=json.country;
		curgcLayer.serverTitle=json.serverTitle;
		curgcLayer.summary=json.description;
		curgcLayer.accessConstraints=json.accessConstraints;
		curgcLayer.countryAddress=json.countryAddress;
		//alert(curgcLayer.country);
		
		var curLayer = map.getLayer(json.id);
		var curLayerIndex = map.getLayerIndex(curLayer);
		
		//map_updateWithgclayer(curgcLayer,curLayer,curLayerIndex);
	}
}


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);
		//ajout pour affichage dans fiche metadata from getCap
		curgcLayer.address= json.address;
		curgcLayer.postCode= json.postCode;
		curgcLayer.city= json.city;
		curgcLayer.email= json.email;
		curgcLayer.contactOrganization=json.contactOrganization;
		curgcLayer.contactPerson=json.contactPerson;
		curgcLayer.keywords = json.keywordList.split(',');
		curgcLayer.datekw=json.datekw;
		curgcLayer.topickw=json.topickw;
		//curgcLayer.country=json.country;
		curgcLayer.serverTitle=json.serverTitle;
		curgcLayer.summary=json.description;
		curgcLayer.accessConstraints=json.accessConstraints;
		curgcLayer.title=json.title;
		curgcLayer.countryAddress=json.countryAddress;
		curgcLayer.metadataURL=json.metadataURL;
		curgcLayer.accessConstraints=json.accessConstraints;
		
		var curLayer = map.getLayer(json.id);
		var curLayerIndex = map.getLayerIndex(curLayer);
		
		map_updateWithgclayer(curgcLayer,curLayer,curLayerIndex);
	}
}

/**
 * Affiche/Cache la vue d ensemble (minimap)
 */
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";
}

/**
 * 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();
	}
}

/**
 * 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 ) {
			var curLayer = map.layers[cpt];
  			var gclayer = map_getgclayerbyid(curLayer.id);
  			
			map.removeLayer(map.layers[cpt] );
			
			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);
		}
		cpt --;
	}
}

/**
 * Sauvegarde le WMC en session
 */
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);
}

/**
 * Utilisation d'un tableau tabLayersCatalog (voir par exemple layerTree.jsp) construit depuis le catalogue ou par chargement d'un WMC. 
 * voir la classe Layer.getJSon() 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 _keepInLayerSwitcher = true;
	if(layer['keepInLayerSwitcher']== 'false')
		_keepInLayerSwitcher = 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'] && layer['opacity'] != "null")
		_opacity = layer['opacity'];
	
	var _simulatedID = 0;
	if( layer['simulatedID'] )
		_simulatedID = layer['simulatedID'];
	var _simulatedPosition = 0;
	if( layer['simulatedPosition'] )
		_simulatedPosition = layer['simulatedPosition'];
	var _displayInLayerSwitcher = true;
	if( layer['displayInLayerSwitcher'] )
		_displayInLayerSwitcher = ( layer['displayInLayerSwitcher'] == "true" );

	var _country = "";
	if( layer['country'] )
		_country = layer['country'];
	
	var styleslist = "default";
	if( layer['styles'] )
		styleslist = layer['styles'];
	
	////
	//ATTENTION test entre 1GG (pas de styles) et 1GE
	////
	var wmsToAdd;
	if(styleslist!='null'){
		wmsToAdd = new OpenLayers.Layer.WMS(  
			layer['title'],//titre
	        layer['serverUrl'],//url
	        {layers: layer['name']//name
	        	, transparent: 'TRUE', styles:layer['styles']}, 
	        {'isBaseLayer':_isBaseLayer, 'singleTile':true,'opacity':_opacity,'visibility':_visibility,'queryable':true,'ratio':1,'displayInLayerSwitcher':_displayInLayerSwitcher}
	    );
	}else{
		wmsToAdd = new OpenLayers.Layer.WMS(   
				layer['title'],//titre
	            layer['serverUrl'],//url
	            {layers: layer['name']//name
	            	, transparent: 'TRUE',version:layer['version']}, 
	            {'isBaseLayer':_isBaseLayer, 'singleTile':true,'opacity':_opacity,'visibility':_visibility,'queryable':true,'ratio':1,'displayInLayerSwitcher':true}
	        );
	}
	
	/*if(_simulatedPosition==2 || (_simulatedPosition==0 &&  _simulatedID==1)  ||_simulatedPosition==11 ||_simulatedPosition==9 ||_simulatedPosition==7 || _simulatedPosition==6 || _simulatedPosition==13 ){
		wmsToAdd = new OpenLayers.Layer.WMS(   
				layer['title'],//titre
	            layer['serverUrl'],//url
	            {layers: layer['name']//name
	            	, transparent: 'TRUE', styles:'age,default'}, 
	            {'isBaseLayer':_isBaseLayer, 'singleTile':true,'opacity':_opacity,'visibility':_visibility,'queryable':true,'ratio':1,'displayInLayerSwitcher':_displayInLayerSwitcher}
	        );
	}else if (_simulatedPosition==5 || _simulatedPosition==3 || _simulatedPosition==1){
		wmsToAdd = new OpenLayers.Layer.WMS(   
				layer['title'],//titre
	            layer['serverUrl'],//url
	            {layers: layer['name']//name
	            	, transparent: 'TRUE', styles:'age'}, 
	            {'isBaseLayer':_isBaseLayer, 'singleTile':true,'opacity':_opacity,'visibility':_visibility,'queryable':true,'ratio':1,'displayInLayerSwitcher':_displayInLayerSwitcher}
	        );
	}else{
    //var wmsToAdd = new OpenLayers.Layer.WMS(
		alert("dselse="+layer['name']);
		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,'displayInLayerSwitcher':_displayInLayerSwitcher}
        );
	}*/
	
	var existingSLayers = simulatedLayers[_simulatedID];
	if( ! existingSLayers ){
		existingSLayers = new Array();
	}
	existingSLayers.push(wmsToAdd.id);
	simulatedLayers[_simulatedID] = existingSLayers;
	
    // 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 = layer['styles'].split(';');
    //var styleslist = ( layer['styles'] ) ? layer['styles'].split(';') : "";
    
    var extentArray = ( layer['extent'] ) ? layer['extent'].split(';') : "-30;35;30;70".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,
    		datekw: layer['datekw'],
    		topickw: layer['topickw'],
    		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'],
    		wfsURLType: layer['wfsURLType'],
    		wfsGeom: layer['wfsGeom'], 
			wfsSrs: layer['wfsSrs'],
			simulatedID: _simulatedID,
			simulatedPosition: _simulatedPosition,
			maxScaleDenominator : (layer['maxScaleDenominator'] == "null") ? null: layer['maxScaleDenominator'],
			minScaleDenominator : (layer['minScaleDenominator'] == "null") ? null: layer['minScaleDenominator'],
			address: (layer['address'] == "null") ? null: layer['address'],
			postCode:(layer['postCode'] == "null") ? null: layer['postCode'],
			city:(layer['city'] == "null") ? null: layer['city'],
			email:(layer['email'] == "null") ? null: layer['email'],
			contactPerson:(layer['contactPerson'] == "null") ? null: layer['contactPerson'],
			contactOrganization:(layer['contactOrganization'] == "null") ? null: layer['contactOrganization'],
			countryAddress:(layer['countryAddress'] == "null") ? null: layer['countryAddress'],
			print:false,
			keepInLayerSwitcher:_keepInLayerSwitcher,
			country: _country
    };
    	
    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 ){ 
    	
    }
 // ScaleHint available
    //alert("test="+gclayer.minScaleDenominator);
    if( gclayer.minScaleDenominator && gclayer.minScaleDenominator != "null" ){
    	var lsminScaleDenominator = $('ls-minScaleDenominator-'+idx);
    	if( lsminScaleDenominator ){
    		lsminScaleDenominator.style.display = "block";
    	}
    }
 
    
    // 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"
    });
    
    //recup�ration des infos provenant du getCapabilities pour les couches simul�es
   //if(gclayer.simulatedID>0 && gclayer.simulatedPosition){
    if(gclayer.simulatedID>0 ){	
    //if(gclayer.simulatedPosition!=9){
    		var lname=layer['name'].split(',');
    		loadJSON(host+"/capabilitiesControler?method=getCapabilitiesLayer&serverUrl="+layer['serverUrl']+"&layerName="+lname[0]+"&layerId="+wmsToAdd.id+getHash(),  map_setgclayerSimulatedLayer);
    	//}
    }
}

function map_setPrintForSimulatedLayer(printOK){
	for( var i = 0 ; i < gclayers.length ; i++ ){
		var gclayer = gclayers[i];
		if(gclayer.simulatedID>0 && printOK){
			gclayer.print=true;
		}else{gclayer.print=false;}
	}
}

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;
	    }
	}
}

/**
 * Sauvegarde le context en WMC
 * Cette fonction est 1G, mais sp�cifique 1GG
 */
function map_saveWMC(){
	var wmc = parserWMC.write(map, {'gclayers':gclayers});
	$('savecontextforminputwmc').value = wmc;
	$('savecontextforminputfilename').value = $('inputSaveWMC').value;
	document.savecontextform.submit();
	
	openSaveWMCWindow();
}
/**
 * Sauvegarde (Exporte) le context en KML
 * Cette fonction est 1G, mais sp�cifique 1GG
 */ 
function map_saveKML(){
	var wmc = parserWMC.write(map, {'gclayers':gclayers});
	$('savekmlforminputwmc').value = wmc;
	$('savekmlforminputfilename').value = $('inputSaveKML').value;
	document.savekmlform.submit();
	
	openSaveKMLWindow();
}

/*
 * Calcul du ScaleHint (transformation par rapport � la r�solution)
 */
function map_getScaleHint(scale){
	var scaleCalculated = Math.round((scale/Math.sqrt(2.0))*72/2.54*100);
	return scaleCalculated;
}

/**
 * Comparaison de l'echelle courante avec le minScaleDenominator et le maxScale denominator d'une layer
 */
	function map_compareScale(){
		var layers = this.map.layers.slice();
		if (!this.ascending) { layers.reverse(); }
		for(var i=0, len=layers.length; i<len; i++) {
			var vraii = layers.length - ( i + 1 );
			var layer = layers[i];
			var gclayer = map_getgclayerbyid(layer.id);
            if (layer.displayInLayerSwitcher && !layer.isBaseLayer) {
				if(gclayer.minScaleDenominator!="null"){
					var minScale;
					var maxScale;
					//in version 1.1.1 the scale denominator need to be calculated, not in 1.3.0
					if(layer.params.VERSION=="1.3.0"){
						minScale=gclayer.minScaleDenominator;
						maxScale=gclayer.maxScaleDenominator;
					}else{
						minScale = map_getScaleHint(gclayer.minScaleDenominator);
						maxScale = map_getScaleHint(gclayer.maxScaleDenominator);
					}
					
					if(maxScale>0){
						if( this.map.getScale()> minScale && this.map.getScale()< maxScale) {
							//document.getElementById('layerScaleVisibility_'+vraii).className = 'ls_singleLayer';
							document.getElementById('layerScaleVisibility_'+vraii).setAttribute('className', 'ls_singleLayer');
							document.getElementById('layerScaleVisibility_'+vraii).setAttribute('class', 'ls_singleLayer');
							document.getElementById('visibility_'+vraii).innerHTML="";
						}else{
							//document.getElementById('layerScaleVisibility_'+vraii).className = 'ls_singleLayer_notVisible';
							document.getElementById('layerScaleVisibility_'+vraii).setAttribute('className', 'ls_singleLayer_notVisible');
							document.getElementById('layerScaleVisibility_'+vraii).setAttribute('class', 'ls_singleLayer_notVisible');
							document.getElementById('visibility_'+vraii).innerHTML=OpenLayers.i18n('lswitcherVisibility');
						}
					}else{
						if(this.map.getScale()> minScale){
							//document.getElementById('layerScaleVisibility_'+vraii).className = 'ls_singleLayer';
							document.getElementById('layerScaleVisibility_'+vraii).setAttribute('className', 'ls_singleLayer');
							document.getElementById('layerScaleVisibility_'+vraii).setAttribute('class', 'ls_singleLayer');
							document.getElementById('visibility_'+vraii).innerHTML="";
						}else{
							//document.getElementById('layerScaleVisibility_'+vraii).className = 'ls_singleLayer_notVisible';
							document.getElementById('layerScaleVisibility_'+vraii).setAttribute('className', 'ls_singleLayer_notVisible');
							document.getElementById('layerScaleVisibility_'+vraii).setAttribute('class', 'ls_singleLayer_notVisible');
							document.getElementById('visibility_'+vraii).innerHTML=OpenLayers.i18n('lswitcherVisibility');
						}
					}
				}
            }
		}
	}
