/**
 * Fichero que contiene funciones javascript para el manejo de OL
 * integrado en mapbuilder donde el objeto Map de OL está en config.objects.mainMap.map
 * @author Guadaltel - jenriquesoriano
 */
 
//Capa vector sobre la que se pintan las geometrías
vectorlayer = null;

//Variables para abrir un popup con el feature
var selectControl, selectedFeature, popup,cadena,i;

//Estilos a emplear por las geometrías
layer_style = null;
style_blue = null;
style_green = null;
style_mark = null;

/**
 * Inicializa las variables globales que se van a usar.
 * @author Guadaltel - jenriquesoriano
 */
function initolvars(){
	if(layer_style == null){
		layer_style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
	    layer_style.fillOpacity = 0.2;
	    layer_style.graphicOpacity = 1;
	    layer_style.graphicXOffset = -(layer_style.graphicWidth/2);  // this is the default value
	    layer_style.graphicYOffset = -layer_style.graphicHeight;
	}
	
	if(style_blue == null){
		style_blue = OpenLayers.Util.extend({}, layer_style);
	    style_blue.strokeColor = "blue";
	    style_blue.fillColor = "blue";
	    style_blue.graphicXOffset = -(style_blue.graphicWidth/2);  // this is the default value
	    style_blue.graphicYOffset = -style_blue.graphicHeight;
	}
	
	if(style_green == null){
		style_green = OpenLayers.Util.extend({}, layer_style);
        style_green.strokeColor = "#00FF00";
        style_green.strokeWidth = 3;
		style_green.pointRadius = 6;
	}
	
	if(style_mark == null){
		style_mark = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
	    style_mark.graphicWidth = 24;
	    style_mark.graphicHeight = 20;
	    style_mark.graphicXOffset = -(style_mark.graphicWidth/2);  // this is the default value
	    style_mark.graphicYOffset = -style_mark.graphicHeight;
	    style_mark.externalGraphic = "marker.png";
	}
	
	if(vectorlayer == null){
							
		vectorlayer = new OpenLayers.Layer.Vector("capaVector", {style: layer_style});	
		
		config.objects.mainMap.map.addLayer(vectorlayer);		
		
		selectControl = new OpenLayers.Control.SelectFeature(vectorlayer,
 	                {onSelect: onFeatureSelect});
 	   config.objects.mainMap.map.addControl(selectControl);
 	   selectControl.activate();	
	}else{
		config.objects.mainMap.map.setLayerIndex(vectorlayer, config.objects.mainMap.map.getNumLayers()-1 );
 	    selectControl.activate();
	}

}

/*Funciones para abrir un popup*/

 	        function onPopupClose(evt) {
 	            selectControl.unselect(selectedFeature);
 	        }
 	        
 	        function onFeatureSelect(feature) {
 	            selectedFeature = feature;
	            /*DLR_MA_PATCH_INFO cadena ="<div style='font-size:.8em' class='informacion'>";
	            cadena=cadena+"<div class='titulo_informacion'> <img src='/callejero/moduloSIG/img/cerrar2.png' style='cursor: pointer;'/></div>";
	            cadena=cadena+"<div class='contenido_informacion'>";
	            */
	            cadena = "";
	            
	            /*DLR_PATCH_INFO cadena = cadena+"<div ";
	            cadena = cadena+"<div id='featureList' style='overflow: auto; vertical-align: top;'>";
	            */
	            /*<br/>*/ 
	            cadena= cadena+"<table width='100%' cellspacing='0' cellpadding='0' border='0'>"; /*<tbody>*/

				//cadena=cadena+"<tr><td><b>Feature:</b></td><td>"+feature.id+"</td></tr>";
				var n =""+feature.attributes.nombre+"";
				if(n != "undefined")
					cadena=cadena+"<tr><td><b>Nombre:</b></td><td>"+feature.attributes.nombre+"</td></tr>";
				var l =""+feature.attributes.localidad+"";
				if(l != "undefined")
					cadena=cadena+"<tr><td><b>Localidad:</b></td><td>"+feature.attributes.localidad+"</td></tr>";
				var u =""+feature.attributes.direccion+"";
				if(u != "undefined")
					cadena=cadena+"<tr><td><b>Direcci&oacute;n:</b></td><td>"+feature.attributes.direccion+"</td></tr>";
				var t =""+feature.attributes.telefono+"";
				if(t != "undefined")
					cadena=cadena+"<tr><td><b>Tel&eacute;fono:</b></td><td>"+feature.attributes.telefono+"</td></tr>";
				/*DLR_PATCH_INFO
				cadena=cadena+"<tr><td><b>Geometr&iacute;a:</b></td><td>"+feature.geometry+"</td></tr>";
				*/

				cadena=cadena+"<tr height='5'><td colspand='2'/></tr>"; /*</tbody>*/
	           
	            cadena = cadena + "</table>";
	            //DLR_PATCH_INFO cadena = cadena + "</div>";
	           	
	           	/*DLR_MA_PATCH_INFO  cadena=cadena+"</div>";
	           cadena=cadena+"</div>"; 
	            
	            popup = new OpenLayers.Popup("infoLocalizacion",
	            feature.geometry.getBounds().getCenterLonLat(),
	            new OpenLayers.Size(300,196),
	            cadena,
	            true, 
	            onPopupClose);
	            
 	            
	            feature.popup = popup;
 	            config.objects.mainMap.map.addPopup(popup);
 	            */
 	           abrirVentanaInformacion();
 	           
	           document.getElementById("featureList").innerHTML = cadena;
 	        }
 	        
 	        /*DLR_MA_PATCH_INFO function onFeatureUnselect(feature) {
 	            config.objects.mainMap.map.removePopup(feature.popup);
 	            feature.popup.destroy();
 	            feature.popup = null; 
 	            cerrarVentanaInformacion();
 	        }    */
/**
 * Función que pinta un multipunto sobre la capa vector
 *
 * @author Guadaltel - jenriquesoriano
 * @param cadena con los puntos a pintar en el formato x1,y1 x2,y2 x3,y3
 */
function drawmultipoint(strmultipoint){
	var pointlist = [];
	var arraypoint = strmultipoint.split(" ");
	var coord = null;
	var newpoint = null;
	var multipoint = null;
	var multipointfeature = null;
	
	initolvars();
	
	for(var p = 0; p < arraypoint.length; p++) {
		coord = arraypoint[p].split(",");
		newpoint = new OpenLayers.Geometry.Point(coord[0], coord[1]);
		alert(coord[0]);
		alert(coord[1]);
		pointlist.push(newpoint);
 	}
	multipoint = new OpenLayers.Geometry.MultiPoint(pointlist);
	multipointfeature = new OpenLayers.Feature.Vector(multipoint,null,style_blue);
	
	vectorlayer.addFeatures([multipointfeature]);
	
 	   
}	

/**
 * Función que pinta un multipunto sobre la capa vector con informacion
 *
 * @author Guadaltel - jenriquesoriano
 * @param cadena con los puntos a pintar en el formato x1,y1 x2,y2 x3,y3
 */
function drawmultipoint(strmultipoint,nombre,localidad,direccion,telefono){
	var pointlist = [];
	var arraypoint = strmultipoint.split(" ");
	var coord = null;
	var newpoint = null;
	var multipoint = null;
	var multipointfeature = null;
	
	initolvars();
	
	for(var p = 0; p < arraypoint.length; p++) {
		coord = arraypoint[p].split(",");
		newpoint = new OpenLayers.Geometry.Point(coord[0], coord[1]);
		pointlist.push(newpoint);
 	}
	multipoint = new OpenLayers.Geometry.MultiPoint(pointlist);
	multipointfeature = new OpenLayers.Feature.Vector(multipoint,{"nombre": nombre, "localidad": localidad, "direccion": direccion, "telefono": telefono},style_blue);
	
	vectorlayer.addFeatures([multipointfeature]);
	
 	   
}	



/**
 * Función que pinta una multilínea sobre la capa vector
 *
 * @author Guadaltel - jenriquesoriano
 * @param cadena con los puntos a pintar en el formato x11,y11 x12,y12 x13,y13_x21,y21 x22,y22 x23,y23
 */
function drawmultiline(strmultipoint){

	var linelist = [];
	var arrayline = null;
	var arraypoint = null;
	var coord = null;
	var newpoint = null;
	var multiline = null;
	var multilinefeature = null;
	
	initolvars();
	
	arrayline = strmultipoint.split("_");
	for(var q = 0; q < arrayline.length; q++){
		var pointlist = [];
		arraypoint = arrayline[q].split(" ");
		for(var p = 0; p < arraypoint.length; p++) {
			coord = arraypoint[p].split(",");
			newpoint = new OpenLayers.Geometry.Point(coord[0], coord[1]);
			pointlist.push(newpoint);
	 	}
		line = new OpenLayers.Geometry.LineString(pointlist);
		linelist.push(line);
	}
	multiline = new OpenLayers.Geometry.MultiLineString(linelist);	
	multilinefeature = new OpenLayers.Feature.Vector(multiline,null,style_green);
	
	vectorlayer.addFeatures([multilinefeature]);
}	
	
/**
 * Función que pinta una multilínea sobre la capa vector
 *
 * @author Guadaltel - jenriquesoriano
 * @param cadena con los puntos a pintar en el formato x11,y11 x12,y12 x13,y13_x21,y21 x22,y22 x23,y23
 */
function drawmultipolygon(strmultipolygon){

	var polygonlist = [];
	var arraypolygon = null;
	var arraypoint = null;
	var coord = null;
	var newpoint = null;
	var newpolygon = null;
	var multipolygon = null;
	var multipolygonfeature = null;
	
	initolvars();
	
	arraypolygon = strmultipolygon.split("_");
	for(var q = 0; q < arraypolygon.length; q++){
		var pointlist = [];
		arraypoint = arraypolygon[q].split(" ");
		for(var p = 0; p < arraypoint.length; p++) {
			coord = arraypoint[p].split(",");
			newpoint = new OpenLayers.Geometry.Point(coord[0], coord[1]);
			pointlist.push(newpoint);
	 	}
		linearring = new OpenLayers.Geometry.LinearRing(pointlist);
		newpolygon = new OpenLayers.Geometry.Polygon(linearring);
		polygonlist.push(newpolygon);
	}
	multipolygon = new OpenLayers.Geometry.MultiPolygon(polygonlist);	
	multipolygonfeature = new OpenLayers.Feature.Vector(multipolygon);
	
	vectorlayer.addFeatures([multipolygonfeature]);
}	

	
/**
 * Función que borra la capa vector
 *
 * @author Guadaltel - jenriquesoriano
 */
function eraselayer(){
	if ( vectorlayer != null ){
		vectorlayer.destroyFeatures();
		puntoX = "undefined";
		puntoY = "undefined";
	}
}

/**
 * Función que cambia el estilo de una capa
 *
 * @author Guadaltel - jenriquesoriano
 */
function changelayersld(){
	var map = config.objects.mainMap.map;
	var arraylayers = map.layers;
	var capa = null;
	var idcapa = null;
	var nombrecapa = null;
	var estilo = null;
	var repintado = false;
	for(var i=0; i<arraylayers.length; i++){
		var parametros = null;
		capa = arraylayers[i];
		parametros = capa.params;
		nombrecapa = parametros.LAYERS;
		estilo = parametros.STYLES;
		idcapa = capa.id;
		if(nombrecapa == "topp:tasmania_cities"){
//			capa.params.STYLES = "point";
//			repintado = capa.redraw(true);
			parametros.STYLES = "point";
			repintado =	capa.mergeNewParams(parametros);
		}
	}
}
	
function comentar(){	
    map = new OpenLayers.Map('map');
    var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
            "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
    map.addLayer(layer);

    /*
     * Layer style
     */
    // we want opaque external graphics and non-opaque internal graphics
    var layer_style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
    layer_style.fillOpacity = 0.2;
    layer_style.graphicOpacity = 1;

    /*
     * Blue style
     */
    var style_blue = OpenLayers.Util.extend({}, layer_style);
    style_blue.strokeColor = "blue";
    style_blue.fillColor = "blue";

    /*
     * Green style
     */
    var style_green = {
        strokeColor: "#00FF00",
        strokeWidth: 3,
        pointRadius: 6,
        pointerEvents: "visiblePainted"
    };

    /*
     * Mark style
     */
    var style_mark = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
    // each of the three lines below means the same, if only one of
    // them is active: the image will have a size of 24px, and the
    // aspect ratio will be kept
    // style_mark.pointRadius = 12;
    // style_mark.graphicHeight = 24; 
    // style_mark.graphicWidth = 24;

    // if graphicWidth and graphicHeight are both set, the aspect ratio
    // of the image will be ignored
    style_mark.graphicWidth = 24;
    style_mark.graphicHeight = 20;
    style_mark.graphicXOffset = -(style_mark.graphicWidth/2);  // this is the default value
    style_mark.graphicYOffset = -style_mark.graphicHeight;
    style_mark.externalGraphic = "../img/marker.png";

    var vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry", {style: layer_style});

    // create a point feature
    var point = new OpenLayers.Geometry.Point(-111.04, 45.68);
    var pointFeature = new OpenLayers.Feature.Vector(point,null,style_blue);
    var point2 = new OpenLayers.Geometry.Point(-105.04, 49.68);
    var pointFeature2 = new OpenLayers.Feature.Vector(point2,null,style_green);
    var point3 = new OpenLayers.Geometry.Point(-105.04, 49.68);
    var pointFeature3 = new OpenLayers.Feature.Vector(point3,null,style_mark);

    // create a line feature from a list of points
    var pointList = [];
    var newPoint = point;
    for(var p=0; p<5; ++p) {
        newPoint = new OpenLayers.Geometry.Point(newPoint.x + Math.random(1),
                                                 newPoint.y + Math.random(1));
        pointList.push(newPoint);
    }
    var lineFeature = new OpenLayers.Feature.Vector(
        new OpenLayers.Geometry.LineString(pointList),null,style_green);

    // create a polygon feature from a linear ring of points
    var pointList = [];
    for(var p=0; p<6; ++p) {
        var a = p * (2 * Math.PI) / 7;
        var r = Math.random(1) + 1;
        var newPoint = new OpenLayers.Geometry.Point(point.x + (r * Math.cos(a)),
                                                     point.y + (r * Math.sin(a)));
        pointList.push(newPoint);
    }
    pointList.push(pointList[0]);

    var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
    var polygonFeature = new OpenLayers.Feature.Vector(
        new OpenLayers.Geometry.Polygon([linearRing]));


    map.addLayer(vectorLayer);
    map.setCenter(new OpenLayers.LonLat(point.x, point.y), 5);
    vectorLayer.addFeatures([pointFeature, pointFeature3, pointFeature2, lineFeature, polygonFeature]);
}

