There's been a flurry of hacking as soon as Google Maps (beta!)was released. There was the usual analysis of how the whole thing was being pulled off by Google.

Then the real hacking began.

First, there were bookmarklets by "follower", to pan the map automatically to follow the route, and then moving an image of little man along the path. Several others chipped in with improved versions replacing the man with a spider. But the man and the spider were pretty slow.

Then, there was another version to map the route in a faster and smoother fashion from Ayhan Ergul.

I noticed that after I ran this bookmarklet, the links on the map were non-functional due to javascript varibale name conflict. The bookmarklet was using a variable `d`. Google Maps' javascript code also uses the same name for an object and the bookmarklet's variable overwrites Google's.

Replacing the variable name in the bookmarklet code by any other unique name fixes this problem. Ergul's site doesn't have any email address to notify him.

Here's the bookmarklet (All I did was replace the variable `d` with `dd`). Blogger doesn't seem to accept `javascript:` links, so here's the code all in its raw glory:

javascript:(function(){if(!_m.map.me){_m.map.me=_m.map.createLocationMarker('http://libgmail.sourceforge.net/man.png',N.get('local'));}_m.map.timeSlice=60;_m.map.totalTime=3000;_m.map.sliceCount=_m.map.totalTime/_m.map.timeSlice;_m.map.totalDistance=0;_m.map.c3=new Object();p=_m.map.directions.polyline;_m.map.cumDistance=new Array(p.numPoints);_m.map.cumDistance[0]=0;c1=p.getPoint(0);for(i=1;i<p.numPoints;i++){c2=p.getPoint(i);_m.map.cumDistance[i]=_m.map.cumDistance[i-1]+Math.sqrt(Math.pow(c2.x-c1.x,2)+Math.pow(c2.y-c1.y,2));c1=c2;}_m.map.speed=_m.map.cumDistance[p.numPoints-1]/_m.map.sliceCount;mv=function(i){p=_m.map.directions.polyline;j=0;while(_m.map.cumDistance[j+1]<(i*_m.map.speed)){j++;}c1=p.getPoint(j);c2=p.getPoint(j+1);dd=_m.map.cumDistance[j+1]-_m.map.cumDistance[j];if(dd){l=(i*_m.map.speed)-_m.map.cumDistance[j];_m.map.c3.x=c2.x-(c2.x-c1.x)*(dd-l)/dd;_m.map.c3.y=c2.y-(c2.y-c1.y)*(dd-l)/dd;}else{_m.map.c3.x=c2.x;_m.map.c3.y=c2.y;}_m.map.recenterOrPanToLatLng(_m.map.c3);_m.map.setMarkerPosition(_m.map.me,N.get('local'),_m.map.c3);if(i<_m.map.sliceCount){window.setTimeout('mv('+(i+1)+')',_m.map.timeSlice);}else{_m.map.me.hide();}};_m.map.me.show();mv(1);})();

And, the fixed up code formatted nicely (copied from Ergul's site and fixed up).

javascript:
(function ()
{
if (!_m.map.me)
{
_m.map.me = _m.map.createLocationMarker('http://libgmail.sourceforge.net/man.png', N.get('local'));
}
_m.map.timeSlice = 60;
_m.map.totalTime = 3000;
_m.map.sliceCount = _m.map.totalTime/_m.map.timeSlice;
_m.map.totalDistance = 0;
p = _m.map.directions.polyline;
for (i=0; i<p.numPoints-1; i++)
{
c1 = p.getPoint(i);
c2 = p.getPoint(i+1);
_m.map.totalDistance += Math.sqrt(Math.pow(c2.x-c1.x, 2)+Math.pow(c2.y-c1.y, 2));
}
_m.map.speed = _m.map.totalDistance/_m.map.sliceCount;
mv = function(i)
{
p = _m.map.directions.polyline;
travelled = 0;
j = 0;
while(1)
{
c1 = p.getPoint(j);
c2 = p.getPoint(j+1);
dd=Math.sqrt(Math.pow(c2.x-c1.x, 2)+Math.pow(c2.y-c1.y, 2));
if((travelled+dd) >= (i*_m.map.speed))
break;
travelled += dd;
j += 1;
}
_m.map.setMarkerPosition(_m.map.me, N.get('local'), c1);
if(i%3==0)
_m.map.recenterOrPanToLatLng(c1);
if (i < _m.map.sliceCount)
{
window.setTimeout('mv('+(i+1) + ')',_m.map.timeSlice);
}
else
{
_m.map.me.hide()
}
};
_m.map.me.show();
mv(0);
}
)();