package com.algobase.activity;

import java.io.File;
import java.util.List;
import java.util.Locale;

import android.app.Dialog;
/*
import android.app.Activity;
*/

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.DialogInterface;

import android.graphics.Canvas;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.drawable.GradientDrawable;


import android.location.Location;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Build;

import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.LayoutInflater;

import android.widget.LinearLayout;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.ImageView;
import android.widget.ImageButton;
import android.widget.Toast;

/*
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;
*/


import com.algobase.stracks.sTracksRoot;
import com.algobase.stracks.sTracksActivity;

import com.algobase.share.dialog.*;
import com.algobase.share.system.*;
import com.algobase.share.network.*;
import com.algobase.share.geo.*;
import com.algobase.share.maps.*;
import com.algobase.share.compat.*;

import com.algobase.share.compat.Activity;

import com.algobase.map.*;

import com.algobase.stracks.R;

/*
import androidx.fragment.app.FragmentActivity;
public class WayPointMapActivity extends FragmentActivity 
*/

public class WayPointMapActivity extends Activity 
{

 class OverlayPoint implements MyMapView.IMapOverlay 
 {
    WayPointMapActivity root;
    Paint   paint;

    double current_lat = 0;
    double current_lon = 0;
    double current_alt = 0;

    Bitmap wpBitmap;

    double home_lat = 0;
    double home_lon = 0;

    double wp_lat = 0;
    double wp_lon = 0;

    Bitmap homeBitmap;

    float node_width = 12;
 
    boolean invalid = false;
    boolean locked = false;
    
    MyMapView map_view;

    public double getCurrentLongitude() { return current_lon; }
    public double getCurrentLatitude() { return current_lat; }

    @Override
    public void invalidate() { invalid = true; }

    @Override
    public boolean isInvalid() { return invalid; }

    @Override
    public void setMapView(MyMapView mview) { map_view = mview; }

    public void lock() { locked = true; }
    public void unlock() { locked = false; }

    public Location getCurrentLocation()
    { Location loc =  new Location("map");
      loc.setLatitude(current_lat);
      loc.setLongitude(current_lon);
      loc.setAltitude(current_alt);
      return loc;
     }
 

    public OverlayPoint(WayPointMapActivity r) 
    { root = r;
      paint = new Paint();
      paint.setDither(true);
      paint.setAntiAlias(true);
      paint.setColor(Color.RED);
      paint.setStrokeJoin(Paint.Join.ROUND);
      paint.setStrokeCap(Paint.Cap.ROUND);
      paint.setStyle(Paint.Style.STROKE);
      paint.setStrokeWidth(1);
     }

    void window_coords(double[] lat, double[] lon)
    { int width = map_view.getWidth();
      int height = map_view.getHeight();

      Location top_left = map_view.fromPixels(0,0);
      Location bot_right = map_view.fromPixels(width-1,height-1);

      lon[0] = top_left.getLongitude();
      lon[1] = bot_right.getLongitude();
      lat[0] = bot_right.getLatitude();
      lat[1] = top_left.getLatitude();
    }

    public void set_node_width(float w) { node_width = w; }

    public void setPoint(Location loc,boolean anim)
    { current_alt = loc.getAltitude();
      setPoint(loc.getLatitude(),loc.getLongitude(),anim); 
     }

    public void setPoint(double lat, double lon, boolean anim)
    { current_lat = lat;
      current_lon = lon;

      if (locked) return;

      if (anim)
        map_view.zoomToFit(lat-0.01,lon-0.01,lat+0.01,lon+0.01);
      else
        map_view.setCenter(lat,lon);
   
    }

    public void setAltitude(double alt) { current_alt = alt; }
    public double getAltitude() { return current_alt; }

    public void setHomePoint(Location loc)
    { 
      if (loc != null)
      { home_lat = loc.getLatitude();
        home_lon = loc.getLongitude();
       }
      else
      { home_lat = 0;
        home_lon = 0;
       }
     }

    public void setWayPoint(Location loc)
    { if (loc != null)
      { wp_lat = loc.getLatitude();
        wp_lon = loc.getLongitude();
        current_alt = loc.getAltitude();
       }
      else
      { wp_lat = 0;
        wp_lon = 0;
       }
     }

    public void setHomeBitmap(int res) { 
      homeBitmap = BitmapFactory.decodeResource(getResources(),res);
    }

    public void setWpBitmap(int res) { 
      wpBitmap = BitmapFactory.decodeResource(getResources(),res);
    }



   void drawTile(Canvas canvas, String tile, boolean highlighted)
   { 
     if (tile.equals("")) return;

     int lat = Integer.parseInt(tile.substring(1,3)); 
     if (tile.substring(0,1).equals("S")) lat = -lat;
     int lon = Integer.parseInt(tile.substring(4,7)); 
     if (tile.substring(3,4).equals("W")) lon = -lon;

     Path path = new Path();

     Point p = new Point();
     map_view.toPixels(lat,lon,p);
     path.moveTo(p.x,p.y);

     Point q = new Point();
     map_view.toPixels(lat,lon+1,q);
     path.lineTo(q.x,q.y);

     int width = q.x - p.x;

     map_view.toPixels(lat+1,lon+1,p);
     path.lineTo(p.x,p.y);

     map_view.toPixels(lat+1,lon,p);
     path.lineTo(p.x,p.y);

     path.close();

     paint.setStyle(Paint.Style.FILL);
     paint.setARGB(100,150,150,150);
     if (highlighted) paint.setARGB(128,255,0,0);
     canvas.drawPath(path,paint);
  
     paint.setStrokeWidth(3);
     paint.setStyle(Paint.Style.STROKE);
     paint.setColor(Color.BLUE);
     canvas.drawPath(path,paint);

     map_view.toPixels(lat+0.5,lon+0.5,p);
     paint.setStyle(Paint.Style.FILL);
     paint.setTextAlign(Align.CENTER);
     paint.setTextSize((int)(width/4.5f));
     //paint.setColor(Color.YELLOW);
     paint.setColor(Color.rgb(255,255,128));
     canvas.drawText(tile,p.x,p.y,paint);
   }

    public void drawSRTM3(Canvas canvas) 
    {
      if (locked) return;

      double Lat[] = new double[2];
      double Lon[] = new double[2];

      window_coords(Lat,Lon);

      double span = Lon[1] - Lon[0];

      if (span > 0.5 && span < 50)
      { 
        File[] files = root.get_srtm3_folder().listFiles();
        for(int i=0; i<files.length; i++)
        { String tile = files[i].getName().replace(".hgt.zip","");
          drawTile(canvas,tile,false);
        }

        //drawTile(canvas,root.get_selected_tile(),true);
      }
   }



    public void drawGrid(Canvas canvas) 
    {
      if (locked) return;

      float pix = display_width/100;

      double Lat[] = new double[2];
      double Lon[] = new double[2];
      window_coords(Lat,Lon);

      double lon1 = Lon[0];
      double lon2 = Lon[1];
      double lat1 = Lat[0];
      double lat2 = Lat[1];

    //float max_lines = 15;
      float max_lines = 1.2f * node_width;

      double d = 1.0/1200; // 3sec
      if ((lat2-lat1)/d > max_lines) return;



      if (map_view.isSatellite())
        paint.setARGB(255,255,255,200);
      else
        paint.setARGB(128,64,64,64);

      paint.setStrokeWidth((int)(0.5 +pix/2.5));


      lon1 = Math.floor(1200*lon1 + 0.5)/1200.0;
      lat1 = Math.floor(1200*lat1 + 0.5)/1200.0;

      int n = (int)(2 + (lat2-lat1)/d) * (int)(2 + (lon2-lon1)/d);

      float[]  coords = new float[8*n];
      int i = 0;
      Point p = new Point();
      for(double lat=lat1; lat <= lat2; lat+=d) {
        for(double lon=lon1; lon <= lon2; lon+=d)
        { map_view.toPixels(lat,lon,p);
          coords[i++] = p.x-pix; coords[i++] = p.y;
          coords[i++] = p.x+pix; coords[i++] = p.y;
          coords[i++] = p.x;   coords[i++] = p.y-pix;
          coords[i++] = p.x;   coords[i++] = p.y+pix;
         }
      }

     canvas.drawLines(coords,0,i,paint);
  }



    public void drawCurrentPoint(Canvas canvas, double lat, double lon, 
                                                            double alt)
    {    	
      final boolean crosshairs = false;

      Point p = new Point();
      map_view.toPixels(lat,lon,p);

      paint.setStyle(Paint.Style.STROKE);
      paint.setStrokeWidth(node_width/4);

      if (map_view.isSatellite())
        paint.setColor(Color.YELLOW);
      else
        paint.setARGB(128,64,64,64);

      if (crosshairs)
      { float w = node_width;
        int d = 2000;
        canvas.save();
        canvas.translate(p.x,p.y);
        canvas.drawLine(w,0,d,0,paint);
        canvas.drawLine(-w,0,-d,0,paint);
        canvas.drawLine(0,w,0,d,paint);
        canvas.drawLine(0,-w,0,-d,paint);
        canvas.restore();
        canvas.drawCircle(p.x, p.y, node_width, paint);
      }

/*
      paint.setARGB(128,255,0,0);
      paint.setStyle(Paint.Style.FILL);
      canvas.drawCircle(p.x, p.y, node_width, paint);
*/
    
      if (map_view.isSatellite())
        paint.setColor(Color.YELLOW);
      else
        paint.setColor(Color.BLACK);


      paint.setStyle(Paint.Style.FILL);
      paint.setTextSize(3.5f*node_width);

      if (map_view.isSatellite())
        paint.setColor(Color.YELLOW);
      else
        paint.setColor(Color.BLUE);

      float nw = node_width;

      paint.setTextAlign(Align.LEFT);
      canvas.drawText(format("%8.5f",lat),nw,p.y-0.75f*nw,paint);

      if (current_alt > 0)
      canvas.drawText(format("%.0f m",current_alt),p.x+1.2f*nw,
                                                          p.y-0.75f*nw,paint);

      paint.setTextAlign(Align.CENTER);
      canvas.drawText(format("%8.5f",lon),p.x-0.75f*nw,
                                                 2*p.y-nw,paint);
    }

    

    public void drawBitmap(Canvas canvas, double lat, double lon, Bitmap bmp, 
                                                                  boolean home)
    { Point p = new Point();
      map_view.toPixels(lat,lon,p);
      int w = bmp.getWidth();
      int h = bmp.getHeight();

      Paint paint = new Paint();
      
      if (home)
      { // apply filter

        float[] f;

        if (map_view.isSatellite())
          f = new float[] {2.5f, 0,    0,    0, 0, 
                           0,    2.5f, 0,    0, 0, 
                           0,    0,    1.0f, 0, 0, 
                           0,    0,    0,    1, 0};
        else
          f = new float[] {0,    0,    0,    0,    0, 
                           0,    0,    0,    0,    0, 
                           0,    0,    1,    0,    0, 
                           0,    0,    0,    0.75f, 0};

        ColorMatrixColorFilter filter = 
                              new ColorMatrixColorFilter(new ColorMatrix(f));

        paint.setColorFilter(filter);
      }

      p.x -= w/2;

      if (home)
        p.y -= h/2;
      else
        p.y -= h;

      canvas.drawBitmap(bmp, p.x, p.y, paint);
    }
    
    
    public void drawPoint(Canvas canvas, double lat, double lon, 
                         int r, int g, int b)
    {    	
      Point p = new Point();
      map_view.toPixels(lat,lon,p);

      paint.setARGB(128,r,g,b);
      paint.setStyle(Paint.Style.FILL);
      canvas.drawCircle(p.x, p.y, node_width, paint);
    
      if (map_view.isSatellite())
        paint.setColor(Color.WHITE);
      else
        paint.setColor(Color.BLACK);

      paint.setStrokeWidth(1);
      paint.setStyle(Paint.Style.STROKE);
      canvas.drawCircle(p.x, p.y, node_width, paint);
    }
    

    @Override
    public void draw(Canvas canvas)
    { 
      if (locked) return;

      invalid = false;

      if (canvas == null) return;

    //drawSRTM3(canvas);

      if (map_view.getZoomLevel() >= 16) drawGrid(canvas);

      double lat[] = new double [2];
      double lon[] = new double [2];
      window_coords(lat,lon);

      current_lat = (lat[0] + lat[1])/2;
      current_lon = (lon[0] + lon[1])/2;

      if (home_lat != 0 && home_lon != 0) 
        drawBitmap(canvas,home_lat,home_lon,homeBitmap,true);

      if (wp_lat != 0 && wp_lon != 0)
        drawBitmap(canvas,wp_lat,wp_lon,wpBitmap,false);

      //drawCurrentPoint(canvas,current_lat,current_lon,current_alt);
    }

}


    public final static String EXTRA_LANGUAGE = "waypoint_language";
    public final static String EXTRA_SRTM3_URL = "waypoint_srtm3_url";
    public final static String EXTRA_SRTM3_PATH = "waypoint_srtm3_path";
    public final static String EXTRA_MAPS_PATH = "waypoint_maps_path";

    public final static String EXTRA_NEW = "waypoint_new";
    public final static String EXTRA_NAME = "waypoint_name";
    public final static String EXTRA_LATITUDE = "waypoint_latitude";
    public final static String EXTRA_LONGITUDE = "waypoint_longitude";
    public final static String EXTRA_ALTITUDE = "waypoint_altitude";

    public final static String EXTRA_HOME_LATITUDE = "waypoint_home_latitude";
    public final static String EXTRA_HOME_LONGITUDE = "waypoint_home_longitude";
    public final static String EXTRA_HOME_ALTITUDE = "waypoint_home_altitude";

    public final static String EXTRA_XSERVER_HOST = "waypoint_xserver_host";

    public final static String EXTRA_ZOOM = "waypoint_zoom";
    public final static String EXTRA_SELECTED = "waypoint_selected";
    public final static String EXTRA_STRACKS_USER = "waypoint_user";
    public final static String EXTRA_STRACKS_PASSWORD = "waypoint_password";

    public final static String EXTRA_DEVELOPER_MODE = "waypoint_developer_mode";

    WayPointMapActivity activity = this;

    String language = "English";
    String string_cancel = "Cancel";
    String string_ok = "OK";
    String string_apply = "Apply";
    String string_search = "Search";
    String string_address = "Address";
    String string_city = "City";
    String string_street = "Street";
    String string_define_home = "Define Home Location";
    String string_define_waypoint = "Define Waypoint";
    String string_new_waypoint = "New Waypoint";
    String string_home_position = "Home Position";

    boolean developer_mode = false;

    String srtm3_url;
    String srtm3_path;

    String xserver_host  = sTracksRoot.xserver_host;
    int    xserver_port  = sTracksRoot.xserver_port;
    String osm_proxy_dir = sTracksRoot.osm_proxy_dir;

    String wp_name = "";
    boolean wp_new = false;

    String user = "";
    String password = "";

    String title;

    TextView title_view;
    TextView map_footer_left;
    TextView map_footer_right;
    ImageView map_footer_image;
    
    MyMapView map_view;

    File srtm3_folder = null;
    srtm3Matrix srtm3 = null;

    String maps_path;
    File maps_folder;

    Location initial_location = null;
    Location home_location = null;

    ImageButton but_zoom_out;
    ImageButton but_zoom_in;
    ImageButton but_zoom_fit;

    //ImageButton but_sat;
    ImageButton but_search;
    ImageButton but_lock;
    ImageButton but_mode;
    ImageButton but_home;
    ImageButton but_menu;
    
    OverlayPoint map_overlay;

    Display display;
    int display_width;
    int display_height;

    float client_version = 0;

    Handler handler = new Handler();

    public File get_srtm3_folder() { return srtm3_folder; }

/*
     void show_toast(final String txt) {
     handler.post( new Runnable() {
       @Override
       public void run() { 
          Toast.makeText(activity,txt, Toast.LENGTH_SHORT).show();
       }
     });
    }
*/

  private void show_toast(final String txt)
   { 
     final MyToast toast = new MyToast(this,txt);

     handler.post(new Runnable() {
        public void run() {
            toast.show_long();
        }
     });
   }


   String format(String pattern, Object... args)
   { String s = "";
     try { s = String.format(Locale.US,pattern,args);
     } catch (Exception e) { s = "format error"; }
     return s;
   }


    Bitmap create_bitmap(int res, int r, int g, int b, float a)
    {
      Bitmap bmp = BitmapFactory.decodeResource(getResources(), res);
      int width = bmp.getWidth();
      int height = bmp.getHeight();
  
      Bitmap bmp1 = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
  
      Canvas canvas = new Canvas(bmp1);
  
      Paint paint = new Paint();
  
      float[] f = new float[] {0,0,0,0, r,
                               0,0,0,0, g,
                               0,0,0,0, b,
                               //0,0,0,1, 0,
                               0,0,0,a,0
                              };
  
       ColorMatrixColorFilter filter =
                       new ColorMatrixColorFilter(new ColorMatrix(f));
  
       paint.setColorFilter(filter);
       canvas.drawBitmap(bmp,0,0,paint);
  
       return bmp1;
    }


    void initButtons()
    {
      int r = 96;
      int g = 96;
      int b = 96;
  
      if (map_view.isSatellite())
      { r = 255;
        g = 255;
        b = 128;
       }
  
  
     but_lock = (ImageButton)findViewById(R.id.button_lock);
     but_lock.setVisibility(View.GONE);
  
     but_mode = (ImageButton)findViewById(R.id.button_mode);
     but_mode.setVisibility(View.GONE);
  
     but_menu = (ImageButton)findViewById(R.id.button_menu);
     but_menu.setImageBitmap(create_bitmap(R.drawable.overflow_grey48,r,g,b,2.5f));
  
     but_menu.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
  
            final MyPopupMenu menu = new MyPopupMenu(activity) {
                @Override
                public void callMenuAction(View view, int pos, int i) { 
                    map_view.setTileSource(getName(i));
                    map_view.invalidate();
                    initButtons();
                    dismiss();
                }
            };
  
            menu.setAnchorView(but_menu);
            int width = display_width/2;
            menu.setWidth(width);
            menu.setHeight(0);


          int menu_sz = MyMapView.tileSourceNames.length; 

          for(int i = 0; i < menu_sz; i++) 
          { String tile_src = MyMapView.tileSourceNames[i];
            if (!developer_mode) 
            { if (user.equals("")) {
                if (tile_src.startsWith("HERE")) break;
              }
              else {
                if (tile_src.startsWith("GMap")) break;
              }
            }
            menu.add(tile_src,0,i);
           }
  
            menu.setAnimationStyle(R.style.animation_slide_in_out_right);
  
            menu.show(+1,-10);
         }
     });
  
  
  
     but_search = (ImageButton)findViewById(R.id.button_search);
     but_search.setImageBitmap(create_bitmap(R.drawable.search48a,r,g,b,1));
     but_search.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
               address_dialog();
         }
     });
  
  
  
     but_home = (ImageButton)findViewById(R.id.button_home);
     but_home.setImageBitmap(create_bitmap(R.drawable.home48,r,g,b,1));
     but_home.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
             if (home_location != null)
               map_overlay.setPoint(home_location,true);
         }
     });
  
      
     but_zoom_out = (ImageButton)findViewById(R.id.button_zoom_out);
     but_zoom_out.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
            map_view.zoomOut();
         }
      });
     
      
     but_zoom_in = (ImageButton)findViewById(R.id.button_zoom_in);
     but_zoom_in.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
            map_view.zoomIn();
         }
      });
  
     but_zoom_fit = (ImageButton)findViewById(R.id.button_zoom_fit);
     but_zoom_fit.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
            if (initial_location != null)
              map_overlay.setPoint(initial_location,true);
         }
      });
  
    }
                       

    @Override
    public void onCreate(Bundle savedInstanceState) {

    //show_toast("onCreate");
        
    super.onCreate(savedInstanceState);
       

    client_version = 0.001f * PackageCompat.getVersionCode(this);
     
    setContentView(R.layout.map_waypoint);

    if (Build.VERSION.SDK_INT >= 35) {
      adjustLayout(R.id.main_layout,0xff222222);
    }
    

    activity = this;

    WindowManager mgr = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
    display = mgr.getDefaultDisplay();

    Point pt = new Point();
    display.getSize(pt);
    display_width = pt.x;
    display_height = pt.x;

    int ds = MyDialog.STYLE_HOLO_LIGHT;
    MyDialog.setStyle(ds);


    Intent intent = getIntent();


    if (intent.hasExtra(EXTRA_SRTM3_URL)) 
           srtm3_url = intent.getStringExtra(EXTRA_SRTM3_URL);


    Bundle bundle = intent.getExtras();

/*
    int zoom_level = 16;

    double lat = 49.78763;
    double lon =  6.71195;
    double alt = 165;
*/

    int zoom_level = 12;
    double lat = 0;
    double lon = 0;
    double alt = 0;

    double home_lat = 0;
    double home_lon = 0;
    double home_alt = 0;

    if (bundle != null)
    { developer_mode = bundle.getBoolean(EXTRA_DEVELOPER_MODE,false);
      language = bundle.getString(EXTRA_LANGUAGE);
      wp_name = bundle.getString(EXTRA_NAME);
      wp_new = bundle.getBoolean(EXTRA_NEW);

      lat = bundle.getDouble(EXTRA_LATITUDE,0);
      lon = bundle.getDouble(EXTRA_LONGITUDE,0);
      alt = bundle.getDouble(EXTRA_ALTITUDE,0);

      home_lat = bundle.getDouble(EXTRA_HOME_LATITUDE,0);
      home_lon = bundle.getDouble(EXTRA_HOME_LONGITUDE,0);
      home_alt = bundle.getDouble(EXTRA_HOME_ALTITUDE,0);

      xserver_host = bundle.getString(EXTRA_XSERVER_HOST);

      user =  bundle.getString(EXTRA_STRACKS_USER);
      password =  bundle.getString(EXTRA_STRACKS_PASSWORD);

      zoom_level = bundle.getInt(EXTRA_ZOOM);

      srtm3_path = bundle.getString(EXTRA_SRTM3_PATH);
      if (srtm3_path != null) srtm3_folder = new File(srtm3_path);

      maps_path = bundle.getString(EXTRA_MAPS_PATH);
      if (maps_path != null) maps_folder = new File(maps_path);
   }

    if (maps_path == null) {
        show_toast("Maps Folder undefined");
        finish();
    }


    home_location = null;

    if (home_lat != 0 || home_lon != 0)
    { home_location = new Location("gps");
      home_location.setLatitude(home_lat);
      home_location.setLongitude(home_lon);
      home_location.setAltitude(home_alt);
     }

    if (language.equals("Deutsch"))
    { string_cancel = "Abbrechen";
      string_apply = "Übernehmen";
      string_search = "Suchen";
      string_address = "Adresse";
      string_city = "Stadt";
      string_street = "Straße";
      string_define_home = "Home Position festlegen";
      string_define_waypoint = "Waypoint definieren";
      string_new_waypoint = "New Waypoint";
     }


    if (wp_new)
      //title = string_define_waypoint;
      title = "Waypoint";
    else
      if (wp_name.startsWith("Home"))
        //title = string_define_home;
        title = "Home";
      else
        //title = "Waypoint:  " + wp_name;
        title = wp_name;



    Button but1 = (Button)findViewById(R.id.button_cancel);
    but1.setText(string_cancel);
    but1.setOnClickListener(new OnClickListener() {
         public void onClick(View v) { finish(); }
     });

   

    Button but2 = (Button)findViewById(R.id.button_select);
    but2.setText(string_apply);
    but2.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
                 Intent extra = new Intent();
                 Location loc = map_overlay.getCurrentLocation();
                 extra.putExtra(EXTRA_LATITUDE,loc.getLatitude());
                 extra.putExtra(EXTRA_LONGITUDE,loc.getLongitude());
                 extra.putExtra(EXTRA_ALTITUDE,loc.getAltitude());
                 extra.putExtra(EXTRA_NAME,wp_name);
                 extra.putExtra(EXTRA_SELECTED,true);
                 setResult(RESULT_OK, extra);
                 finish();
         }
     });


    if (bundle == null) {
      but1.setVisibility(View.GONE);
      but2.setVisibility(View.GONE);
    }


    Runtime rt = Runtime.getRuntime();
    float max_mb = (float)rt.maxMemory()/(1024*1024);

    title_view = (TextView)findViewById(R.id.title);

    int[] clrs_red   = new int[] {0xffdd3344, 0xff880a15, 0xffa11d30 };
    int[] clrs_green = new int[] {0xff50a870, 0xff005030, 0xff208040};
    int[] clrs_blue  = new int[] {0xff5070a8, 0xff003050, 0xff204080};
    int[] clrs_grey  = new int[] {0xff888888, 0xff555555, 0xff999999};

    GradientDrawable gd = 
       new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,clrs_blue);

    //gd.setStroke(1,Color.BLACK);

    title_view.setBackground(gd);
    title_view.setText(title);

    map_footer_left = (TextView)findViewById(R.id.footer_left);
    map_footer_right = (TextView)findViewById(R.id.footer_right);
    map_footer_image = (ImageView)findViewById(R.id.footer_image);


   String tile_source = developer_mode ? "GMap Road" : "OSM Road";

   map_view = new MyMapView(this,tile_source,maps_folder) 
   {
       MapGestureListener listener = new MapGestureListener() {

          double heading_start;
          double phi_start;
          double phi_prev;
          double dist_start;
          int zoom_start = -1;
          float zoom_f = 1;

          @Override
          public void showToast(String s) { show_toast(s); } 

          @Override
          public void onSingleClick(int x, int y) 
          { map_view.setRotationAnim(0); }


          @Override
          public void onDoubleClick(final int x, final int y) { 
            // zomm down to (x,y)
/*
            Location loc = map_view.fromPixels(x,y);
            int z = map_view.getZoomLevel();
            map_view.animateTo(loc,z+1); 
*/
            new MyThread() {
               public void run() {
                  sleep(100);
                  handler.post(new Runnable() {
                      @Override public void run() { 
                         Location loc = map_view.fromPixels(x,y);
                         int z = map_view.getZoomLevel();
                         map_view.animateTo(loc,z+1); 
                      }
                  });
               }
            }.start();

          }

          @Override
          public void onRotateStart(double phi, double dist) {
              phi_start = phi;
              phi_prev = phi;
              dist_start = dist;
              zoom_start = map_view.getZoomLevel();
              heading_start = map_view.getRotation();
          }

          @Override
          public void onRotateStep(double phi, double dist) {

              final double delta = Math.toDegrees(phi_start-phi);
              final double eps = Math.toDegrees(phi_prev-phi);
              zoom_f = (float)(dist/dist_start);

              map_view.setZoomFactor(zoom_f);

              phi_prev = phi;
              double angle = heading_start + delta;
              map_view.setRotation((float)angle);
          }

          @Override
          public boolean onRotateFinish(int pointerCount)  {

           double z = zoom_start + Math.log(zoom_f)/Math.log(2);

           if (zoom_f > 1)
             z += 0.6;
           else
             z += 0.4;

           map_view.animToZoomLevel((int)z);
           zoom_start = -1;

           return  true;
         }

       };


       @Override
       public boolean touchEventHandler(MotionEvent e) { 
          return listener.onTouch(null,e);
       }

       @Override
       public void showToast(String txt) { show_toast(txt); } 

/*
       @Override
       public void writeLog(String txt) { show_toast(txt); }
*/

       @Override
       public void setText1(final String txt, final int clr) { 
           handler.post( new Runnable() {
             public void run() { 
                 map_footer_left.setTextColor(clr); 
                 map_footer_left.setText(txt); 
             }
          });
       }

       @Override
       public void setText2(final String txt,final int clr) { 
           handler.post( new Runnable() {
             public void run() {
                  if (txt.startsWith("LOGO"))
                  { map_footer_image.setVisibility(View.VISIBLE);
                    map_footer_right.setVisibility(View.GONE);
                   }
                  else
                  { map_footer_image.setVisibility(View.GONE);
                    map_footer_right.setVisibility(View.VISIBLE);
                   }

                  map_footer_right.setTextColor(clr);
                  map_footer_right.setText(txt);
             }
          });
       }


       @Override
       public boolean onTouchEvent(MotionEvent event)
       { 
         double lon = map_overlay.getCurrentLongitude();
         double lat = map_overlay.getCurrentLatitude();
         double alt = (srtm3 != null) ? srtm3.getAltitude(lat,lon) : 0;
         if (alt < 0) alt = 0;
         map_overlay.setAltitude(alt);

         return super.onTouchEvent(event);
        }


       @Override
       public String centerLabel(double lat, double lon)
       { title_view.setText(title + format("    %.5f / %.5f",lat,lon));
         double alt = (srtm3 != null) ? srtm3.getAltitude(lat,lon) : 0;
         return (alt <= 0) ? "" : format("%.0f m",alt);
        }

     };

   map_view.setTileSource(tile_source);
   map_view.setTileProxy(xserver_host,xserver_port,osm_proxy_dir);
   map_view.setZoom(16);

   map_overlay = new OverlayPoint(this);
   map_view.setOverlay(map_overlay);

   map_overlay.setHomeBitmap(R.drawable.home36);
   map_overlay.setWpBitmap(R.drawable.wpoint_red20);

   if (home_location != null) map_overlay.setHomePoint(home_location);

   map_overlay.set_node_width(display_width/60.0f);

   LinearLayout mapLayout = (LinearLayout)findViewById(R.id.map_linear_layout);
   mapLayout.addView(map_view,0);

   initButtons();


  // initial position

    if (lat == 0 && lon == 0) 
    { 
      //show_toast("lat = lon = 0");
      double[] coord = new double[2];
      map_view.getCenter(coord);
      lat = coord[0];
      lon = coord[1];
      alt = 0;
     }


   initial_location = new Location("map");
   initial_location.setLatitude(lat);
   initial_location.setLongitude(lon);
   initial_location.setAltitude(alt);


   if (!wp_new && !wp_name.startsWith("Home")) 
     map_overlay.setWayPoint(initial_location);




   if (srtm3_folder != null) {
     srtm3 = new srtm3Matrix(srtm3_folder,initial_location,srtm3_url)
     { @Override
        protected void show_error(String msg) { activity.show_toast(msg); }
      };
     srtm3.set_auto_download(false);
   }

   map_view.setZoom(zoom_level); 

   map_overlay.setPoint(initial_location,false);

   if (srtm3 == null) return;

   new MyThread() {
       public void run() { 
          int count = 10;
          double alt = sTracksRoot.DISTANCE_UNDEFINED;

          while (count-- > 0 && alt == sTracksRoot.DISTANCE_UNDEFINED)
          { sleep(500);
            alt = srtm3.getAltitude(initial_location);
           }

          if (alt != sTracksRoot.DISTANCE_UNDEFINED)
          { initial_location.setAltitude(alt);
            map_overlay.setAltitude(alt);
            map_view.postInvalidate();
          }
       }
   }.start();

 }

  @Override
  protected void onResume() {
       //show_toast("onResume");
       super.onResume();
  }


  @Override
  public void onBackPressed() { 
       super.onBackPressed();
  }



  @Override
  public void onConfigurationChanged(Configuration newConfig)
  {  super.onConfigurationChanged(newConfig);
     //show_toast("onConfigurationChanged");
     //map_overlay.zoomToPath();
   }



   public void address_dialog()
   { 
     String street = "Stilfser Joch";
     String city = "Stilfs, Italy";

     MyDialog dialog = new MyDialog(this,string_address);

     View view = dialog.setView(R.layout.dialog_address);

     final TextView txt_street= (TextView)view.findViewById(R.id.text_street);
     txt_street.setText(string_street);

     final EditText edt_street= (EditText)view.findViewById(R.id.edit_street);
     edt_street.setText(street);
     edt_street.setSelection(street.length());

     final TextView txt_city= (TextView)view.findViewById(R.id.text_city);
     txt_city.setText(string_city);

     final EditText edt_city= (EditText)view.findViewById(R.id.edit_city);
     edt_city.setText(city);
     edt_city.setSelection(city.length());

     final Geocoder geo = new Geocoder(this);

     dialog.setPositiveButton(string_search, 
                  new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface d, int which) {
               String address = edt_street.getText().toString();
               address += ",";
               address += edt_city.getText().toString();

               try {
                   List<Address> addresses = geo.getFromLocationName(address,1);
                   if (addresses.size() > 0) 
                   { Address addr = addresses.get(0);
                     double lat = addr.getLatitude();
                     double lon = addr.getLongitude();
                     map_overlay.setPoint(lat,lon,true);

                     double alt = 0;
                     if (srtm3 != null) alt = srtm3.getAltitude(lat,lon);
                     map_overlay.setAltitude(alt);
                     map_view.postInvalidate();

                     title_view.setText(title);
                   }
               } catch (Exception e) { e.printStackTrace(); }
           }
     });
     
     dialog.setNegativeButton(string_cancel, 
                 new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface d, int which) { }
     });


   dialog.show();
  }

    
}
