var map;
var mapmode;
var photoURL;
var sightPhotoURL;
var accommodationPhotoURL;

function initMapView()
{
	// Check Map Element
	map = $('map');
	
	if (GBrowserIsCompatible() && map) {
		// Initialize Map
		map = new GMap2(map);
		map.addControl(new GMapTypeControl());
		map.addControl(new GLargeMapControl());
        map.setCenter(new GLatLng(40.446947, 69.960938), 2);

        
        
        // Set Default Map Type
        setContentType('entries');
        
        // Show Places
        updateMapContent('places');
		
        // Get boundaries after moving map
        GEvent.addListener(map, "moveend", function() {
			
			if (map.getZoom() > 10) {
				updateMapContent(mapmode);
			} else {
				updateMapContent('places');
			}
		});

	}
}

/**
 * Set Map Content Type
 * Default is Entries
 */
function setContentType(type)
{
	$('tab_entries').setAttribute("class", "");
	$('tab_photos').setAttribute("class", "");
	$('tab_sights').setAttribute("class", "");
	$('tab_accommodations').setAttribute("class", "");
	
	if (type == 'entries' || type == 'photos' || type =='sights' || type =='accommodations') {
		mapmode = type;
		$('tab_' + type).setAttribute("class", "active");
		if (map.getZoom() > 10) {
			updateMapContent(mapmode);
		}
	}
}

/**
 * Get Map Boundaries
 */
function getMapBoundaries()
{
	var boundaries = map.getBounds();
	var southwest = boundaries.getSouthWest();
	var northeast = boundaries.getNorthEast();
	
	var minLat = southwest.lat();
	var minLng = southwest.lng();
	var maxLat = northeast.lat();
	var maxLng = northeast.lng();
	
	var output = new Object();
	
	output.minLat = minLat;
	output.minLng = minLng;
	output.maxLat = maxLat;
	output.maxLng = maxLng;
	
	return output;
}

/**
 * Get Content from Database
 */
function updateMapContent(mapmode)
{
	var bounds = getMapBoundaries();
	var url = 'lib/ajax/mapview.php?mode=' + mapmode + '&minLat=' + bounds.minLat + '&minLng=' + bounds.minLng + '&maxLat=' + bounds.maxLat + '&maxLng=' + bounds.maxLng;
	new Ajax.Request(url,
	{
		method: 'get',
		onLoading: function ()
		{
			$('map_state').setStyle({
				background: 'transparent url(lib/ajax/ajax-loader.gif)'
			});
		},
		onSuccess: function (transport)
		{
			var response = eval(transport.responseText);
			if (mapmode == 'places') {
				displayPlaces(response);
			} else if (mapmode == 'entries') {
				displayEntries(response);
			} else if (mapmode == 'photos') {
				displayPhotos(response);
			} else if (mapmode == 'sights') {
				displaySights(response);
			} else if (mapmode == 'accommodations') {
				displayAccommodations(response);
			}
			$('map_state').setStyle({
				background: 'transparent'
			});
       	},
       	onFailure: function()
       	{
	   		alert('Error when updating map content');
		}
	});
}
function updateSidebarContent(content)
{
	$('sub_content').innerHTML = content;
}
/**
 * Create Marker with Content
 */
function createMarker(lat, lng, icon, content, infowindow)
{
	var point = new GLatLng(lat, lng);
	var marker = new GMarker(point, {'icon':icon});
	GEvent.addListener(marker, 'click', function()
	{
		if (infowindow) {
			marker.openInfoWindowHtml(content);
		} else {
			updateSidebarContent(content);
		}
	});
	return marker;
}
/**
 * Zoom to Place
 */
function zoomToPlace(lat, lng, zoom) {
	map.setCenter(new GLatLng(lat, lng), zoom);
	updateMapContent(mapmode);
}
/**
 * Display Place Markers on Map
 */
function displayPlaces(placelist)
{
	map.clearOverlays();
	if (!placelist) {
		return false;
	}
	
	var icon = new GIcon(G_DEFAULT_ICON);
	icon.image = "http://www.saaste.net/aasia2008/matkapaivakirja/templates/imgs/mapicon_places.png";
	icon.shadow = null;
	icon.iconSize = new GSize(20, 20);
	icon.iconAnchor = new GPoint(10, 10);
	icon.infoWindowAnchor = new GPoint(10, 10);

	for (key in placelist) {
		if (placelist[key].id) {
			var place = placelist[key];
			var point = new GLatLng(place.lat, place.lng);
			var content = place.name + '<br />' + '<a href="javascript:zoomToPlace(' + place.lat + ', ' + place.lng + ', 11)">Zoomaa</a>';
			var marker = createMarker(place.lat, place.lng, icon, content, true);
			map.addOverlay(marker);
		}
	}
}
/**
 * Display Entry Markers on Map
 */
function displayEntries(entrylist)
{
	map.clearOverlays();
	if (!entrylist) {
		return false;
	}
	
	var icon = new GIcon(G_DEFAULT_ICON);
	icon.image = "http://www.saaste.net/aasia2008/matkapaivakirja/templates/imgs/mapicon_entries.png";
	icon.shadow = null;
	icon.iconSize = new GSize(33, 33);
	icon.iconAnchor = new GPoint(16, 16);
	icon.infoWindowAnchor = new GPoint(33, 33);
	
	for (key in entrylist) {
		if (entrylist[key].id) {
			var entry = entrylist[key];
			var point = new GLatLng(entry.lat, entry.lng);
			var marker = createEntryMarker(entry.lat, entry.lng, icon, entry.id);
			map.addOverlay(marker);
		}
	}
}
/**
 * Create Entry Marker
 */
function createEntryMarker(lat, lng, icon, entry_id)
{
	var point = new GLatLng(lat, lng);
	var marker = new GMarker(point, {'icon':icon});
	GEvent.addListener(marker, 'click', function()
	{
		var url = 'lib/ajax/mapview.php?mode=single_entry&id=' + entry_id
		new Ajax.Request(url,
		{
			method: 'get',
			onSuccess: function (transport)
			{
				var entry = eval(transport.responseText);
				var content =
					'<h2>' + entry.time + '</h2>' +
					'<p class="entry_author">' + entry.author + '</p>' +
					'<p class="entry_content">' + entry.content + '</p>';
				$('sub_content').innerHTML = content;
	       	},
	       	onFailure: function()
	       	{
		   		alert('Error when loading entry data');
			}
		});
	});
	return marker;
}
/**
 * Display Photo Markers on Map
 */
function displayPhotos(photolist)
{
	map.clearOverlays();
	if (!photolist) {
		return false;
	}
	
	var icon = new GIcon(G_DEFAULT_ICON);
	icon.image = "http://www.saaste.net/aasia2008/matkapaivakirja/templates/imgs/mapicon_photos.png";
	icon.shadow = null;
	icon.iconSize = new GSize(33, 33);
	icon.iconAnchor = new GPoint(16, 16);
	icon.infoWindowAnchor = new GPoint(33, 33);
	
	for (key in photolist) {
		if (photolist[key].id) {
			var photo = photolist[key];
			var point = new GLatLng(photo.lat, photo.lng);
			var marker = createPhotoMarker(photo.lat, photo.lng, icon, photo.id);
			map.addOverlay(marker);
		}
	}
}
/**
 * Create Photo Marker
 */
function createPhotoMarker(lat, lng, icon, photo_id)
{
	var point = new GLatLng(lat, lng);
	var marker = new GMarker(point, {'icon':icon});
	GEvent.addListener(marker, 'click', function()
	{
		var url = 'lib/ajax/mapview.php?mode=single_photo&id=' + photo_id
		new Ajax.Request(url,
		{
			method: 'get',
			onSuccess: function (transport)
			{
				var photo = eval(transport.responseText);
				var content = '<div class="entry_photo"><img src="' + photoURL + photo.filename + '" alt="Valokuva" title="Klikkaa kuvaa nähdäksesi se suurempana" /></div>';
				$('sub_content').innerHTML = content;
	       	},
	       	onFailure: function()
	       	{
		   		alert('Error when loading photo data');
			}
		});
	});
	return marker;
}
/**
 * Display Sight Markers on Map
 */
function displaySights(sightlist)
{
	map.clearOverlays();
	if (!sightlist) {
		return false;
	}
	
	var icon = new GIcon(G_DEFAULT_ICON);
	icon.image = "http://www.saaste.net/aasia2008/matkapaivakirja/templates/imgs/mapicon_sights.png";
	icon.shadow = null;
	icon.iconSize = new GSize(33, 33);
	icon.iconAnchor = new GPoint(16, 16);
	icon.infoWindowAnchor = new GPoint(33, 33);
	for (key in sightlist) {
		if (sightlist[key].id) {
			var sight = sightlist[key];
			var point = new GLatLng(sight.lat, sight.lng);
			var marker = createSightMarker(sight.lat, sight.lng, icon, sight.id);
			map.addOverlay(marker);
		}
	}
}
/**
 * Create Sight Marker
 */
function createSightMarker(lat, lng, icon, sight_id)
{
	var point = new GLatLng(lat, lng);
	var marker = new GMarker(point, {'icon':icon});
	GEvent.addListener(marker, 'click', function()
	{
		var url = 'lib/ajax/mapview.php?mode=single_sight&id=' + sight_id
		new Ajax.Request(url,
		{
			method: 'get',
			onSuccess: function (transport)
			{
				var sight = eval(transport.responseText);
				var content =
					'<h2>' + sight.name + '</h2>' +
					'<p class="sight_address">' + sight.address + '</p>' +
					'<p class="sight_description">' + sight.description + '</p>';
				$('sub_content').innerHTML = content;
	       	},
	       	onFailure: function()
	       	{
		   		alert('Error when loading sight data');
			}
		});
	});
	return marker;
}
/**
 * Display Accommodation Markers on Map
 */
function displayAccommodations(accommodationlist)
{
	map.clearOverlays();
	if (!accommodationlist) {
		return false;
	}
	
	var icon = new GIcon(G_DEFAULT_ICON);
	icon.image = "http://www.saaste.net/aasia2008/matkapaivakirja/templates/imgs/mapicon_accommodations.png";
	icon.shadow = null;
	icon.iconSize = new GSize(33, 33);
	icon.iconAnchor = new GPoint(16, 16);
	icon.infoWindowAnchor = new GPoint(33, 33);
	
	for (key in accommodationlist) {
		if (accommodationlist[key].id) {
			var accommodation = accommodationlist[key];
			var point = new GLatLng(accommodation.lat, accommodation.lng);
			var marker = createAccommodationMarker(accommodation.lat, accommodation.lng, icon, accommodation.id);
			map.addOverlay(marker);
		}
	}
}
/**
 * Create Accommodation Marker
 */
function createAccommodationMarker(lat, lng, icon, accommodation_id)
{
	var point = new GLatLng(lat, lng);
	var marker = new GMarker(point, {'icon':icon});
	GEvent.addListener(marker, 'click', function()
	{
		var url = 'lib/ajax/mapview.php?mode=single_accommodation&id=' + accommodation_id
		new Ajax.Request(url,
		{
			method: 'get',
			onSuccess: function (transport)
			{
				var accommodation = eval(transport.responseText);
				var content =
					'<h2>' + accommodation.name + '</h2>' +
					'<p class="accommodation_address">' + accommodation.address + '</p>' +
					'<p class="accommodation_contact">' + accommodation.contact + '</p>' +
					'<p class="accommodation_price">Hinta: ' + accommodation.price + ' euroa</p>' +
					'<p class="accommodation_description">' + accommodation.description + '</p>';
				$('sub_content').innerHTML = content;
	       	},
	       	onFailure: function()
	       	{
		   		alert('Error when loading accommodation data');
			}
		});
	});
	return marker;
}
