/**
 *  gmap_global.v3.js
 *  Utility functions for google map V3
 *  @author Olivier Patry / Matthieu Goulet
 *  @copyright Cyber Generation (http://www.cybergeneration.com)
 */

var map ;
var geocoder;

var markers = [];

//Create our "tiny" marker icon
var gYellowIcon = new google.maps.MarkerImage(
	"http://labs.google.com/ridefinder/images/mm_20_yellow.png",
  	new google.maps.Size(12, 20),
  	new google.maps.Point(0, 0),
  	new google.maps.Point(6, 20)
);
var gRedIcon = new google.maps.MarkerImage(
  	"http://labs.google.com/ridefinder/images/mm_20_red.png",
  	new google.maps.Size(12, 20),
  	new google.maps.Point(0, 0),
  	new google.maps.Point(6, 20)
);
var gSmallShadow = new google.maps.MarkerImage(
  	"http://labs.google.com/ridefinder/images/mm_20_shadow.png",
  	new google.maps.Size(22, 20),
  	new google.maps.Point(0, 0),
  	new google.maps.Point(6, 20)
);


// Adds a marker to the map based on specified latitude and longitude
function addMarkerFromCoordinates(latitude,longitude,description,tooltip)
{
	var location = new google.maps.LatLng(latitude, longitude);

	var marker = new google.maps.Marker({
        map: map,
		title: tooltip,
        position: location,
		icon: gYellowIcon,
		shadow: gSmallShadow
    });

	markers.push(marker);

	var infowindow = new google.maps.InfoWindow({
		content: description
	});

	var zPos = marker.getZIndex();

	$j("h5[title='" + tooltip + "']").click(function ()
	{
		infowindow.open(map,marker);
	});

	$j("h5[title='" + tooltip + "']").hover(function ()
	{
		marker.setZIndex(999);
		marker.setIcon(gRedIcon);
	}, function ()
	{
		marker.setZIndex(zPos);
		marker.setIcon(gYellowIcon);
	});



	google.maps.event.addListener(marker, 'click', function()
	{
		infowindow.open(map,marker);
	});
}

// Adds a marker to the map based on specified address (uses google's geocoder service)
function addMarkerFromAddress(address,description,tooltip)
{
	if (geocoder)
	{
		geocoder.geocode( { 'address': address}, function(results, status)
	    {
	        if (status == google.maps.GeocoderStatus.OK)
	        {
	        	var marker = new google.maps.Marker({
	        		map: map,
	        		position: results[0].geometry.location,
	        		icon: gYellowIcon,
	        		shadow: gSmallShadow
	            });

	        	markers.push(marker);

	        	var infowindow = new google.maps.InfoWindow({
	        		content: description
	        	});

				var zPos = marker.getZIndex();

				$j("h5[title='" + tooltip + "']").click(function ()
				{
					infowindow.open(map,marker);
				});

				$j("h5[title='" + tooltip + "']").hover(function ()
				{
					marker.setZIndex(999);
					marker.setIcon(gRedIcon);
				}, function ()
				{
					marker.setZIndex(zPos);
					marker.setIcon(gYellowIcon);
				});

	        	google.maps.event.addListener(marker, 'click', function()
	        	{
	        		infowindow.open(map,marker);
	        	});
	        }
	        else
	        {
	        	alert("Geocode was not successful for the following reason: " + status);
	        }
	    });
	}
}

// Updates map markers from server-passed JSON data
function UpdateMarkers(url, data)
{
	var ajx = new Ajax.Request( url,
	{
		method: 'post',
		parameters: data,
		onComplete: updateMarkerFromServer,
		onFailure : function(transport)
		{
			console.log("UpdateMarkers() failed (error : " + transport.status + ")");
		}
	});
}

// Callback function for server JSON update
function updateMarkerFromServer(objResponse)
{
	// Get string and evaluate as JSON
	var markerdata = objResponse.responseText.evalJSON(true);

	// Clear current map overlays (markers)
	for ( var i = 0; i < markers.length; i++)
	{
		markers[i].setMap(null);
	}

	// Loop through markers
	for (key in markerdata)
	{
		// Verify that data is valid
		if(markerdata.hasOwnProperty(key))
		{
			// Set current element data
			var element = markerdata[key];

			// Marker type = address
			if (element.type == 'address')
			{
				addMarkerFromAddress(element.address,element.description,element.tooltip);
			}
			else // Marker type = coordinates
			{
				addMarkerFromCoordinates(element.latitude,element.longitude,element.description,element.tooltip);
			}
		}
	}
}
