var LAT_DEFECTO = 37.765694;
var LON_DEFECTO = -3.789597;
var ZOOM_DEFECTO = 15;
var ICONO_SOMBRA = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
//var ICONO_BLANCO = "http://labs.google.com/ridefinder/images/mm_20_white.png";
var ICONO_BLANCO_POS = "./images/blank.png";
//var ICONO_BLANCO = "/images/mm_20_white.png";
var ICONO_BLANCO = "http://labs.google.com/ridefinder/images/mm_20_white.png";
var LINE_WEIGHT = 4;
var LINE_ZOOM = 32;
var LINE_NUMLEVEL = 4;
var POINT_LEVEL = 3;
var ACCION_ACT = "/capa/actualizar.do";
var ACT_PUNTO_INS = 0;
var ACT_PUNTO_UPD = 1;
var ACT_PUNTO_DEL = 2;
var ACT_PUNTO_QRY = 3;
    
function createContextMenu(map){
    var contextmenu = document.createElement("div");
    contextmenu.style.visibility="hidden";
    contextmenu.style.background="#f2f2f2";
    contextmenu.style.border="1px solid #8888FF";     

    map.getContainer().appendChild(contextmenu);
    GEvent.addListener(map,"singlerightclick",function(pixel,tile,marker){        
        if (marker.getIcon() != null){
            contextmenu.innerHTML = marker.getIcon().id;
            clickedPixel = pixel;
            var x=pixel.x;
            var y=pixel.y;
            if (x > map.getSize().width - 120){ 
                x = map.getSize().width - 120 
            }
            if (y > map.getSize().height - 100){ 
                y = map.getSize().height - 100 
            }
            var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(x,y));  
            pos.apply(contextmenu);
            contextmenu.style.visibility = "visible";
        }
    });
    GEvent.addListener(map, "click", function(){
        contextmenu.style.visibility="hidden";
    });
}




/**
 * Crear el mapa
 * @return Mapa creado
 * @param center_lat Latitud inicial del centro del mapa
 * @param center_lon Longitud inicial del centro del mapa
 * @param zoom Zoom inicial del mapa
 */
function crearMapa(center_lat, center_lon, zoom) {
   	 alert('hola');   
    if (GBrowserIsCompatible()) {
         alert('hola');   
        //Crear mapa
        var map = new GMap2(document.getElementById("map_canvas"));
        //createContextMenu(map);
            
        //Centrar
        if (center_lat == null){
            center = new GLatLng(LAT_DEFECTO, LON_DEFECTO);
        }else{
            center = new GLatLng(center_lat, center_lon);
        }
        //Zoom
        if (zoom == null){
            map.setCenter(center, ZOOM_DEFECTO);
        }else{
            map.setCenter(center, zoom);
        }
        //Agregar controles del mapa (zoom y tipo)
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
        //Establecer el tipo
        map.setMapType(G_NORMAL_MAP);
            
        return map;
    }else{
        return null;
    }
}

/**
 * Crear el mapa
 * @return Mapa creado
 * @param center_lat Latitud inicial del centro del mapa
 * @param center_lon Longitud inicial del centro del mapa
 * @param zoom Zoom inicial del mapa
 */
function crearMapa_click(center_lat, center_lon, zoom) {

    if (GBrowserIsCompatible()) {
        var map = new GMap2(document.getElementById("map_canvas"));
        var center = new GLatLng(center_lat, center_lon);
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
        map.setMapType(G_NORMAL_MAP);
        map.setCenter(center, zoom);
                    
		var icono=crearIconoId("id","null");
		dibujarPunto(map,icono,center_lat,center_lon,"","","");
		
        GEvent.addListener(map, "click", function(overlay, point){
        	var xyz=geographicToUTM(point.y,point.x);
			document.getElementsByName("x")[0].value=xyz[0];
			document.getElementsByName("y")[0].value=xyz[1];
			document.getElementsByName("zona")[0].value=xyz[2];
            map.clearOverlays();
            
            var icono=crearIconoId("id","null");
            dibujarPunto(map,icono,point.y,point.x,"","","");
        });
        
        return map;
    }else{
        return null;
    }
}

/**
 * Crear el mapa
 * @return Mapa creado
 * @param center_lat Latitud inicial del centro del mapa
 * @param center_lon Longitud inicial del centro del mapa
 * @param zoom Zoom inicial del mapa
 */
function crearMapaItinerario(center_lat, center_lon, zoom) {
    if (GBrowserIsCompatible()) {
        var map = new GMap2(document.getElementById("map_canvas"));
        var center = new GLatLng(center_lat, center_lon);
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
        map.setMapType(G_NORMAL_MAP);
        map.setCenter(center, zoom);

        GEvent.addListener(map, "click", function(overlay, point){
            document.getElementsByName("accion")[0].value = "nuevotramo";
            document.getElementsByName("lat")[0].value = point.y;
            document.getElementsByName("lon")[0].value = point.x;
            document.getElementsByName("latmapa")[0].value = map.getCenter().lat();
            document.getElementsByName("lonmapa")[0].value = map.getCenter().lng();
            document.getElementsByName("zoommapa")[0].value = map.getZoom();
            document.forms[0].submit();
        });
        
        return map;
    }else{
        return null;
    }
}

/**
 * Destruir el mapa solo si existe
 */
function destruirMapa(){
    if (document.getElementById("map_canvas") != null){
        GUnload();
    }
}

/** 
 * Crear icono
 * @return Marcador creado
 * @param pos Identificador de la posicion que ocupa
 * @param ident Identificador del cliente remoto
 * @param path Imagen del icono
 */
function crearIcono(path, ident, pos){
    var icon = new GIcon(G_DEFAULT_ICON);
        
    //Establecer el identificador del icono
    GIcon.prototype.id = null;
    //Establecer la posicion del icono
    GIcon.prototype.pos = pos;
    GIcon.prototype.ident = ident;
        
    if (path == "null"){
        icon.image = ICONO_BLANCO_POS;
    }else{
        icon.image = path;
    }
        
    //Parametros de aspecto del icono
    /*icon.shadow = ICONO_SOMBRA;
        icon.iconSize = new GSize(12, 20);
        icon.shadowSize = new GSize(22, 20);
        icon.iconAnchor = new GPoint(6, 20);
        icon.infoWindowAnchor = new GPoint(5, 1);*/

    return icon;
}

/** 
 * Crear icono con un identificador
 * @return Marcador creado
 * @param id identificador del icono
 * @param path Imagen del icono
 */
function crearIconoId(id, path){

    var icon = new GIcon(G_DEFAULT_ICON);

    //Establecer el identificador del icono
    GIcon.prototype.id = id;
    //Establecer la posicion del icono
    GIcon.prototype.pos = null;
    GIcon.prototype.ident = null;
        
    if (path == "null"){
        icon.image = ICONO_BLANCO;
    }else{
        icon.image = path;
    }
        
    //icon.shadow = ICONO_SOMBRA;
    //Parametros de aspecto del icono
    icon.shadow = null;
    icon.iconSize = new GSize(20, 20);
    //icon.shadowSize = new GSize(22, 20);
    icon.iconAnchor = new GPoint(10, 20);
    icon.infoWindowAnchor = new GPoint(5, 1);        

    return icon;
}

/** 
 * Dibujar un icono en el mapa
 * @param map Mapa
 * @param icono Icono a ubicar
 * @param lat Latitud del punto
 * @param lon Longitud del punto
 * @param nombre Nombre del elemento
 * @param texto Texto a mostrar en el icono. Si no se pasa no se muestra mensaje
 * @param accion Accion a realizar sobre el icono
 */
function dibujarPunto(map, icono, lat, lon, nombre, texto, accion){

    //Crear el marcador con el icono en la posicion determinada
    var markerOptions = { icon:icono };
    var point = new GLatLng(lat, lon);
    var marker = new GMarker(point, markerOptions);
        
    //Si no se especifica accion o es una consulta hay que mostrar la informacion
    //Si se esta insertando no se hace nada
    //Si se esta editando hay
    if ((dibujarPunto.arguments.length == 6) || (accion == ACT_PUNTO_QRY)){
        //Texto a mostrar
        var html = "<b>Lat.: </b>" + lat + "<br>" 
            + "<b>Lon.: </b>" + lon + "<br>";
        //El icono tiene ident - es un cliente remoto
        if (icono.ident != null){
            //Identificador de cliente
            html = html + "<b>Id.: </b>" + icono.ident;
        }else{                
            //Nombre del objeto
            html = html + "<b>Nombre: </b>" + nombre;
        }
        html = html + texto;
        //El icono pertenece a una posicion - hay que poner opcion SMS
        if (icono.pos != null){                
            //Link a envio mensajes
            //html = html + "<br><a href='../GestionSMS?id=" + icono.pos + "'>ENVIAR</a>";                
            html = html + "<br><input type='button' value='ENVIAR SMS' onclick='enviarSms(" + icono.pos + ")'/>";                
        }
        GEvent.addListener(marker, "click", function(){marker.openInfoWindowHtml(html);});
    }else if (accion == ACT_PUNTO_UPD){
        var url = "../punto/editar.do?id=" + icono.id;
        GEvent.addListener(marker, "click", function(){                
            //var prompt = new Prompt("Nombre", nombre, url);
            //prompt.popup();
            location.href = url;
        });
    }else if (accion == ACT_PUNTO_DEL){
        //Texto a mostrar
        var html = "<b>Nombre: </b>" + nombre + "<br>"
                  + "<b>Lat.: </b>" + lat + "<br>" 
                  + "<b>Lon.: </b>" + lon + "<br>"
                  + texto;
        //Link eliminar
        html = html + "<br><div align='center'>"
              + "<input type='button' value='ELIMINAR' onclick='eliminar(" + icono.id + ")'/>"
              + "</div>"
        GEvent.addListener(marker, "click", function(){marker.openInfoWindowHtml(html);});
    }

    //Agregar al mapa
    map.addOverlay(marker);
}

/** 
 * Dibujar un icono en el mapa
 * @param map Mapa
 * @param icono Icono a ubicar
 * @param lat Latitud del punto
 * @param lon Longitud del punto
 * @param nombre Nombre del elemento
 * @param texto Texto a mostrar en el icono. Si no se pasa no se muestra mensaje
 * @param accion Accion a realizar sobre el icono
 */
function dibujarPuntoRuta(map, icono, lat, lon, nombre, texto, accion){
    //Crear el marcador con el icono en la posicion determinada
    var markerOptions = { icon:icono };
    var point = new GLatLng(lat, lon);
    var marker = new GMarker(point, markerOptions);
        
    //Si no se especifica accion o es una consulta hay que mostrar la informacion
    //Si se esta insertando no se hace nada
    //Si se esta editando hay
    if ((dibujarPuntoRuta.arguments.length == 6) || (accion == ACT_PUNTO_QRY)){
        var idIcono = icono.id;
        GEvent.addListener(marker, "click", function(){             
            document.getElementsByName("idTmp")[0].value = idIcono;
            document.getElementsByName("accion")[0].value = "guardarpunto";
            document.forms[0].submit();
          
        });
    }else {
        var idIcono = icono.id;
        GEvent.addListener(marker, "click", function(){     
            document.getElementsByName("idTmp")[0].value = idIcono;
            document.getElementsByName("accion")[0].value = "puntotramo";
            document.forms[0].submit();
        });
    }

    //Agregar al mapa
    map.addOverlay(marker);
}

/**
 * Prepara el mapa para la insercion
 * @param map Mapa actual
 */
function insertarObj(map){        
    GEvent.addListener(map, "click", function(overlay, point){
        /*var name = prompt("Nombre", "");
		location.href = ACCION_ACT
                                + "?nom=" + name 
                                + "&pos_x=" + point.x 
                                + "&pos_y=" + point.y
                                + "&zoom=" + map.getZoom()
                                + "&c_lat=" + map.getCenter().lat()
                                + "&c_lon=" + map.getCenter().lng();*/
        var url = ACCION_ACT
            + "?pos_x=" + point.x 
            + "&pos_y=" + point.y
            + "&zoom=" + map.getZoom()
            + "&c_lat=" + map.getCenter().lat()
            + "&c_lon=" + map.getCenter().lng();
        var prompt = new Prompt("Nombre", "", url);
        prompt.popup();
    });
}

/** 
 * Dibujar una ruta en el mapa
 * @param map Mapa
 * @param color Color de la ruta
 * @param points Puntos a mostrar
 */
function dibujarRuta(map, color, points){    
    var i = 0;

    var plat = 0;
    var plng = 0;

    var encoded_points = "";
    var encoded_levels = "";
    
    for(i = 0; i < points.length; ++i) {      
        var point = points[i];
        var lat = point.Latitude;
        var lng = point.Longitude;
        var level = point.Level;
        
        var late5 = Math.floor(lat * 1e5);
        var lnge5 = Math.floor(lng * 1e5);

        dlat = late5 - plat;
        dlng = lnge5 - plng;

        plat = late5;
        plng = lnge5;

        encoded_points += encodeSignedNumber(dlat) + encodeSignedNumber(dlng);
        encoded_levels += encodeNumber(level);            
    }
        
    if (points.length > 1) {
        if (color == ""){
            color = "#000000";
        }
        var ruta = new GPolyline.fromEncoded({color: color,    
            weight: LINE_WEIGHT,    
            points: encoded_points,    
            levels: encoded_levels,    
            zoomFactor: LINE_ZOOM,    
            numLevels: LINE_NUMLEVEL});

        //Agregar al mapa
        map.addOverlay(ruta);
    }
}

// Creates a point and adds it to both the polyline and the list.
function createPoint(points, lat, lng) {
    var newPoint = {
        Latitude: lat,
        Longitude: lng,
        Level: POINT_LEVEL
    };

    points.push(newPoint);
}


// Encode a signed number in the encode format.
function encodeSignedNumber(num) {
    var sgn_num = num << 1;

    if (num < 0) {
        sgn_num = ~(sgn_num);
    }

    return(encodeNumber(sgn_num));
}

// Encode an unsigned number in the encode format.
function encodeNumber(num) {
    var encodeString = "";

    while (num >= 0x20) {
        encodeString += (String.fromCharCode((0x20 | (num & 0x1f)) + 63));
        num >>= 5;
    }

    encodeString += (String.fromCharCode(num + 63));
    return encodeString;
}


//Localiza una direccion en el mapa
function showAddress(zoom){
	
	var direccion = document.getElementById("direccionPOI").value;
	var terminoMunicipal = getNombreLocalidad(document.getElementById("selectTerminoMunicipal").value);
	var address = direccion+", "+terminoMunicipal;
	var geocoder = null;
	geocoder = new GClientGeocoder();
	
	if (geocoder) {
		geocoder.getLatLng(address,
			function(point) {
				if (!point) {
					alert(address + " no encontrada");
				} else {
					var map = crearMapa_click(point.y,point.x,zoom);
					map.clearOverlays();
					var icono=crearIconoId("id","null");
					dibujarPunto(map,icono,point.y,point.x,"","","");
					
					var xyz=geographicToUTM(point.y,point.x);
					
					document.getElementsByName("x")[0].value = xyz[0];
					document.getElementsByName("y")[0].value = xyz[1];
					document.getElementsByName("zona")[0].value=xyz[2];
				}
			}
		);
	}
}



//Localiza unas coordenadas
function showCoordinates(){
	
	var x = document.getElementById("coordX").value;
	var y = document.getElementById("coordY").value;
	var zona = document.getElementById("zona").value;
	
	var latlon=UTMToGeographic(y,x,zona);

    crearMapa_click(latlon[0],latlon[1],15);
}

