﻿

var busca_on = false;                              
var control_vlayer = false; //Indicador de se foi activado o editor de capa.

var map;      

var gphy;		var gmap;			var ghyb;			var yahooLayer; 
var wmspnoa;	var wmssitga;
var vlayer;		var busca_layer;	var destaca_layer;  var layer_concellos;

var nav;	//OpenLayers.Control.NavigationHistory 
var control_historia_menos_un;		var control_historia_mais_un; 
var control_desplaza_mapa; 			var control_primer_zoom; 
var control_area_busca_zoom;		var control_area_busca; 
var control_menos_zoom;				var control_mais_zoom; 
var info;
var geojson;	//OpenLayers.Format.GeoJSON

var selector = ''; 
     
var maxOpacity = 0.9;		var minOpacity = 0.1;		var trocaOpacity = 0.1;

var mi_control; 


// Opcions de constructor para VLAYER, BUSCA_LAYER, DESTACA_LAYER
 var options_b = {	'reproject': false,		'isBaseLayer': false,		projection:'EPSG:4326', 
	maxExtent: new OpenLayers.Bounds(-11.414794921875, 40.371658891506094, -3.768310546875, 45.26715476332791), 
	minExtent: new OpenLayers.Bounds(-0.0000000001, -0.0000000001, 0.0000000001, 0.0000000001), 
	minResolution: 0.00000000000078125,		minZoomLevel: 8,			numZoomLevels: 9,      units: 'degrees'   
}; 
var options_concellos = {	'reproject': false,		'isBaseLayer': false,		projection:'EPSG:4326', 
	maxExtent: new OpenLayers.Bounds(-11.414794921875, 40.371658891506094, -3.768310546875, 45.26715476332791), 
	minExtent: new OpenLayers.Bounds(-0.0000000001, -0.0000000001, 0.0000000001, 0.0000000001), 
	minResolution: 0.00000000000078125,		
	minZoomLevel: 8,			
	//maxZoomLevel: 18, 		
	numZoomLevels: 9,      units: 'degrees'   , visibility: false
}; 
                  
// create a custom control to display layer info on click
var InfoControl = new OpenLayers.Class(OpenLayers.Control, {
	a_lonlat: null,
    popup: null,
	map: null,
	initialize: function(map) {
		this.map = map;
		OpenLayers.Control.prototype.initialize.call(this);
		this.handler = new OpenLayers.Handler.Click(this, {
			click: this.getInfo
		})
	},
	getInfo: function(event) {     
		try{	this.popup.destroy();	}catch(err){	}
		
		var	o_X = event.xy.x;
		var o_Y = event.xy.y;
        var datos_subcategorias = document.getElementById('subcategorias').value;
        var datos_selconcellos = document.getElementById('selconcellos').value;
		
		a_lonlat = this.map.getLonLatFromPixel( new OpenLayers.Pixel( o_X, o_Y));
        
        var lon_lat_pantalla = new OpenLayers.LonLat(this.map.center.lon, this.map.center.lat);
        var x_y_pantalla = this.map.getPixelFromLonLat(lon_lat_pantalla); 
        x_y_pantalla = x_y_pantalla.add(1,0); 
        var novo_lon_lat_pantalla = this.map.getLonLatFromPixel(x_y_pantalla);     //Calculamos a que coordenatas pertencen a desviación
        lon_lat_pantalla.transform (new OpenLayers.Projection(this.map.getProjection()), new OpenLayers.Projection("EPSG:4326"));    
        novo_lon_lat_pantalla.transform (new OpenLayers.Projection(this.map.getProjection()), new OpenLayers.Projection("EPSG:4326"));
        
        var valor_un_pixel = novo_lon_lat_pantalla.lon - lon_lat_pantalla.lon;
		valor_un_pixel = valor_un_pixel * 10;
        var novos_parametros = "Lon=" + a_lonlat.lon + "&Lat=" + a_lonlat.lat + "&Zoom=" + valor_un_pixel + '&subcategorias=' + datos_subcategorias + '&selconcellos=' + datos_selconcellos;
        call ("busca_preto_punto.php?" + novos_parametros, null, this.displayInfo);
		

	   //var copia = this.map.controls[13].active;
			
		
 
	},
	displayInfo: function(request) { 
         if(this.popup != null){
            this.popup.destroy(); 
        }   
        if (request != 'nada') {    
			
			var num = request.split("@@@")[0];
			request = request.split("@@@")[1];
            this.popup = new OpenLayers.Popup("chicken", a_lonlat, 
				(num == 1 ? new OpenLayers.Size(200,40) : new OpenLayers.Size(300,100)), request , true);
            this.popup.closeOnMove = true;
            this.map.addPopup(this.popup);
        }
		else
		{
			try{	this.popup.destroy();	}catch(err){	}
		}
        
	}
});
    

/******************************************************************************************************/
  function controlaCapaConcellos(event) {
		
		if(map.getZoom() > 2)
		{
			layer_concellos.setVisibility(true);
		}
		else
		{
			layer_concellos.setVisibility(false);
		}
		
    }
           
function init()
{  
	// MAPA
    map = new OpenLayers.Map('meu_mapa', 
			{ controls: [	new OpenLayers.Control.PanZoomBar({div: document.getElementById("zoomMovil")}),
							new OpenLayers.Control.ScaleLine({div: document.getElementById("mi_scalebar")}),  
							new OpenLayers.Control.MousePosition({div: document.getElementById("mi_positionBackground"), prefix: 'Lonxitude ', separator: 'º Latitude ', suffix: 'º'})
						],             
				projection:'EPSG:4326',                            
				minResolution: 0.0000019073486328125,			minExtent: new OpenLayers.Bounds(-1, -1, 1, 1),
				maxResolution: 0.0078125,			
				maxExtent: new OpenLayers.Bounds(-11.414794921875, 40.371658891506094, -3.768310546875, 45.26715476332791), 
				minZoomLevel: 8,				numZoomLevels: 9,     			units: 'degrees',   
				
				eventListeners: {    
                    "zoomend": controlaCapaConcellos} 
	});     
	
	// CAPAS BASE
	fondo_vacio = new OpenLayers.Layer.GML( 'fondo_vacio', 'openlayers_kml.php', 
		{   format: OpenLayers.Format.KML, 
			visibility: false,        
			draw: false,
			formatOptions: {
				foldersName: 'name',
				foldersDesc:'description',
				extractStyles: true, 
				extractAttributes: true
			 }
		});
		
	satellite = new OpenLayers.Layer.Google('Google Satellite' , {type: G_SATELLITE_MAP, layers: "basic" });     
	gphy = new OpenLayers.Layer.Google( 'Google Physical', {type: G_PHYSICAL_MAP} );
	gmap = new OpenLayers.Layer.Google(	'Google Streets' /* the default */ );
	ghyb = new OpenLayers.Layer.Google(	'Google Hybrid', {type: G_HYBRID_MAP} );                 
	
	wmspnoa = new OpenLayers.Layer.WMS( "WMS PNOA ", "http://www.idee.es/wms/PNOA/PNOA", {layers: 'pnoa', minZoomLevel: 8,                numZoomLevels: 9});
	
	wmssitga = new OpenLayers.Layer.WMS( "WMS SITGA ", "http://ideg.xunta.es/WMS/Request.aspx", {layers: 'CONCELLO',  minZoomLevel: 8,                numZoomLevels: 9});
	
	
	//SIGPAC non ten dispoAible a proxeccion EPSG: 4326
	//wmspnoa = new OpenLayers.Layer.WMS( "SIGPAC WMS", "http://wms.mapa.es/wms/wms.aspx", {layers: 'ORTOFOTOS'} );
	
	
	/* SITGA non ten dispoAible proxeccion EPSG: 4326
	wmspnoa = new OpenLayers.Layer.WMS( "SITGA WMS", "http://ideg.xunta.es/WMS/Request.aspx", {layers: 'ortofotos2003', projection:'EPSG:23029'} );
	*/
	
	// OUTRAS CAPAS
	vlayer = new OpenLayers.Layer.Vector( "Editable", this.options_b); 
	busca_layer = new OpenLayers.Layer.Vector( "layer_pizarra", this.options_b);   
	destaca_layer = new OpenLayers.Layer.Vector( "destaca_layer", this.options_b);
	layer_concellos = new OpenLayers.Layer.Vector("layer_concellos", this.options_concellos);
	
	mi_control = {	point: new OpenLayers.Control.DrawFeature(vlayer,OpenLayers.Handler.Point),
					line: new OpenLayers.Control.DrawFeature(vlayer,OpenLayers.Handler.Path),
					polygon: new OpenLayers.Control.DrawFeature(vlayer,OpenLayers.Handler.Polygon),
					drag: new OpenLayers.Control.DragFeature(vlayer)
	};

	for(var key in mi_control) {	map.addControl(mi_control[key]);	} 

	map.addLayers([  satellite, gphy, gmap, ghyb, wmspnoa, wmssitga, vlayer, busca_layer, destaca_layer, layer_concellos]);
	
	map.setBaseLayer(ghyb);	
		   
	nav = new OpenLayers.Control.NavigationHistory();
	map.addControl(nav); 	// parent control must be added to the map
	
	control_historia_mais_un = new OpenLayers.Control.Panel({div: document.getElementById("historial_das_vistas_despois")});
	control_historia_menos_un = new OpenLayers.Control.Panel({div: document.getElementById("historial_das_vistas_antes")} );
		   
	control_desplaza_mapa   = new OpenLayers.Control.MouseDefaults({displayClass: "DesplazaMapa",title:'Use este control para desplazarse o mapa'});
	control_primer_zoom     = new OpenLayers.Control.ZoomToMaxExtent({displayClass: "ExtendeMapa",title:"Zoom extendido ao máximo"});
	control_area_busca_zoom = new OpenLayers.Control.ZoomBox({displayClass: "ZoomMapa",title:"Zoom box: Seleciona a área do mapa a debuxar"});
	
	//  Ferramenta realizada por Sixtema, far a busca  en  busca_en_box. e obter o resultado que o escribir no div <div id="mapInfo" class="info"></div><!-- end mapInfo -->
	control_area_busca      = new OpenLayers.Control.BoxBusca({displayClass: "BuscaArea",title:"Búsqueda espacial"}); 
	control_mais_zoom       = new OpenLayers.Control.Button ({displayClass: "ZoomMapaMais", title:'Aumenta o zoom', trigger: function (mais_preto) {map.zoomIn(1)} });
	control_menos_zoom      = new OpenLayers.Control.Button ({displayClass: "ZoomMapaMenos", title:'Disminue o zoom', trigger: function (menos_preto) {map.zoomOut(1)} }); 

	control_historia_mais_un.addControls([nav.next]); 
	control_historia_menos_un.addControls([nav.previous]);
	
	map.addControl(control_historia_mais_un);
	map.addControl(control_historia_menos_un); 
	
	var panelB = new OpenLayers.Control.Panel({defaultControl: control_desplaza_mapa, div: document.getElementById("control_mapa")});
	panelB.addControls([control_area_busca, control_primer_zoom, control_area_busca_zoom, control_mais_zoom, control_menos_zoom, control_desplaza_mapa ]);
								  
	map.addControl(panelB);    
	

	this.info = new InfoControl();
	map.addControl(this.info);
	this.info.activate(); 

	
	map.setCenter(new OpenLayers.LonLat( -7.93, 42.85),1); 
	map.zoomOut();
	
	updateFormats();    
 
}     

/********************************************************************************************/

function on_off_capa_base(capa_x)
{

	var nome_capa = capa_x.id;
	nome_capa = nome_capa.split('@@@');
	
	//alert(map.baseLayer.name + ' -> ' + nome_capa);
	
	if ( map.baseLayer.name == "fondo_vacio" ) 
	{
		if(nome_capa[1] == "wmspnoa")
		{

		}else
			map.zoomOut();
	}
	else if (map.baseLayer.name == "PNOA WMS") 
	{
		if(nome_capa[1] == "fondo_vacio")
		{

		}else
			map.zoomOut();
	}
	
	var executa = 'map.setBaseLayer(' + nome_capa[1] + ');';
	eval (executa); 
	
	var viewport = getRawObject('viewport');
	var zoomMovil = getRawObject('zoomMovil');
	zoomMovil.style.left = parseFloat(viewport.style.left) + 'px';
	zoomMovil.style.top = parseFloat(viewport.style.top) + 'px';
	
	myReLoad();
}  

/*****************************************************************************************************/
		
/* on_off_capa - O que fai  activar e desactivar as diferentes capas existentes no mapa (teno que modificala para o caso de ser puntos).
*/     
    function on_off_capa_principal(elemento_capa, id_check){
        elementos=elemento_capa.split('@@@');
        for(i=0;i<elementos.length;i++){                        
            if(elementos[i].visibility == true){
                var elemento = document.getElementById(id_check);
                elementos[i].setVisibility(false);
                if (elemento != null){
                    document.getElementById('img_'+id_check).src= 'images/checkboxes/false.gif'; 
                    elemento.checked = false;
                }   
            }
            else{     
                var elemento = document.getElementById(id_check);
                //var elemento_dialog = document.getElementById('dialog_' + id_check); 
                elementos[i].setVisibility(true); 
                if (elemento != null){  
                    document.getElementById('img_'+id_check).src= 'images/checkboxes/true.gif'; 
                    elemento.checked = true;
                }                      
            } 
        }
    }  

    function on_off_capa(elemento_capa, id_check){                        
        if(elemento_capa.visibility == true){
            var elemento = document.getElementById(id_check);
            elemento_capa.setVisibility(false);
			if (elemento != null){
                if( document.getElementById('img_'+id_check))
                    document.getElementById('img_'+id_check).src= 'images/checkboxes/false.gif';
                if( document.getElementById('img_p'+id_check)) 
                    document.getElementById('img_p'+id_check).src= 'images/checkboxes/false.gif';  
                elemento.checked = false;
            }   
        }
        else{     
            var elemento = document.getElementById(id_check);
            //var elemento_dialog = document.getElementById('dialog_' + id_check); 
            elemento_capa.setVisibility(true); 
            if (elemento != null){
                if( document.getElementById('img_'+id_check))   
                    document.getElementById('img_'+id_check).src= 'images/checkboxes/true.gif';
                if( document.getElementById('img_p'+id_check))   
                    document.getElementById('img_p'+id_check).src= 'images/checkboxes/true.gif';   
                elemento.checked = true;
            }                      
        }//else
		
 		var subcategorias = document.getElementById('subcategorias').value.split(',');
		var auxiliar = "";
		var capa = id_check.split('_');
		var auxiliar2 = capa[1];
		if(auxiliar2 != 'espazo'){
				var xx = 0;
				if(subcategorias[0] != '' && subcategorias.length >1){
					for(var i=0;i<subcategorias.length-1;i++){
						if(subcategorias[i] == auxiliar2){
							xx = 1;
						}else{
							auxiliar += subcategorias[i]+',';
						}//if
					}//for
				}else{
					auxiliar += auxiliar2+',';
					xx = 1;
				}
				if(xx==0){
					auxiliar += auxiliar2+',';
				}
				document.getElementById('subcategorias').value = auxiliar;
		}else{
				var id_concello = document.getElementById('id_concello').value;	
				var auxiliarcon = document.getElementById('selconcellos').value;
				if(id_concello == auxiliarcon){
					document.getElementById('selconcellos').value = "";
				}else{
					document.getElementById('selconcellos').value = id_concello;
				}
				
		}
    } 

/************************************************************************************************************/

/* changeOpacity - O que fai  modular a opacidade da capa referida.
*/  
function changeOpacity(mi_capa) 
{ 
	var nome_capa = mi_capa;
	nome_capa = nome_capa.split('@@@'); 
	var miOpacity = trocaOpacity;
	var variable_valor = 'opacity@@@' + nome_capa[1]; 
	if (nome_capa[0] == 'menos' )
	{
		miOpacity = miOpacity * (-1);
	}        
	var newOpacity = (parseFloat(OpenLayers.Util.getElement(variable_valor).innerHTML) + miOpacity).toFixed(1);
	newOpacity = Math.min(maxOpacity,
					  Math.max(minOpacity, newOpacity));
	OpenLayers.Util.getElement(variable_valor).innerHTML = newOpacity;  
	var executa = nome_capa[1] + '.setOpacity(' + newOpacity + ');';
	eval (executa);
}      



/**********************************************************************************************/
      
/*updateFormats - O Definicin de formatos nos cales imos a traballar dentro da pxina para importar novos datos.
*/  
var formats = null;

function updateFormats() 
{
	var in_options = {
		'internalProjection': map.baseLayer.projection,
		'externalProjection': new OpenLayers.Projection('EPSG:4326')
	};   
	var out_options = {
		'internalProjection': map.baseLayer.projection,
		'externalProjection': new OpenLayers.Projection('EPSG:4326')      /// podese variar a proxeccin destino.
	};
	var gmlOptions = {
		featureType: "feature",
		featureNS: "http://example.com/feature"      //caso de erro.
	};
	var gmlOptionsIn = OpenLayers.Util.extend(
		OpenLayers.Util.extend({}, gmlOptions),
		in_options
	);
	var gmlOptionsOut = OpenLayers.Util.extend(
		OpenLayers.Util.extend({}, gmlOptions),
		out_options
	);
	formats = {
	  'in': {
		wkt: new OpenLayers.Format.WKT(in_options),                 //Formatos que poden ser interesantes. (sobretodo o KML.)
		geojson: new OpenLayers.Format.GeoJSON(in_options),
		georss: new OpenLayers.Format.GeoRSS(in_options),
	   // gml2: new OpenLayers.Format.GML.v2(gmlOptionsIn),
	   // gml3: new OpenLayers.Format.GML.v3(gmlOptionsIn),
		kml: new OpenLayers.Format.KML(in_options)
	  }, 
	  'out': {
		wkt: new OpenLayers.Format.WKT(out_options),
		geojson: new OpenLayers.Format.GeoJSON(out_options),
		georss: new OpenLayers.Format.GeoRSS(out_options), 
	  //  gml2: new OpenLayers.Format.GML.v2(gmlOptionsOut),
	  //  gml3: new OpenLayers.Format.GML.v3(gmlOptionsOut),
		kml: new OpenLayers.Format.KML(out_options)
	  } 
	};
}
