/*
Name		:	Object - Google Map
Author/s	:	Yang Wong
Related		:
*/

// CLASS //

var COM_CIPHERCITIES_GOOGLEMAP = Class.create();
COM_CIPHERCITIES_GOOGLEMAP.prototype =
{

	// CONSTRUCTOR //

	initialize: function()
	{
	}

}

// CONSTANTS //

COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES = 	COM_CIPHERCITIES_GLOBALS.URL_SITE+
										COM_CIPHERCITIES_GLOBALS.PA_IMAGES+
										'googlemap/';

COM_CIPHERCITIES_GOOGLEMAP.DEFAULT_POINT	= new GLatLng(-26, 133); // Australia
COM_CIPHERCITIES_GOOGLEMAP.DEFAULT_ZOOM		= 1;
COM_CIPHERCITIES_GOOGLEMAP.DEFAULT_ZOOM_ALT	= 0;

COM_CIPHERCITIES_GOOGLEMAP.ICON_LOCATED						= new GIcon();
COM_CIPHERCITIES_GOOGLEMAP.ICON_LOCATED.image 				= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'game_individual_located.png';
COM_CIPHERCITIES_GOOGLEMAP.ICON_LOCATED.iconSize 			= new GSize(37, 41);
COM_CIPHERCITIES_GOOGLEMAP.ICON_LOCATED.shadow 				= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'game_individual_shadow_located.png';
COM_CIPHERCITIES_GOOGLEMAP.ICON_LOCATED.shadowSize 			= new GSize(50, 41);
COM_CIPHERCITIES_GOOGLEMAP.ICON_LOCATED.iconAnchor 			= new GPoint(1, 41);
COM_CIPHERCITIES_GOOGLEMAP.ICON_LOCATED.infoWindowAnchor 	= new GPoint(17, 21);
COM_CIPHERCITIES_GOOGLEMAP.ICON_LOCATED.printImage 			= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'printimage_game_individual_located.gif';
COM_CIPHERCITIES_GOOGLEMAP.ICON_LOCATED.mozPrintImage 		= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'moz_printimage_game_individual_located.gif';
COM_CIPHERCITIES_GOOGLEMAP.ICON_LOCATED.printShadow 		= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'print_game_individual_shadow_located.gif';
COM_CIPHERCITIES_GOOGLEMAP.ICON_LOCATED.transparent 		= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'transparent_game_individual_located.gif';
COM_CIPHERCITIES_GOOGLEMAP.ICON_LOCATED.imageMap 			= [1,15, 5,5, 14,0, 22,0, 31,5, 36,15, 36,22, 31,31, 22,35, 14,34, 11,33, 5,40, 2,40, 1,38];

COM_CIPHERCITIES_GOOGLEMAP.ICON_ANYWHERE					= new GIcon();
COM_CIPHERCITIES_GOOGLEMAP.ICON_ANYWHERE.image 				= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'game_individual_anywhere.png';
COM_CIPHERCITIES_GOOGLEMAP.ICON_ANYWHERE.iconSize 			= new GSize(37, 41);
COM_CIPHERCITIES_GOOGLEMAP.ICON_ANYWHERE.shadow 			= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'game_individual_shadow_anywhere.png';
COM_CIPHERCITIES_GOOGLEMAP.ICON_ANYWHERE.shadowSize 		= new GSize(50, 41);
COM_CIPHERCITIES_GOOGLEMAP.ICON_ANYWHERE.iconAnchor 		= new GPoint(1, 41);
COM_CIPHERCITIES_GOOGLEMAP.ICON_ANYWHERE.infoWindowAnchor 	= new GPoint(17, 21);
COM_CIPHERCITIES_GOOGLEMAP.ICON_ANYWHERE.printImage 		= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'printimage_game_individual_anywhere.gif';
COM_CIPHERCITIES_GOOGLEMAP.ICON_ANYWHERE.mozPrintImage 		= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'moz_printimage_game_individual_anywhere.gif';
COM_CIPHERCITIES_GOOGLEMAP.ICON_ANYWHERE.printShadow 		= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'print_game_individual_shadow_anywhere.gif';
COM_CIPHERCITIES_GOOGLEMAP.ICON_ANYWHERE.transparent 		= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'transparent_game_individual_anywhere.gif';
COM_CIPHERCITIES_GOOGLEMAP.ICON_ANYWHERE.imageMap 			= [1,15, 5,5, 14,0, 22,0, 31,5, 36,15, 36,22, 31,31, 22,35, 14,34, 11,33, 5,40, 2,40, 1,38];

COM_CIPHERCITIES_GOOGLEMAP.ICON_GROUP_LOCATED					= new GIcon();
COM_CIPHERCITIES_GOOGLEMAP.ICON_GROUP_LOCATED.image 			= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'game_group_located.png';
COM_CIPHERCITIES_GOOGLEMAP.ICON_GROUP_LOCATED.iconSize 			= new GSize(41, 47);
COM_CIPHERCITIES_GOOGLEMAP.ICON_GROUP_LOCATED.shadow 			= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'game_group_shadow_located.png';
COM_CIPHERCITIES_GOOGLEMAP.ICON_GROUP_LOCATED.shadowSize 		= new GSize(54, 47);
COM_CIPHERCITIES_GOOGLEMAP.ICON_GROUP_LOCATED.iconAnchor 		= new GPoint(1, 47);
COM_CIPHERCITIES_GOOGLEMAP.ICON_GROUP_LOCATED.infoWindowAnchor 	= new GPoint(20, 15);
COM_CIPHERCITIES_GOOGLEMAP.ICON_GROUP_LOCATED.printImage 		= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'printimage_game_group_located.gif';
COM_CIPHERCITIES_GOOGLEMAP.ICON_GROUP_LOCATED.mozPrintImage 	= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'moz_printimage_game_group_located.gif';
COM_CIPHERCITIES_GOOGLEMAP.ICON_GROUP_LOCATED.printShadow 		= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'print_game_group_shadow_located.gif';
COM_CIPHERCITIES_GOOGLEMAP.ICON_GROUP_LOCATED.transparent 		= COM_CIPHERCITIES_GOOGLEMAP.PA_IMAGES+'transparent_game_group_located.gif';
COM_CIPHERCITIES_GOOGLEMAP.ICON_GROUP_LOCATED.imageMap 			= [1,23, 6,18, 7,8, 14,1, 28,1, 35,9, 35,20, 40,26, 40,38, 31,44, 22,44, 15,38, 10,40, 5,46, 2,46, 1,44, 1,24];

// STATIC //

COM_CIPHERCITIES_GOOGLEMAP.getMarkerCountryData = function(marker, callback)
{
	var geocoder = new GClientGeocoder();
	var point = marker.getLatLng();
	geocoder.getLocations(point.y+','+point.x, COM_CIPHERCITIES_GOOGLEMAP.processGetMarkerCountryData.bind(this, callback));
}

COM_CIPHERCITIES_GOOGLEMAP.processGetMarkerCountryData = function(callback, result)
{
	var data = new Object();
	if (result.Placemark[0] != null)
	{
		data.name = result.Placemark[0].address;
		if (result.Placemark[0].AddressDetails)
		{
			data.code = result.Placemark[0].AddressDetails.Country.CountryNameCode;
		}
		else
		{
			data.code = null;
		}
	}
	else
	{
		data.name = null;
		data.code = null;
	}
	callback(data);
}

COM_CIPHERCITIES_GOOGLEMAP.hideGroupMarkers = function(
													   markerCache,
													   currentLevel
													   )
{
	// If parsed marker data exists for currentLevel
	if (markerCache[currentLevel] != null)
	{
		// Hide group markers
		for (var i=0; i<markerCache[currentLevel].groupMarkers.length; i++)
		{
			markerCache[currentLevel].groupMarkers[i].hide();
		}
	}
}

COM_CIPHERCITIES_GOOGLEMAP.showGroupMarkers = function(
													   markerCache,
													   currentLevel
													   )
{
	// If parsed marker data exists for currentLevel
	if (markerCache[currentLevel] != null)
	{
		// Show group markers
		for (var i=0; i<markerCache[currentLevel].groupMarkers.length; i++)
		{
			markerCache[currentLevel].groupMarkers[i].show();
		}
	}
}

COM_CIPHERCITIES_GOOGLEMAP.groupMarkers = function(
												   map,
												   markers,
												   markerCache,
												   oldLevel,
												   newLevel,
												   mouseOverCallback,
												   mouseOverScope,
												   mouseOverArgs
												   )
{
	// Parsed marker data
	// markerCache[]
	//  groupMarkers[]
	//   marker{}
	//  groupedMarkers[]
	//   marker{}

	// If parsed marker data exists for oldLevel
	if (markerCache[oldLevel] != null)
	{
		// Hide group markers
		for (var i=0; i<markerCache[oldLevel].groupMarkers.length; i++)
		{
			markerCache[oldLevel].groupMarkers[i].hide();
		}
		// Show grouped markers
		for (var i=0; i<markerCache[oldLevel].groupedMarkers.length; i++)
		{
			markerCache[oldLevel].groupedMarkers[i].show();
		}
	}

	// If parsed marker data exists for newLevel
	if (markerCache[newLevel] != null)
	{
		// Show group markers
		for (var i=0; i<markerCache[newLevel].groupMarkers.length; i++)
		{
			markerCache[newLevel].groupMarkers[i].show();
		}
		// Hide grouped markers
		for (var i=0; i<markerCache[newLevel].groupedMarkers.length; i++)
		{
			markerCache[newLevel].groupedMarkers[i].hide();
		}
		return;
	}

	// If parsed marker data does not exist for newLevel, create
	markerCache[newLevel] = new Object();
	markerCache[newLevel].groupMarkers = new Array();
	markerCache[newLevel].groupedMarkers = new Array();
	var projection = map.getCurrentMapType().getProjection();
	var numMarkers = markers.length;
	for (var i=0; i<numMarkers; i++)
	{
		if (!markers[i].isHidden())
		{
			var pixel = projection.fromLatLngToPixel(markers[i].getLatLng(), newLevel);
			var iconSize = COM_CIPHERCITIES_GOOGLEMAP.ICON_LOCATED.iconSize;
			var hitArea = new GBounds(pixel.x-iconSize.width/2, pixel.y-iconSize.height/2, pixel.x+iconSize.width/2, pixel.y+iconSize.height/2);
			var containedPoints = new Array();
			var groupedMarkerIDs = new Array();

			for (var ii=0; ii<numMarkers; ii++)
			{
				if (!markers[ii].isHidden() && ii != i)
				{
					var pp = projection.fromLatLngToPixel(markers[ii].getLatLng(), newLevel);
					if (hitArea.containsPoint(pp))
					{
						containedPoints.push(pp);
						markerCache[newLevel].groupedMarkers.push(markers[ii]);
						groupedMarkerIDs.push(ii);
					}
				}
			}

			if (containedPoints.length > 0)
			{
				markerCache[newLevel].groupedMarkers.push(markers[i]);
				groupedMarkerIDs.push(i);

				var bounds = new GBounds(pixel.x, pixel.y, pixel.x, pixel.y);
				for (var ii=0; ii<containedPoints.length; ii++)
				{
					bounds.extend(containedPoints[ii]);
				}
				var point = projection.fromPixelToLatLng(bounds.mid(), newLevel);
				var icon = COM_CIPHERCITIES_GOOGLEMAP.ICON_GROUP_LOCATED;
				var marker = new GMarker(point, {icon: icon});
				if (mouseOverCallback != null && mouseOverScope != null)
				{
					if (mouseOverArgs != null)
					{
						GEvent.addListener(marker, 'mouseover', mouseOverCallback.bind(mouseOverScope, marker, groupedMarkerIDs, mouseOverArgs));
					}
					else
					{
						GEvent.addListener(marker, 'mouseover', mouseOverCallback.bind(mouseOverScope, marker, groupedMarkerIDs));
					}
				}
				map.addOverlay(marker);
				markerCache[newLevel].groupMarkers.push(marker);

				for (var ii=0; ii<markerCache[newLevel].groupedMarkers.length; ii++)
				{
					markerCache[newLevel].groupedMarkers[ii].hide();
				}
			}
		}
	}
}

/*
Thanks Jerome Paradis!
http://blog.jeromeparadis.com/archive/2007/02/08/1468.aspx
*/
COM_CIPHERCITIES_GOOGLEMAP.fitMap = function(map, points)
{
	var bounds = new GLatLngBounds();
	for (var i=0; i<points.length; i++)
	{
		if (points[i] != null) bounds.extend(points[i]);
	}
	//map.setZoom(map.getBoundsZoomLevel(bounds));
	//map.setCenter(bounds.getCenter());
	var returnValues = {point:bounds.getCenter(), zoom:map.getBoundsZoomLevel(bounds)};
	map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
	return returnValues;
}
