function populateMap(map, currentMarker, jsonUrl) {
	var markerCache = [];
	var tabCache = [];
    var firstRun = markerCache.length == 0;
    
	function addMarkers(markers) {
		var batch = [];
		var mgr = new MarkerManager(map);
        if (currentMarker && firstRun) { 
            markers.unshift(currentMarker); 
        }

		for (var i = 0; i < markers.length; i++) {
			if (markerCache[markers[i].id] == null){
				marker = createMarker(markers[i]);
				markerCache[markers[i].id] = marker;
				batch.push(marker);
			}
		}
		mgr.addMarkers(batch, 14);
		mgr.refresh();
	}

	function createMarker(info) {
		if (info.icon){
			var icon = new GIcon();
			icon.image = '/media/' + info.icon;
			if (info.shadow) icon.shadow = '/media/' + info.shadow;
			icon.iconSize = new GSize(info.icon_size.width, info.icon_size.height);
			icon.iconAnchor = new GPoint(16, 16);
			icon.infoWindowAnchor = new GPoint(16, 0);
			var marker = new GMarker(new GLatLng(info.latitude, info.longitude), {icon: icon});
		} else {
			var marker = new GMarker(new GLatLng(info.latitude, info.longitude));
		}
		var tabs = [new GInfoWindowTab("Info", info.info),
								new GInfoWindowTab("Adresse", info.address)];
		tabCache[info.id] = tabs;
		GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowTabsHtml(tabs, {maxWidth: 240});
		});
		return marker;
	}

	GEvent.addListener(map, "moveend", function() {
		if (map.getZoom() > 13) {
			var b = map.getBounds();
			var url = b.getSouthWest().lat() + "/" + b.getSouthWest().lng() + "/" +
								b.getNorthEast().lat() + "/" + b.getNorthEast().lng() + "/";
			$.getJSON(jsonUrl + url, function(data) {
				addMarkers(data.markers);
				if (markerCache.length > 0 && firstRun) {
                    markerCache[currentMarker.id].openInfoWindowTabsHtml(tabCache[currentMarker.id],{maxWidth: 240});
                    firstRun = 0;
                };
			});
		}
	});
    if (currentMarker) {
        map.setCenter(new GLatLng(currentMarker.latitude, currentMarker.longitude), 16);
    }
}
