// Set up the data for the 14 events
var events = {
		1: {lat: 51.046878, lng: -114.058742},
		2: {lat: 51.076963, lng: -114.130079},
		3: {lat: 51.042351, lng: -114.062385},
		4: {lat: 51.045688, lng: -114.068209},
		5: {lat: 51.045447, lng: -114.058079},
		6: {lat: 51.045688, lng: -114.068209},
		7: {lat: 51.046878, lng: -114.058842},
		8: {lat: 51.048111, lng: -114.057914},
		9: {lat: 51.044548, lng: -114.061061},
		10: {lat: 51.044548, lng: -114.061161},
		11: {lat: 51.047169, lng: -114.05787},
		12: {lat: 51.047169, lng: -114.05797},
		13: {lat: 51.045575, lng: -114.063384},
		14: {lat: 51.045575, lng: -114.063484}
		};

// Set up the data for the 2 big orbs
var orbs = {
		festival: {
				lat: 51.042904, lng: -114.089756,
				tabs: ["Rupture", "Guide"],
				tooltip: "Rupture (festival)",
				width: 127, height: 123
				},
		artcity: {
				lat: 51.034161, lng: -114.023666,
				tabs: ["Artcity", "History", "People", "Contact", "Next year"],
				tooltip: "Artcity (organization)",
				width: 113, height: 113
				}
		};

var map;

function load() {
	if (GBrowserIsCompatible()) {
  	
		// Create the map
	    map = new GMap2(document.getElementById("map"));

		// Add controls
		map.addControl(createControl("logo"), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(0, 0)));
		map.addControl(createControl("guidelink"), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10, 80)));
		map.addControl(createControl("credit"), new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(3, 18)));
		map.addControl(new GSmallZoomControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10, 10)));
		
		// Center on Calgary
	    map.setCenter(new GLatLng(51.049488, -114.060573), 13);
	
		// Get map bounds
		var bounds = map.getBounds();
		var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();
		var latSpan = northEast.lat() - southWest.lat();
		var lngSpan = northEast.lng() - southWest.lng();
									
		// Add the 11 event markers to the map with default icons
		for (var eventNum in events) {
			var event = events[eventNum];
			event.content = document.getElementById("event" + eventNum);
			event.marker = createEventMarker(eventNum);
			map.addOverlay(event.marker);
		}
	
		// Add the 2 Artcity markers to the map with special icons
		for (orbName in orbs) {
			var orb = orbs[orbName];
			for (i = 0; i < orb.tabs.length; i++) orb.tabs[i] = new GInfoWindowTab(orb.tabs[i], document.getElementById(orbName + "Tab" + (i + 1)));
			orb.marker = createOrbMarker(orbName);
			map.addOverlay(orb.marker);
		};
		
		// Listen for events that may change the bounds of the map
		GEvent.addListener(map, "zoomend", boundsChanged);
		GEvent.addListener(map, "dragend", boundsChanged);
		setInterval(boundsChanged, 2000);
		
	}
}

function createControl(fromId) {
	var control = function() { }
	control.prototype = new GControl();
	control.prototype.initialize = function(map) { 
		var node = document.getElementById(fromId);
		map.getContainer().appendChild(node);
		return node;
	}
	return new control(true, false);
}

function createEventMarker(eventNum) {
	var event = events[eventNum];
	var marker = new GMarker(new GLatLng(event.lat, event.lng));
	GEvent.addListener(marker, "click", function() { marker.openInfoWindow(event.content); });
	return marker;
}
function createOrbMarker(orbName) {
	var orb = orbs[orbName];
	var icon = new GIcon();
	icon.image = "img/" + orbName + "Marker.gif";
	icon.iconSize = new GSize(orb.width, orb.height)
	icon.iconAnchor = new GPoint(orb.width / 2, orb.height);
	icon.infoWindowAnchor = new GPoint(orb.width / 2, 0);
	icon.dragCrossSize = new GSize(0, 0);
	var marker = new GMarker(new GLatLng(orb.lat, orb.lng), {icon: icon, draggable: true, title: orb.tooltip});
	GEvent.addListener(marker, "click", function() { marker.openInfoWindowTabs(orb.tabs); });
	return marker;
}

function showEvent(eventNum) {
	var event = events[eventNum];
	event.marker.openInfoWindow(event.content);
}
function showEventList() {
	var orb = orbs["festival"]
	orb.marker.openInfoWindowTabs(orb.tabs, {selectedTab: 1});
}
function showContactTab() {
	var orb = orbs["artcity"]
	orb.marker.openInfoWindowTabs(orb.tabs, {selectedTab: 3});
}

function boundsChanged() {
	// Get the new map bounds, inset some
	var mapSize = map.getSize();
	var southWest = map.fromContainerPixelToLatLng(new GPoint(150, mapSize.height - 50));
	var northEast = map.fromContainerPixelToLatLng(new GPoint(mapSize.width - 50, 175));
	var bounds = new GLatLngBounds(southWest, northEast);
	// Make sure each orb marker is in view, otherwise put it in view
	for (orbName in orbs) {
		var orb = orbs[orbName];
		var point = orb.marker.getPoint();
		if (!bounds.contains(point)) {
			if (point.lat() > northEast.lat()) point = new GLatLng(northEast.lat(), point.lng());
			if (point.lat() < southWest.lat()) point = new GLatLng(southWest.lat(), point.lng());
			if (point.lng() < southWest.lng()) point = new GLatLng(point.lat(), southWest.lng());
			if (point.lng() > northEast.lng()) point = new GLatLng(point.lat(), northEast.lng());
			moveMarker(orb.marker, point, 1, 20, 30);
		}
	};
}

// Animate a marker from one point to another
function moveMarker(marker, toPoint, step, numSteps, interval) {
	if (step < numSteps) {
		atPoint = marker.getPoint();
		marker.setPoint(new GLatLng(atPoint.lat() + ((toPoint.lat() - atPoint.lat()) / 2), 
				atPoint.lng() + ((toPoint.lng() - atPoint.lng()) / 2)));
		setTimeout(function() { 
			moveMarker(marker, toPoint, step + 1, numSteps, interval); 
		}, interval);
	}
	else {
		marker.setPoint(toPoint);
	}
}
