// Google maps based locator.

var url = window.location.protocol + '//' + window.location.host + window.location.pathname;
var markers = [];
var map;
var points = [];
var mapTop;
var mapMinTop;
var lmvIcon;
var numberOfItems = 0;
var geoCodedCount = 0;

function loadData() {
	geocoder = new GClientGeocoder();

	jsonDataString = $('mapdata').jsonDataString.value;
	if (typeof jsonDataString != "undefined") {
		if (jsonDataString != '') {
			jsonArray = jsonDataString.unescapeHTML().evalJSON(true);
			numberOfItems = jsonArray.length;
			jsonArray.each(function(item, index) {
				geocoder.getLatLng(
						item.street + " " + item.number + ", " + item.postcode + " " + item.city,
						function(point) {
							geoCodedCount++;
							if (point != null) {
								points[index] = point;
							}
							if (geoCodedCount >= numberOfItems) {
								loadMap();
							}
						}
				);
			})
		}
	}
}

// Display Google map.
function loadMap() {
	
	// Create the icon.
	lmvIcon = new GIcon();
	lmvIcon.image = "/skin/lmv-icon.gif";
	lmvIcon.iconSize = new GSize(36, 36);
	lmvIcon.iconAnchor = new GPoint(1, 36);
	lmvIcon.infoWindowAnchor = new GPoint(18, 18);

	// Store points for automatic bounds calculation.
	var bounds = new GLatLngBounds();
	var ll;
	var m;
	points.each(function(p) {
		if (p != undefined) {
			bounds.extend(p);
			m = new GMarker(p, lmvIcon, {'clickable': false});
			markers.push(m);
		}
	});

	// Draw the map.
	if (points.length > 0) {
		map = new GMap2($('map'));
		map.addControl(new GSmallMapControl());
		map.addControl(new GMapTypeControl());
		map.setMapType(G_HYBRID_MAP)
		map.setCenter(new GLatLng(0, 0), 0);
		map.setZoom(Math.min(17, map.getBoundsZoomLevel(bounds)));
		map.setCenter(bounds.getCenter());
		map.enableScrollWheelZoom();
		// Add markers.
		markers.each(function(m)
		{
			map.addOverlay(m);
		});
	} else {
		$('map').hide();
	}
}

// Adjust map position to keep it in view.
function slideMap(e) {
	var map = $('map');
	var offset = map.cumulativeScrollOffset();
	if (offset[1] > mapMinTop) {
		map.setStyle({top: (offset[1] + mapTop - mapMinTop) + 'px'});
	} else {
		map.setStyle({top: mapTop + 'px'});
	}
}

// Show info window.
function showOnMap(e) {
	Event.stop(e);
	var elm = Event.element(e);
	var i = parseInt(elm.getAttribute('index'));
	markers[i].showMapBlowup();
}

// Initialise page.
function init() {
	if (document.getElementById('map')) {
		// Set up event listeners.
		Event.observe(window, 'unload', GUnload, false);
		loadData();
		// Add triggers for info windows.
		$$('a.showonmap').each(function(elm) {
			Event.observe(elm, 'click', showOnMap);
		});
		// Keep map in view.
		mapTop = parseInt($('map').getStyle('top'));
		mapMinTop = parseInt($('container').getStyle('paddingTop'));
		Event.observe(window, 'scroll', slideMap, false);
	}
}

//window.addEvent('load', init);
Event.observe(window, 'load', init);
