Index: /applications/editors/josm/plugins/infomode/nbproject/project.xml
===================================================================
--- /applications/editors/josm/plugins/infomode/nbproject/project.xml	(revision 26388)
+++ /applications/editors/josm/plugins/infomode/nbproject/project.xml	(revision 26389)
@@ -22,4 +22,7 @@
                     <encoding>UTF-8</encoding>
                 </source-folder>
+                <build-file>
+                    <location>../../dist/InfoMode.jar</location>
+                </build-file>
             </folders>
             <ide-actions>
@@ -37,5 +40,14 @@
                     <target>runjosm</target>
                 </action>
+                <action name="debug">
+                    <script>nbproject/ide-targets.xml</script>
+                    <target>debug-nb</target>
+                </action>
             </ide-actions>
+            <export>
+                <type>jar</type>
+                <location>../../dist/InfoMode.jar</location>
+                <build-target>install</build-target>
+            </export>
             <view>
                 <items>
@@ -53,4 +65,5 @@
                     <ide-action name="clean"/>
                     <ide-action name="run"/>
+                    <ide-action name="debug"/>
                 </context-menu>
             </view>
@@ -61,4 +74,5 @@
                 <package-root>src</package-root>
                 <classpath mode="compile">../../core/src</classpath>
+                <built-to>../../dist/InfoMode.jar</built-to>
                 <source-level>1.6</source-level>
             </compilation-unit>
Index: /applications/editors/josm/plugins/infomode/src/org/openstreetmap/josm/plugins/infomode/InfoMode.java
===================================================================
--- /applications/editors/josm/plugins/infomode/src/org/openstreetmap/josm/plugins/infomode/InfoMode.java	(revision 26388)
+++ /applications/editors/josm/plugins/infomode/src/org/openstreetmap/josm/plugins/infomode/InfoMode.java	(revision 26389)
@@ -25,6 +25,8 @@
 import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
-import java.text.DateFormat;
-import java.util.Locale;
+import java.util.HashSet;
+import java.util.Set;
+import javax.swing.Popup;
+import javax.swing.PopupFactory;
 
 import org.openstreetmap.josm.Main;
@@ -49,5 +51,7 @@
     private boolean oldShift;
     private EastNorth pos;
-    DateFormat df;
+    private WayPoint wpOld;
+    private Popup oldPopup;
+    private InfoPanel infoPanel;
 
     InfoMode(MapFrame mapFrame) {
@@ -56,5 +60,5 @@
                 tr("Mode: {0}", tr("GPX info mode")),
                 KeyEvent.VK_BACK_SLASH, Shortcut.GROUP_EDIT), mapFrame, Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
-        df = DateFormat.getDateTimeInstance(DateFormat.DEFAULT,DateFormat.DEFAULT, Locale.getDefault()); 
+        infoPanel=new InfoPanel();
         
     }
@@ -92,4 +96,5 @@
 
         Main.map.mapView.removeTemporaryLayer(this);
+        if (oldPopup!=null) oldPopup.hide();
 
         try {
@@ -119,5 +124,5 @@
             
             double minDist=1e9,d,len=0;
-            WayPoint wp=null;
+            WayPoint wp=null,oldWp=null,prevWp=null;
             GpxTrack trk=null;
             for (GpxTrack track : gpxL.data.tracks) {
@@ -125,30 +130,35 @@
                     for (WayPoint S : seg.getWayPoints()) {
                         d = S.getEastNorth().distance(pos);
-                        if (d<minDist && d<10) {
+                        if (d<minDist && d<100) {
                             minDist = d;
+                            prevWp=oldWp;
                             wp=S;
                             trk=track;
                             }
-                        if (track==trk) len+=seg.length();
-                        }
+                        oldWp=wp;
                     }
+                }
             }
             if (wp!=null) {
                 Point p = mv.getPoint(wp.getCoor());
+                                
                 g.setColor(Color.RED);
                 g.fillOval(p.x-10, p.y-10, 20, 20); // mark selected point
-                p.translate(20, 5);
-                g.setColor(Color.WHITE);
-                g.fillRoundRect(p.x, p.y-25, 200, 50,10,10);
-                g.setColor(Color.BLACK);
-                g.drawString(df.format(wp.getTime()), p.x+5, p.y-10);
-                String s = (String) trk.getAttributes().get("name");
-                if (s!=null) g.drawString(s, p.x+5, p.y+5);
-                System.out.println(trk.getAttributes().toString());                
-                System.out.println(wp.attr.toString());                
-                s = (String) wp.attr.get("ele");
-                String s1=null;
-                try {s1 = String.format("%3.1f", Double.parseDouble(s));} catch (Exception e) {  }
-                if (s1!=null) g.drawString("H="+s1, p.x+5, p.y+20);
+                
+                if (wp!=wpOld) {
+                if (oldPopup!=null) oldPopup.hide();
+                double vel=-1;
+                if (prevWp!=null && wp.time!=prevWp.time) {
+                    vel=wp.getCoor().greatCircleDistance(prevWp.getCoor())/
+                            (wp.time-prevWp.time)*3.6;
+                }
+                infoPanel.setData(wp,trk,vel,gpxL.data.tracks);
+                Point s=mv.getLocationOnScreen();
+                Popup pp=PopupFactory.getSharedInstance().getPopup(mv, infoPanel, 
+                        s.x+p.x+10, s.y+p.y+10);
+                pp.show();
+                wpOld=wp;
+                oldPopup=pp;
+                }
             }
             
@@ -170,5 +180,4 @@
         if (!isEnabled()) return;
         if (e.getButton() != MouseEvent.BUTTON1) return;
-        
         //setStatusLine(tr("Please move the mouse to draw new way"));
         repaint();
@@ -180,5 +189,8 @@
         if (!isEnabled()) return;
         if (e.getButton() != MouseEvent.BUTTON1) return;
-        
+        if (oldPopup!=null) {
+            oldPopup.hide();
+            oldPopup=null;        wpOld=null;
+        }        
         repaint();
     }
@@ -186,5 +198,8 @@
     @Override
     public void mouseDragged(MouseEvent e) {
-        mouseMoved(e);
+        if (oldPopup!=null) {
+            oldPopup.hide();
+            oldPopup=null;        wpOld=null;
+        }
     }
 
@@ -199,6 +214,9 @@
         ///  System.out.println(e);
         if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE) {
-        }
-    }
+            filterTracks();
+            repaint();
+        }
+    }
+    
 
     /**
@@ -222,5 +240,5 @@
 
     private void repaint() {
-        Main.map.mapView.repaint();
+        if (Main.map!=null) Main.map.mapView.repaint();
     }
     private void setStatusLine(String tr) {
@@ -229,4 +247,25 @@
     }
 
+    private synchronized void filterTracks() {
+        Layer l = Main.main.getActiveLayer();
+        
+        if (l instanceof GpxLayer && pos!=null) {
+            GpxLayer gpxL = (GpxLayer )l;
+            Set<GpxTrack> toRemove = new HashSet<GpxTrack>();
+            for (GpxTrack track : gpxL.data.tracks) {
+                boolean f=true;
+                sg: for (GpxTrackSegment seg : track.getSegments()) {
+                    for (WayPoint S : seg.getWayPoints()) {
+                        if (S.time!=0) {f=false; break sg;}
+                    }
+                }
+                if (f) toRemove.add(track);
+            }
+            gpxL.data.tracks.removeAll(toRemove);
+                                
+
+        }
+    }
+
     
 
