google.load('search', '1');
google.load('maps', '2');

var Map = { 
	_mmap: 0,
	_local: 0,
	
	_default_lat: 48.87,
	_default_lng: -55.36,
	_default_zoom: 7,
	
	load: function()
	{
		if (google.maps.BrowserIsCompatible())
		{
			this._local = new google.search.LocalSearch();
			
			var mmap = document.getElementById('map');
			
			if (mmap != null)
			{
				this._mmap = new google.maps.Map2(mmap);
				this._mmap.addControl(new google.maps.SmallMapControl());
				Map.setLocation(Map._default_lat, Map._default_lng, Map._default_zoom);
			}
		}
	},
	
	setLocation: function(lat, lng, zoom)
	{
		var point = new GLatLng(lat, lng);
		Map._mmap.setCenter(point, zoom);
	},
	
	showAddress: function(address)
	{
		var l = new google.search.LocalSearch();
		l.setSearchCompleteCallback(null, function() {
			if (l.results[0]) {
				var lat = l.results[0].lat;
				var lng = l.results[0].lng;
				
				// centre on location
				Map.setLocation(lat, lng, 16);
				
				// add a marker
				Map._mmap.addOverlay(new GMarker(new GLatLng(lat, lng)));
			}
		});
		l.execute(address + ", CA");
	},
	
	addTown: function(name, description, url, dLat, dLng)
	{
		dLat = parseFloat(dLat);
		dLng = parseFloat(dLng);
	
		if (!isNaN(dLat) && !isNaN(dLng))
		{
			if (description == null)
				description = '';
			
			// add a marker
			var marker = new GMarker(new GLatLng(dLat, dLng), {title:name});
			GEvent.addListener(marker, 'click', function() { marker.openInfoWindow('<h3>' + name + '</h3><p>' + description + '</p><p><a href="' + url + '">More Info</a></p'); });
			
			Map._mmap.addOverlay(marker);
		} else {
			var l = new google.search.LocalSearch();
			l.setSearchCompleteCallback(null, function() {
				if (l.results[0]) {
					var lat = l.results[0].lat;
					var lng = l.results[0].lng;
				
					if (description == null)
						description = '';
				
					// add a marker
					var marker = new GMarker(new GLatLng(lat, lng), {title:name});
					GEvent.addListener(marker, 'click', function() { marker.openInfoWindow('<h3>' + name + '</h3><p>' + description + '</p><p><a href="' + url + '">More Info</a></p'); });
				
					Map._mmap.addOverlay(marker);
				}
			});
			l.execute(name + ", CA");
		}
	}
}

var InteractiveMap = {
	
	load: function(data_url, show_url)
	{
		this._data_url = data_url;
		this._show_url = show_url;
		
		Map.setLocation(48.87,-55.36,7);
		
		new Ajax.Request(InteractiveMap._data_url, {
			onSuccess: function(r)
			{
				var d = eval('(' + r.responseText + ')');
				
				Map._mmap.clearOverlays();
				
				for (var i = 0; i < d.length; i++)
				{	
					var b = d[i].town;
					
					Map.addTown(b.name, b.brief, InteractiveMap._show_url + '/' + b.id, b.latitude, b.longitude);
				}
			}
		});
	}
}