var map;            // Global map object.
var centroid;       // Global centerpoint for map.
var bounds;         // Constraining rectangle.
var Locations = 9;  // Number of meeting locations to plot.
var zoomStd = 13;   // Initial zoom level.
var zoomMtg = 16;   // Zoom in to a single location.
var gmarkers = [];  // Array of markers

function GLoad() {
	if (GBrowserIsCompatible()) {
		buildMap(); 
	}
}

function GLoadAround(x,y) {
	if (GBrowserIsCompatible()) {
		buildMapAround(x,y); 
	}
}

function buildMap() {
	map = new GMap2(document.getElementById('map_canvas'));
	map.addControl(new GLargeMapControl());  // zoom, pan
	map.addControl(new GMapTypeControl());   // map, satellite, hybrid
	map.addControl(new GScaleControl());     // scalebar
	map.enableScrollWheelZoom();             // allow zooming with wheel

	// Must setCenter before starting to add markers
	map.setCenter(new GLatLng(0,0),0);  
	
	// Create an empty bounds object to constrain initial zoom.
	bounds = new GLatLngBounds();
	
	// Create a base icon for all of our markers that specifies the
	// shadow, icon dimensions, etc.
	var baseIcon = new GIcon();
	baseIcon.shadow = 'http://www.google.com/mapfiles/shadow50.png';
	baseIcon.iconSize = new GSize(20, 34);
	baseIcon.shadowSize = new GSize(37, 34);
	baseIcon.iconAnchor = new GPoint(9, 34);
	baseIcon.infoWindowAnchor = new GPoint(9, 2);
	baseIcon.infoShadowAnchor = new GPoint(18, 25);
	
	// Creates a marker whose info window displays the letter
	// corresponding to the given index.
	function createMarker(point, index, html) {
		// Create a lettered icon for this point using our icon class
		var letteredIcon = new GIcon(baseIcon);
		letteredIcon.image = 'http://www.google.com/mapfiles/marker' + getLetter(index) + '.png';
		
		// Set up our GMarkerOptions object
		markerOptions = { icon:letteredIcon };
		var marker = new GMarker(point, markerOptions);
		
		// Extend map bounds to include this point.
		bounds.extend(point);
		// Persist a global reference to this marker.
		gmarkers[index] = marker;
		
		// Create an event handler for clicks.
		GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowHtml(html);
		});

		// Return new marker object.		
		return marker;
	}
	
	// Add familiar meeting locations
	for (var i = 0; i < Locations; i++) {	
		var location = getLocation(i);
		var point = new GLatLng(location.lat, location.lng);
		map.addOverlay(createMarker(point, i, getBalloon(location)));
	}
	
	// Zoom and Center to bounding rectangle that includes all points.
	zoomStd = map.getBoundsZoomLevel(bounds) - 1;
	map.setZoom(zoomStd);
	centroid = bounds.getCenter();
	map.setCenter(centroid);

	// Make sure "Zoom To All" is visible in non-default situations.
	GEvent.addListener(map, "moveend", function() {
		showZoomAll(true);
	});	
}

function buildMapAround(location) {
	map = new GMap2(document.getElementById('map_canvas'));
	map.addControl(new GLargeMapControl());  // zoom, pan
	map.addControl(new GMapTypeControl());   // map, satellite, hybrid
	map.addControl(new GScaleControl());     // scalebar
	map.enableScrollWheelZoom();             // allow zooming with wheel
	map.setMapType(G_HYBRID_MAP);

	var point = new GLatLng(location.lat, location.lng);
	map.setCenter(point, zoomMtg);  

	var html = getBalloon(location);
	map.addOverlay(createMarker(point, html));

	// A function to create the marker and set up the event window
	// Dont try to unroll this function. It has to be here for the function closure
	// Each instance of the function preserves the contends of a different instance
	// of the "marker" and "html" variables which will be needed later when the event triggers.    
	function createMarker(point, html) {
		var marker = new GMarker(point);
		GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowHtml(html);
		});
		return marker;
	}
}


function formatXY(x, y) {
	return "(" + x + ", " + y + ")";
}

function getBalloon(location) {
	return '<b>' + location.desc + '</b>' +
		'&nbsp;&nbsp;&nbsp;(' + getDirLink(location.addr, 'directions', location.desc) + ')' + 
		'<br>' + location.addr + 
		'<br><a href="' + location.url + '" target="_blank">' + location.url + '</a>';
}

function getBalloonEx(desc,addr,url) {
	return '<b>' + location.desc + '</b>' +
		'&nbsp;&nbsp;&nbsp;(' + getDirLink(location.addr, 'directions', location.desc) + ')' + 
		'<br>' + location.addr + 
		'<br><a href="' + location.url + '" target="_blank">' + location.url + '</a>';
}

function getDirLink(addr, text, desc) {
	return '<a href="http://maps.google.com/maps?&daddr=' + addr + 
		'+(' + desc + ')' +
		'" target="_blank" title="Get driving directions from Google">' + text + '</a>'
}

function getLetter(index) {
	 return String.fromCharCode("A".charCodeAt(0) + index);
}

function getLocation(index) {
	var locations = new Array();
	locations[0] = { lat:45.631368, lng:-122.677567, desc:'Clark County Public Service Center', addr:'1300 Franklin St, Vancouver, WA 98660', url:'http://www.rtc.wa.gov' };
	locations[1] = { lat:45.632138, lng:-122.677200, desc:'Clark County Elections / Auto Licensing', addr:'1408 Franklin St, Vancouver, WA 98660', url:'' };
	locations[2] = { lat:45.643405, lng:-122.703774, desc:'Port of Vancouver USA Administrative Office', addr:'3103 NW Lower River Rd, Vancouver, WA 98660', url:'http://www.portvanusa.com/about/drivingdir.html' };
	locations[3] = { lat:45.631510, lng:-122.670113, desc:'Vancouver City Hall', addr:'210 E 13th St, Vancouver, WA 98660', url:'http://www.cityofvancouver.us/' };
	locations[4] = { lat:45.630038, lng:-122.663023, desc:'Clark Public Utilities', addr:'1200 Fort Vancouver Way, Vancouver, WA 98663', url:'http://www.clarkpublicutilities.com/contactus/offices' };
	locations[5] = { lat:45.639052, lng:-122.657920, desc:'Clark County Public Health', addr:'1601 East Fourth Plain Blvd, Vancouver, WA 98661', url:'http://www.clark.wa.gov/health/' };
	locations[6] = { lat:45.594472, lng:-122.505375, desc:'Fisher\'s Landing Transit Center', addr:'3510 SE 164th Ave, Vancouver, WA 98683', url:'http://www.c-tran.com/' };
	locations[7] = { lat:45.660079, lng:-122.559308, desc:'WSDOT SW Region Headquarters', addr:'11018 NE 51st Cir, Vancouver, WA 98682', url:'http://wsdot.wa.gov/Regions/SouthWest/' };
	locations[8] = { lat:45.527495, lng:-122.660272, desc:'Metro Regional Center', addr:'600 NE Grand Ave, Portland, OR 97232', url:'http://www.oregonmetro.gov/index.cfm/go/by.web/id=3315' };
	return locations[index];	
}

function showZoomAll(show) {
	var zout = document.getElementById("zoomout");
	if (show) {
		zout.style.display = "block";
	}
	else {
		zout.style.display = "none";
	}
}

function zoomLocation(index) {
	showZoomAll(true);
	map.setZoom(zoomMtg);
	map.setMapType(G_HYBRID_MAP);
	// Trigger a click event, which pops the balloon.
	GEvent.trigger(gmarkers[index], "click");
	map.panTo(gmarkers[index].getPoint());
}

function zoomAll() {
	map.setCenter(centroid, zoomStd);  
	map.setMapType(G_NORMAL_MAP);
	map.closeInfoWindow();
	showZoomAll(false);
}
