/***********************************************************************************
 * Class: CGMap
 * Dependencies: none
 * Description:
 *   Google map class
 *
 ***********************************************************************************/

	// Window class
	function CGMap() {}
	
	// Check server name for correct map id (http://code.google.com/apis/maps/signup.html)
	switch(document.location.href.replace(/^http:\/\/(www\.)*|\/.*$/ig, '').toLowerCase()) {
	case 'localhost':	CGMap.MAP_ID = 'ABQIAAAAmOOWRAh4Orkt1hppiDNP_xT2yXp_ZAY8_ufC3CFXhHIE1NvwkxRXtAfwj64L_SRnvaPCUiNwMa3S1A'; break;
	case 'server':		CGMap.MAP_ID = 'ABQIAAAAmOOWRAh4Orkt1hppiDNP_xQaOzcbF5ealenFI9Pv5eWXfr2UbRSbEOxlP1a2pnXf_4CE8BrY8DcTyQ'; break;
	case 'metronet.ie':	CGMap.MAP_ID = 'ABQIAAAAmOOWRAh4Orkt1hppiDNP_xTBRqcwQPZzgfT5FBVy0N9vIv40ZRSzH8c2WQu0EacbYIRT7m5SOR4xIg'; break;
	default:			CGMap.MAP_ID = 'ABQIAAAARWJd3zcfd6IN18CQ4q-dlBThbk_Go5G3K_3As7r-CTxiEADvwBR8UsmEwStFg9o8ktrg1NXm7RrJ4A'; break;
	};

	CGMap.MAP_VERSION = 2;
	CGMap.MAP_SCRIPT_URL = 'http://maps.google.com/maps?file=api&amp;v=' + CGMap.MAP_VERSION + '&amp;key=' + CGMap.MAP_ID;
	//CGMap.MAP_SCRIPT_URL = 'http://maps.google.com/maps/api/js?sensor=false';//&amp;v=' + CGMap.MAP_VERSION + '&amp;key=' + CGMap.MAP_ID;
	
	CGMap.MAP_SHOW_COORDS = false;
	CGMap.MAP_CONTROLS = "size,type";
	CGMap.MAP_DEFAULT_LAT = 51.51004120260676;
	CGMap.MAP_DEFAULT_LNG = -0.0882965087890625;
	CGMap.MAP_DEFAULT_ZOOM = 3;
	
	// Include main google map script
	document.write('<script src="' + CGMap.MAP_SCRIPT_URL + '" type="text/javascript"></script>\r\n');

	CGMap.map = null;

	
	CGMap.getStaticMap = function(width, height, markers, lat, lng, zoom, maptype) {
		if(markers != null) {
			var out = '';
			for(var i = 0; i < markers.length; i++) {
				var marker = markers[i];
				
				// color:blue|label:S|40.702147,-74.015794
				out += '&markers=color:' + marker.color + '|label:' + marker.letter + '|' + marker.lat + "," + marker.lng;
			}
			markers = out;
		}
		else
			markers = '';
		
		if(maptype == null)
			maptype = 'roadmap';
			
		var url = "http://maps.google.com/maps/api/staticmap?center=" + lat + "," + lng + "&zoom=" + (19 - zoom) + 
			"&size=" + width + "x" + height + "&maptype=" + maptype + markers + "&key=" + CGMap.MAP_ID + "&sensor=false";
		var link = "http://maps.google.com/maps?ll=" + lat + "," + lng + "&zoom=" + (19 - zoom);
		
		return {
			src:url,
			href:link,
			html:'<a href="' + link + '" target="_blank"><img src="' + url + '" width="' + width + '" height="' + height + '" border="0" /></a>'
		};
	};
	
	// Load map
	CGMap.staticMap = function(width, height, markers, lat, lng, zoom, maptype) {
		var map = CGMap.getStaticMapUrl(width, height, markers, lat, lng, zoom, maptype);
		document.write(map.html);
	}
	
	// Load map
	CGMap.loadMap3 = function(id, markersURL, controls, lat, lng, zoom) {
		// Get defaults
		if(controls == null)
			controls = CGMap.MAP_CONTROLS;
		if(lat == null || lat == '')
			lat = CGMap.MAP_DEFAULT_LAT;
		if(lng == null || lng == '')
			lng = CGMap.MAP_DEFAULT_LNG;
		if(zoom == null)
			zoom = CGMap.MAP_DEFAULT_ZOOM;

		var latlng = new google.maps.LatLng(lat, lng);
	    var options = {
	      zoom: zoom,
	      center: latlng,
	      mapTypeId: google.maps.MapTypeId.ROADMAP
	    };
		
		if(controls.indexOf("size") >= 0) {
			options.navigationControl = true;
			options.navigationControlOptions = {
				//style:google.maps.NavigationControlStyle.ZOOM_PAN
				style:google.maps.NavigationControlStyle.ZOOM_PAN
				/*
				 ANDROID  	The small zoom control similar to the one used by the native Maps application on Android.
				 DEFAULT 	The default navigation control. The control which DEFAULT maps to will vary according to map size and other factors. It may change in future versions of the API.
				 SMALL 	The small, zoom only control.
				 ZOOM_PAN 	The larger control, with the zoom slider and pan directional pad.
				*/
			};
		}
		else
			options.navigationControl = false;
		options.mapTypeControl = (controls.indexOf("type") >= 0);
					
	    var map = new google.maps.Map(document.getElementById(id), options);
	};
	
	// Load map
	CGMap.loadMap = function(id, markersURL, controls, lat, lng, zoom) {
		if(window.GBrowserIsCompatible && GBrowserIsCompatible()) {
			CGMap.map = new GMap(document.getElementById(id));

			// Get defaults
			if(controls == null)
				controls = CGMap.MAP_CONTROLS;
			if(lat == null || lat == '')
				lat = CGMap.MAP_DEFAULT_LAT;
			if(lng == null || lng == '')
				lng = CGMap.MAP_DEFAULT_LNG;
			if(zoom == null)
				zoom = CGMap.MAP_DEFAULT_ZOOM;

			if(controls.indexOf("size") >= 0)
				CGMap.map.addControl(new GLargeMapControl());
			if(controls.indexOf("type") >= 0)
				CGMap.map.addControl(new GMapTypeControl());
			
			CGMap.map.centerAndZoom(new GLatLng(lat, lng), zoom);

			if(CGMap.MAP_SHOW_COORDS && document.getElementById("gmap_message")) {
				GEvent.addListener(map, "click", function(overlay, point) {
				  //var center = map.getCenter();
				  var obj = document.getElementById("gmap_message");
				  if(obj)
					  obj.innerHTML = "(Latitude, Longitude) " + point.toString();
				});
			}
			
			/*
			var baseIcon = new GIcon();
			baseIcon.image = "img/google_maps/red.png";
			baseIcon.shadow = "img/google_maps/shadow.png";
			baseIcon.iconSize = new GSize(12, 20);
			baseIcon.shadowSize = new GSize(22, 20);
			baseIcon.iconAnchor = new GPoint(6, 20);
			baseIcon.infoWindowAnchor = new GPoint(5, 1);
			*/
			
			// Get map locations and put on the map
			if(markersURL != null && markersURL != "") {
				// Creates a marker at the given point with the given number label
				function createMarker(point, info) {
					var marker = new GMarker(point);
					GEvent.addListener(marker, "click", function() {
						marker.openInfoWindowHtml(info);
					});
					return marker;
				}
	
				var request = GXmlHttp.create();
				request.open('GET', markersURL, true);
				request.onreadystatechange = function() {
					if(request.readyState == 4) {
						var xmlDoc = request.responseXML;
						var items = xmlDoc.documentElement.getElementsByTagName("item");
	
						for(var i = 0; i < items.length; i++) {
							var item = items[i];
							var lat = item.getAttribute("lat"); // North-South
							var lng = item.getAttribute("lng"); // East-West
							var info = item.getAttribute("info");
							
							var point = new GLatLng(lat, lng);
							CGMap.map.addOverlay(createMarker(point, info));
						}
					}
				}
				request.send(null);
			}
		}
	};

	// Draggable marker
	CGMap.addDraggable = function(id, controls, lat, lng, zoom, dragEndFunc, clickFunc) {
		CGMap.loadMap(id, null, controls, lat, lng, zoom);
		if(CGMap.map) {
			var marker = new GMarker(new GLatLng(lat, lng), {draggable: true});
			GEvent.addListener(marker, "dragstart", function() {
				CGMap.map.closeInfoWindow();
			});
			if(dragEndFunc != null) {
				GEvent.addListener(marker, "dragend", function() {
					dragEndFunc(marker, CGMap.getMarkerPoint(marker));
				});
			}
			if(clickFunc != null) {
				GEvent.addListener(marker, "click", function() {
					clickFunc(marker, CGMap.getMarkerPoint(marker));
				});
			}
			CGMap.map.addOverlay(marker);
		}
	};
	
	CGMap.getMarkerPoint = function(marker) {
		var point = marker.getPoint();
		return {lat:point.x, lng:point.y};
	};
	
	CGMap.setMarkerInfo = function(marker, info) {
		marker.openInfoWindowHtml(info);
	};
	
	/*

	CGMap.addressToPoint = function(address) {
		if(!CGMap.geoCoder)
			CGMap.geoCoder = new new GClientGeocoder();
		
		CGMap.geoCoder.getLatLng(address, function(point) {
			;				   
		});
	};
		function showAddress(address) {
		  if (geocoder) {
			geocoder.getLatLng(
			  address,
			  function(point) {
				if (!point) {
				  alert(address + " not found");
				} else {
				  map.setCenter(point, 13);
				  var marker = new GMarker(point);
				  map.addOverlay(marker);
				  marker.openInfoWindowHtml(address);
				}
			  }
			);
		  }
		}
	*/