var cor = ["#99CC33","#99CCCC","#CC6600","#FFCC99","#DF0101",'#6E6E6E','#6F4612','#3D59D3','#ED7878','#0B3B0B','#FF8000'];
var coresPorId = new Array();
var actual = 0;
var selectItinerarioControl, selectedItinerarioFeature;

OpenLayersItinerarioFacade = function(map) {

	this.init(map);
}

jQuery.extend(OpenLayersItinerarioFacade.prototype, {
	
	map: null,
	
	layers: [],
	
	numLayers: 0,

	init: function(map){

		this.map = map;
	},
	
	obterEstiloPunto: function(){
		
		//Definimos un estilo para debuxar as 'features' sobre o mapa. 
		
		var style = new OpenLayers.Style({},{
			
	        context: {
			
            image: function(feature) {
    			
				if(feature.attributes.count > 1){
					
					return "";
				}
				else{
					
//					if(feature.cluster[0].attributes.tipo != 'poboacion')
						return "./icons/"+feature.cluster[0].attributes.tipo+".png";
//					else
//						return "./icons/"+feature.cluster[0].attributes.tipo+feature.cluster[0].attributes.subtipo+".png";
				}
    		},
    		
    		numeroElementos: function(feature) {
    			
    			if(feature.attributes.count>1){
    				
    				return "+";
    			}
    			else{
    				
    				return "";
    			}
    		},

    		title: function(feature){
    			
    			if(feature.attributes.count > 1){
    				
    				return "Prema para despregar "+feature.attributes.count+" puntos";
    			}
    			else{
    				
    				return feature.cluster[0].attributes.nome;
    			}
    		},
    		
    		asignarCorRoteiro: function(feature) {

				return obterC(feature.cluster[0].attributes.iditinerario);
    		},
    		
    		asignarCorLinea: function(feature) {

    			if(feature.attributes.count > 1){
					
					return "black";
				}
				else{
	
					return obterC(feature.cluster[0].attributes.iditinerario);
				}
    		},
    		
    		asignarOpacidad: function(feature) {

    			if(feature.attributes.count>1){
    				
	    			return "1";
	    		}
	    		else{
	    				
	    			return "0";
	    		}
    		}
    	}});

		var regraLonxe = new OpenLayers.Rule({

			  symbolizer: {
			
					pointRadius: 6,
			        fillColor: "${asignarCorRoteiro}",
			        fillOpacity: "${asignarOpacidad}",
			        graphicName: "square",
			        backgroundGraphic: "${image}",
			        graphicTitle: "${title}",
			        strokeColor: "${asignarCorLinea}",
			        strokeWidth: 1,
			        strokeOpacity: 1,
			        cursor: "pointer",
			        graphicOpacity: "1",
			        label: "${numeroElementos}",
			        fontSize: "9px",
			        fontWeight: "bold",
			        fontColor: "white"
			  }
		});

		style.addRules([regraLonxe]);
		
		return style;
	},
	
	obterEstiloEspacio: function(){
		
		//Definimos un estilo para debuxar as 'features' sobre o mapa. 
		
		var style = new OpenLayers.Style();

		var regraLonxe = new OpenLayers.Rule({

			  symbolizer: {
			
			        fillColor: "green",
			        fillOpacity: 0.3,
			        strokeColor: "black",
			        strokeWidth: 1,
			        strokeOpacity: 1,
			        cursor: "pointer"
			  }
		});

		style.addRules([regraLonxe]);
		
		return style;
	},
	
	obterEstiloRio: function(){
		
		//Definimos un estilo para debuxar as 'features' sobre o mapa. 
		
		var style = new OpenLayers.Style();

		var regraLonxe = new OpenLayers.Rule({

			  symbolizer: {
			
			        fillColor: "blue",
			        fillOpacity: 0.5,
			        strokeColor: "blue",
			        strokeWidth: 1,
			        strokeOpacity: 1,
			        cursor: "pointer"
			  }
		});

		style.addRules([regraLonxe]);
		
		return style;
	},
	
	obterCapaPunto: function(nome, requestUrl){
		
		var layer = new OpenLayers.Layer.Vector(nome, {
			
            strategies: [
                new OpenLayers.Strategy.Fixed(),
                new OpenLayers.Strategy.Cluster({distance:13})
            ],
            protocol: new OpenLayers.Protocol.HTTP({
                url: requestUrl,
                format: new OpenLayers.Format.GML()
            }),
            styleMap: new OpenLayers.StyleMap({
	            "default": this.obterEstiloPunto()
	        }),
	        displayInLayerSwitcher: false,
	        preFeatureInsert: function(feature){
				
				feature.geometry.transform(new OpenLayers.Projection("EPSG:23029"),new OpenLayers.Projection("EPSG:900913"));
			}
		});
		
		return layer;
		
	},
	
	obterCapaEspacio: function(nome, requestUrl){
		
		var layer = new OpenLayers.Layer.Vector(nome, {
			
            strategies: [
                new OpenLayers.Strategy.Fixed()
            ],
            protocol: new OpenLayers.Protocol.HTTP({
                url: requestUrl,
                format: new OpenLayers.Format.GML({geometryName: "poly_geom"})
            }),
            styleMap: new OpenLayers.StyleMap({
	            "default": this.obterEstiloEspacio()
	        }),
	        displayInLayerSwitcher: false
		});
		
		return layer;
	},
	
	obterCapaRio: function(nome, requestUrl){
		
		var layer = new OpenLayers.Layer.Vector(nome, {
			
            strategies: [
                new OpenLayers.Strategy.Fixed()
            ],
            protocol: new OpenLayers.Protocol.HTTP({
                url: requestUrl,
                format: new OpenLayers.Format.GML()
            }),
            styleMap: new OpenLayers.StyleMap({
	            "default": this.obterEstiloRio()
	        }),
	        displayInLayerSwitcher: false
		});
		
		return layer;
	},
	
	engadirItinerario: function(idItinerario){
		
		if(this.map.getLayersByName("Itinerario"+idItinerario).length == 0){
			
			baseUrl = '/geoserver/wfs?SERVICE=WFS&VERSION=1.0.0&REQUEST=getfeature&typename=patrimonio:vista_xeografia_itinerario'
			baseUrl = baseUrl+'&Filter=<Filter><And><PropertyIsEqualTo><PropertyName>iditinerario</PropertyName><Literal>'+idItinerario+'</Literal></PropertyIsEqualTo>';
			
			puntoUrl = baseUrl+'<PropertyIsNotEqualTo><PropertyName>tipo</PropertyName><Literal>espacio</Literal></PropertyIsNotEqualTo></And></Filter>';
			espacioUrl = baseUrl+'<PropertyIsEqualTo><PropertyName>tipo</PropertyName><Literal>espacio</Literal></PropertyIsEqualTo></And></Filter>';
			
//			percorridoUrl = '/geoserver/wfs?SERVICE=WFS&VERSION=1.0.0&REQUEST=getfeature&typename=patrimonio:vista_itinerario';
//			percorridoUrl = percorridoUrl+'&Filter=<Filter><PropertyIsEqualTo><PropertyName>id</PropertyName><Literal>'+idItinerario+'</Literal></PropertyIsEqualTo></Filter>';
			
			layerPunto = this.obterCapaPunto("Itinerario"+idItinerario,puntoUrl);
			layerEspacio = this.obterCapaEspacio("Itinerario"+idItinerario,espacioUrl);
//			layerPercorrido = this.obterCapaRio("Itinerario"+idItinerario,percorridoUrl);
			
			this.map.addLayers([/*layerPercorrido, */layerEspacio, layerPunto]);
			this.layers[this.numLayers] = layerEspacio;
			this.layers[this.numLayers+1] = layerPunto;
//			this.layers[this.numLayers+2] = layerPercorrido;
			this.numLayers = this.numLayers+2;
			this.actualizarControl();

		}else{
			
			this.map.getLayersByName("Itinerario"+idItinerario)[0].setVisibility(true);
			this.map.getLayersByName("Itinerario"+idItinerario)[1].setVisibility(true);
			//this.map.getLayersByName("Itinerario"+idItinerario)[2].setVisibility(true);
		}
	},
	
	centrarItinerario: function(idItinerario){

		centerLayer = this.map.getLayersByName("Itinerario"+idItinerario)[1];
		centerLayer.events.register("loadend", {"map":this.map,"layer":centerLayer}, function(){
			
			this.map.zoomToExtent(this.layer.getDataExtent());
			this.map.setBaseLayer(this.map.getLayersByClass("OpenLayers.Layer.Google")[0]);
		});
	},
	
	cuadrarItinerario: function(idItinerario){

		centerLayer = this.map.getLayersByName("Itinerario"+idItinerario)[1];
		
		if(centerLayer != null){
			this.map.zoomToExtent(centerLayer.getDataExtent());
			this.map.setBaseLayer(this.map.getLayersByClass("OpenLayers.Layer.Google")[0]);
		}
	},
	
	borrarItinerario: function(idItinerario){
		
		this.map.getLayersByName("Itinerario"+idItinerario)[0].setVisibility(false);
		this.map.getLayersByName("Itinerario"+idItinerario)[1].setVisibility(false);
		//this.map.getLayersByName("Itinerario"+idItinerario)[2].setVisibility(false);
	},
	
	resaltarElemento: function(idElemento){
		
		requestUrl = '/geoserver/wfs?SERVICE=WFS&VERSION=1.0.0&REQUEST=getfeature&typename=patrimonio:vista_xeografia_itinerario';
		requestUrl = requestUrl+'&Filter=<Filter><PropertyIsEqualTo><PropertyName>id</PropertyName><Literal>'+idElemento+'</Literal></PropertyIsEqualTo></Filter>';
		
		request = OpenLayers.Request.GET({
			url: requestUrl,
			async: false
		});
		
		var styleMap = new OpenLayers.StyleMap(OpenLayers.Util.applyDefaults(
		        {externalGraphic:"./icons/marca.png", pointRadius: 10, graphicOpacity: 1,'graphicXOffset': -10.5,
		         'graphicYOffset': -19.0, fillColor:"red", strokeColor:"black", strokeWidth: 3, fillOpacity: 0
		        },
		        OpenLayers.Feature.Vector.style["default"]));
		

		var layer = this.map.getLayersByName("marcas")[0];
		
		if(!layer){
			
			layer = new OpenLayers.Layer.Vector("marcas", {

				displayInLayerSwitcher: false,
				styleMap: styleMap,
				projection: new OpenLayers.Projection("EPSG:900913")
		    });
			
			this.map.addLayers([layer]);
			this.layers[this.numLayers] = layer;
			this.numLayers = this.numLayers+1;
		}
		
		var feat = new OpenLayers.Format.GML().read(request.responseText);
		
		for(var f in feat){
			
			if(feat[f].geometry.CLASS_NAME == 'OpenLayers.Geometry.Point'){
				
				feat[f].geometry.transform(new OpenLayers.Projection("EPSG:23029"),new OpenLayers.Projection("EPSG:900913"));
			}
		}
		
		layer.addFeatures(feat);

		this.actualizarControl();
	},
	
	borrarElementos: function(){
		
		var layer = this.map.getLayersByName("marcas")[0];
		
		if(layer){
			
			layer.destroyFeatures();
		}
	},

	borrarTodo: function(){
		
		for(l in this.layers){
			this.layers[l].destroy();
		}
		this.map.setBaseLayer(this.map.getLayersByClass("OpenLayers.Layer.WMS")[0]);
		this.map.zoomTo(0);
		this.actualizarControl();
	},
	
	onPopupClose: function(evt) {
		
	    selectItinerarioControl.unselect(selectedItinerarioFeature);
	},

	desmarcarFeature: function() {
		
		if(selectItinerarioControl && selectedItinerarioFeature)
			selectItinerarioControl.unselect(selectedItinerarioFeature);
	},
	
	actualizarControl: function(){
		
		//Actualiza o control 'SelectFeature' cada vez que se engade ou elimina unha capa. Permite seleccionar unha feature de
		//calquera das capas que se amosan no mapa e non so de unha.

		this.map.removeControl(selectItinerarioControl);
		
		//Capas visibles no mapa
		
		this.layers = [];
		
		for(l in this.map.layers){
			
			if(this.map.layers[l].CLASS_NAME == 'OpenLayers.Layer.Vector'){
				this.layers[this.layers.length] = this.map.layers[l];
			}
		}
		
		this.numLayers = this.layers.length;
		
		selectItinerarioControl = new OpenLayers.Control.SelectFeature(this.layers,
				{scope:{"map":this.map,"onPopupClose": this.onPopupClose} ,onSelect: this.onFeatureSelect, onUnselect: this.onFeatureUnselect});
		
		this.map.addControl(selectItinerarioControl);
		selectItinerarioControl.activate();
	},
	
	onFeatureSelect: function(feature) {

		//Evento que se lanza cada vez que se preme sobre unha feature.
		
		selectedItinerarioFeature = feature;

		//Se prememos sobre un grupo onde existen mais de un elemento, amosarase unha lista cos elementos nese punto.
		
		if(selectedItinerarioFeature.attributes.count > 1){
		
			var idElemento;
		    html = "<div class='titleBar'>Puntos de interese</div><div class='contentBar'>";
		    
		    for(f in feature.cluster){
		    	
		    	currentFeature = feature.cluster[f];
		    	var name = currentFeature.attributes.nome;
		    	
		    	idElemento = currentFeature.attributes.id;
		    	
		    	
		    	if(currentFeature.attributes.tipo == 'poboacion'){
		    		
		    		imaxe = currentFeature.attributes.tipo + currentFeature.attributes.subtipo+".png";
		    	}
		    	else{
		    		
		    		imaxe = currentFeature.attributes.tipo+".png";
		    	}
		    	
		    	html = html+"<div class='linea'><div class='izq'><b><a class='thickbox' href='#TB_inline?&width=850&height=590&inlineId=fichaElemento&modal=true' onclick='javascript:verElemento(\""+currentFeature.attributes.tipo+"\","+idElemento+");'>" + name +"</a></b><br /><i>" + currentFeature.attributes.tipo+"</i></div>"+
		        "<div class='der'><img src='./icons/"+imaxe+"'/></div><div class='clear'></div></div>";
		    }

		    html = html+"</div>";
		    
		    
		    if(this.map.size.w <= 300){
		    	
		    	ll = this.map.getLonLatFromPixel(new OpenLayers.Pixel(10,45));
		    }
		    else{
		    	
		    	ll = feature.geometry.getBounds().getCenterLonLat();
		    };

		    popup = new OpenLayers.Popup.Anchored("info", 
		                             ll,
		                             null, html,
		                             null, true, this.onPopupClose);

		    feature.popup = popup;
		    this.map.addPopup(popup);
		    
		}
		else{
			
			//Se prememos sobre un so elemento abrirase unha ventana modal coa informacion do elemento empregando o
			//metodo 'verElemento' que se atopa en '/scripts/xeografiafacade/HTMLXeografiaFacade.js'
			
			
			if(selectedItinerarioFeature.attributes.count){
				
				idElemento = selectedItinerarioFeature.cluster[0].attributes.id;
				tipo = selectedItinerarioFeature.cluster[0].attributes.tipo;
			}
			else{
				
				idElemento = selectedItinerarioFeature.attributes.id;
				tipo = selectedItinerarioFeature.attributes.tipo;
			}
				verElemento(tipo,idElemento);
		}
	},

	onFeatureUnselect: function(feature) {
		
		if(feature.popup != null){
			this.map.removePopup(feature.popup);
		}
	}
});

function obterC(id){

	if(coresPorId[id]){
		
		return coresPorId[id];
	}
	else{
		coresPorId[id] = cor[actual];
		actual = (actual+1) % cor.length;
		return coresPorId[id];
	}
}