JavaScript имеет только область действия функции, поэтому, когда вы объявляете var в середине цикла for, вы фактически объявляете их только один раз для всей функции. Первое, что вы должны сделать, это перенести все объявления var наверх, чтобы понять, что происходит:
downloadUrl("http://localhost/map/generatexml.php", function(data) {
var xml = parseXml(data);
var markers = xml.documentElement.getElementsByTagName("marker");
var i, permalink, point, marker;
for (i = 0; i < markers.length; i++) {
permalink = markers[i].getAttribute("permalink");
point = new google.maps.LatLng(
parseFloat(markers[i].getAttribute("lat")),
parseFloat(markers[i].getAttribute("lng")));
marker = new google.maps.Marker({map: map,position: point,icon: icon.icon,shadow: icon.shadow,title: name});
google.maps.event.addListener(marker, 'click', function() {self.location.href = permalink;});
}
Ваша функция щелчка будет использовать окончательное значение постоянной ссылки для каждого события маркера, поскольку постоянная ссылка заменяется новым значением каждый раз при цикле цикла for.
Редактировать: Так что да, Пойнти побил меня, чтобы я на самом деле решил вашу проблему. Но там у вас есть, по крайней мере, объяснение проблемы