// INITIALISATION DE L'APPLICATION

opencarto.createMap = function(){
    opencarto.vectorLayer = new OpenLayers.Layer.Vector("vector",{
        styleMap: new OpenLayers.StyleMap({
            "default": new OpenLayers.Style({
                fillOpacity: 0.6,
                strokeColor: "#680404",
                fillColor: "#dc3838",
                strokeWidth: 2,
                cursor: 'pointer',
                pointRadius:5
            }),
            "select": new OpenLayers.Style({
                fillOpacity: 0.9,
                strokeColor: "#00FF00",
                pointRadius:5
            })
        })                                                                                                    
    });
    
    opencarto.drawLayer = new OpenLayers.Layer.Vector("draw",{
        styleMap: new OpenLayers.StyleMap({
            "default": new OpenLayers.Style({
                fillOpacity: 0.6,
                strokeColor: "#333300",
                fillColor: "#0033CC",
                strokeWidth: 2,
                cursor: 'pointer',
                pointRadius:5
            }),
            "select": new OpenLayers.Style({
                fillOpacity: 0.9,
                strokeColor: "#FFCC00",
                pointRadius:5
            })
        })
    });
    
    opencarto.snapLayer = new OpenLayers.Layer.Vector("snap",{
        styleMap: new OpenLayers.StyleMap({
            "default": new OpenLayers.Style({
                fillOpacity: 0.3,
                strokeColor: "#333333",
                fillColor: "#111111",
                strokeWidth: 1,
                cursor: 'pointer',
                pointRadius:5
            }),
            "select": new OpenLayers.Style({
                fillOpacity: 0.6,
                strokeColor: "#FFCC00",
                pointRadius:5
            })
        })
    });

    opencarto.modifLayer = new OpenLayers.Layer.Vector("modif",{
        styleMap: new OpenLayers.StyleMap({
            "default": new OpenLayers.Style({
                fillOpacity: 0.3,
                strokeColor: "#333333",
                fillColor: "#110011",
                strokeWidth: 1,
                cursor: 'pointer',
                pointRadius:5
            }),
            "select": new OpenLayers.Style({
                fillOpacity: 0.6,
                strokeColor: "#00CC00",
                pointRadius:5
            })
        })
    });
    
    var zoomToMaxExtentControl = new OpenLayers.Control.ZoomToMaxExtent();
    var zoomBoxControl = new OpenLayers.Control.ZoomBox();
    var navigationControl = new OpenLayers.Control.Navigation();
    var calculateLengthControl = new OpenLayers.Control.DrawFeature(
        opencarto.vectorLayer,
        OpenLayers.Handler.Path,
        {
           featureAdded: calculate_length,
           displayClass: "olControlCalculateLength"
        }
    );
    var calculateAreaControl = new OpenLayers.Control.DrawFeature(
        opencarto.vectorLayer,
        OpenLayers.Handler.Polygon,
        {
           featureAdded: calculate_area,
           displayClass: "olControlCalculateArea"
        }
    );
    
    
    var getInfoControl = new OpenLayers.Control.DrawFeature(
        opencarto.vectorLayer,
        OpenLayers.Handler.Point,
        {
           featureAdded: getFeatureInfo,
           displayClass: "getInfoControl"
        }
    );
 
    mapOptions = {
        projection: globalParams.projection,
        units: "m",
        animate:true,
       // resolutions: globalParams.resolutions,
        maxExtent: globalParams.maxExtent,
        controls:[
                    new OpenLayers.Control.ScaleLine({maxWidth:200,title:'Echelle'}),
                    new OpenLayers.Control.MousePosition({'numDigits':1}),
                    new OpenLayers.Control.PanZoomBar(),
                    zoomToMaxExtentControl, zoomBoxControl, navigationControl,
       calculateLengthControl, calculateAreaControl,getInfoControl
                    ]};
        
    if (globalParams.googlelayer){
        mapOptions.resolutions = globalParams.resolutions;
		mapOptions.displayProjection = new OpenLayers.Projection("EPSG:4326");
		mapOptions.controls[1] = new OpenLayers.Control.MousePosition({'numDigits':5,displayProjection: new OpenLayers.Projection("EPSG:4326")});
    }
}


opencarto.loadLayers = function(){
// configuration de la carte avec la définition des layers reçus en JSON	
	opencarto.map = opencarto.mapPanel.getMap();
	
	
	if (opencarto.legend){
	    opencarto.map.events.register('changelayer', this, function() {
	        opencarto.legend.show();
	    });
	    opencarto.map.events.register('zoomend',this,function(){
	        opencarto.legend.show();
	    });
	}
	
	opencarto.loadedLayers = new Array();
	
	//Recup d'une vue & position passée en param dans l'url
	//Recup des caracteristiques
	if( globalParams.view != -1 && opencarto.gisobjects.view ){
		var vue_id = opencarto.gisobjects.view[0].id;
		var vue_name = opencarto.gisobjects.view[0].name;
		var vue_couches = opencarto.gisobjects.view[0].couches.split(';');
		var rank_layers = new Array();
		var opa_google = 0.7;
		var voir_google = true;
		
		for ( var i=0;i<opencarto.gisobjects.layers.length;i++ ){
		    myLayer = opencarto.gisobjects.layers[i];
		    for( var j=0;j<vue_couches.length;j++ ){
		    	var params_couche = vue_couches[j].split(',');
		    	var id_couche = params_couche[0];
			var voir_couche = eval( params_couche[1] );
			var opa_couche = params_couche[2];
			var rank_couche = params_couche[3];
			var sld_couche = 0;
			if( params_couche.length == 5 ){
				sld_couche = params_couche[4];
			}
		    	if( id_couche == myLayer.options.layerid ){
		    	    //visible
			    myLayer.options.visibility = voir_couche;
			    //rang
			    myLayer.options.rang = rank_couche;
			    //opactité
			    myLayer.options.opacity = opa_couche;
		    	  
		    	  
			    if ( opencarto.map.getNumLayers() == 0 && !globalParams.googlelayer )
				myLayer.options.isBaseLayer = true;
			    else
				myLayer.options.isBaseLayer = false;
			    if ( myLayer.name == 'Google Layer' ){
			    	opa_google = opa_couche;
			    	voir_google = voir_couche;
                                opencarto.loadedLayers[i] = new OpenLayers.Layer.Google("Google Layer",{	
						type: globalParams.googlelayer,
						"sphericalMercator": true,
						 minZoomLevel: 4, 
						 maxZoomLevel: 8
						});
				opencarto.loadedLayers[i].options.isBaseLayer = true;
			    }else{
			    	opencarto.loadedLayers[i] = new OpenLayers.Layer.WMS(myLayer.name,myLayer.url, myLayer.params, myLayer.options);
			    }
			    if ( sld_couche != 0 && myLayer.name != 'Google Layer'){
				opencarto.loadedLayers[i].mergeNewParams({sld: globalParams.sldDir + sld_couche});
			    }
			    
			    opencarto.loadedLayers[i].events.register('loadstart', this, function() {
				opencarto.layercounter += 1;
				Ext.getCmp('basic-statusbar').showBusy();
				});
			    opencarto.loadedLayers[i].events.register('loadend', this, function() {
				opencarto.layercounter -= 1;
				if (opencarto.layercounter == 0)
				    Ext.getCmp('basic-statusbar').clearStatus({useDefaults:true});
			    });
			    
			    rank_layers[ rank_couche ] = opencarto.loadedLayers[i];
		    	 }
		    }
		}
		opencarto.map.addLayers( rank_layers );
		//opacité Google Layer
		var layer = opencarto.map.getLayersByName( 'Google Layer' );
		if( layer[0] ){
			if( voir_google ){
				layer[0].setOpacity( opa_google );
			}else{
				//alert( 'Google Layer OFF' ); 
			}
		}
	}else{
	
	
		for (i=0;i<opencarto.gisobjects.layers.length;i++){
		    myLayer = opencarto.gisobjects.layers[i];
		    
		    if (opencarto.map.getNumLayers() == 0 && !globalParams.googlelayer)
			myLayer.options.isBaseLayer = true;
		    else
			myLayer.options.isBaseLayer = false;
		    if (myLayer.name == 'Google Layer'){
			opencarto.loadedLayers[i] = new OpenLayers.Layer.Google("Google Layer",{	
						type: globalParams.googlelayer,
						"sphericalMercator": true,
						 minZoomLevel: 4, 
						 maxZoomLevel: 8
						});
			opencarto.loadedLayers[i].options.isBaseLayer = true;
			}
		    else{
			opencarto.loadedLayers[i] = new OpenLayers.Layer.WMS(myLayer.name,myLayer.url, myLayer.params, myLayer.options);
				opencarto.loadedLayers[i].setOpacity(myLayer.options.opacity/100);
		    }
	
		    
		    
		    if (myLayer.options.sld != 'null'){
			opencarto.loadedLayers[i].mergeNewParams({sld: myLayer.options.sld})
		    }
		    
		    opencarto.loadedLayers[i].events.register('loadstart', this, function() {
			opencarto.layercounter += 1;
			Ext.getCmp('basic-statusbar').showBusy();
			});
		    opencarto.loadedLayers[i].events.register('loadend', this, function() {
			opencarto.layercounter -= 1;
			if (opencarto.layercounter == 0)
			    Ext.getCmp('basic-statusbar').clearStatus({useDefaults:true});
		    });
		    opencarto.map.addLayer(opencarto.loadedLayers[i]);
		    if (myLayer.name == "Google Layer"){
			if( navigator.userAgent.match(/firefox/gi) ){
				opencarto.map.baseLayer.setOpacity( 0.69 );
			}
		    }
		
		}
	
	}
	
	
	
	// indiquer que la couche vecteur est toujours "in range"
	opencarto.vectorLayer.calculateInRange = function() { return true; };
	
	opencarto.map.addLayer(opencarto.vectorLayer);
	   
	// on ne met pas l'overview avec une couche google, car ça bugge !!!
		    
	if (opencarto.overviewMap)
		opencarto.overviewMap.load();
	   
	opencarto.vectorLayer.setZIndex(opencarto.map.Z_INDEX_BASE['Popup'] - 1);
	
	// indiquer que la couche vecteur dessin est toujours "in range"
	opencarto.drawLayer.calculateInRange = function() { return true; };
	opencarto.map.addLayer(opencarto.drawLayer);
	   
	opencarto.drawLayer.setZIndex(opencarto.map.Z_INDEX_BASE['Popup'] - 1);
	
	// indiquer que la couche vecteur snapping est toujours "in range"
	opencarto.snapLayer.calculateInRange = function() { return true; };
	opencarto.map.addLayer(opencarto.snapLayer);
	   
	opencarto.snapLayer.setZIndex(opencarto.map.Z_INDEX_BASE['Popup'] - 1);
	
	
	opencarto.map.zoomToExtent(globalParams.maxExtent);
	
	//Ajout du bouton informations
	if( opencarto.hasVectorLayers() ){
		Ext.getCmp('16').show();
	}
	
	if( globalParams.position != -1 && opencarto.gisobjects.position ){
		//Position
		var x = eval( opencarto.gisobjects.position[0].x );
	   	var y = eval( opencarto.gisobjects.position[0].y );
	   	var z = eval( opencarto.gisobjects.position[0].z );
	   	if (z != opencarto.map.getZoom()){
	      		opencarto.map.setCenter(new OpenLayers.LonLat(x,y),z);
	   	}
	   	else{
      			opencarto.map.panTo(new OpenLayers.LonLat(x,y));
   		}
   	}
}


//Testeur de couches : vrai si couches vectorielles
opencarto.hasVectorLayers = function(){
	vlayers = opencarto.map.getLayersBy('visibility',true);
      	for(i=0;i<vlayers.length;i++){ 
      		if( vlayers[i].options.typegeo == 'POINT' || vlayers[i].options.typegeo == 'POLYGON' || vlayers[i].options.typegeo == 'LINE'){
      			return true;
      		}
      	}
      	hlayers = opencarto.map.getLayersBy('visibility',false);
      	for(i=0;i<hlayers.length;i++){ 
      		if( hlayers[i].options.typegeo == 'POINT' || hlayers[i].options.typegeo == 'POLYGON' || hlayers[i].options.typegeo == 'LINE'){
      			return true;
      		}
      	}
      	return false;
}   


