// Just add names to build larger list
var aPeople = [
	{name: 'Jim & Joyce Dods',
	address: 'Renfrew,ON'},
	{name: 'Fred & Rosalie Williams',
	address: 'Renfrew,ON'},
	{name: 'Dan & Chris Hayhoe',
	address: 'Cambridge,ON'},
	{name: 'Clifford & Teri Smith',
	address: 'Reynosa,Mexico'},
	{name: 'Paul & Joann Pascoe',
	address: 'Mzuzu,Malawi'},
	{name: 'Ray & Joyce MacCrimmon',
	address: 'Manila,Philippines'},
	{name: 'Rob & Marg Pilkington',
	address: 'Hong Kong'},
	{name: 'Jim & Jan Kilcup',
	address: 'Tacoma,WA'},
	{name: 'Steven & Grace Maxtead',
	address: 'Tacoma,WA'},
	{name: 'Berwick & Helen Hyland',
	address: 'Smiths Falls,ON'},
	{name: 'Peter & Kathy Baker',
	address: 'Durham,ON'}
];

var cm_int;
var cm_map;
var cm_geocoder;
var cm_mapMarkers = [];
var cm_mapHTMLS = [];

// Create a base icon for all of our markers that specifies the
// shadow, icon dimensions, etc.
var cm_baseIcon = new GIcon();
cm_baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
cm_baseIcon.iconSize = new GSize(20, 34);
cm_baseIcon.shadowSize = new GSize(37, 34);
cm_baseIcon.iconAnchor = new GPoint(9, 34);
cm_baseIcon.infoWindowAnchor = new GPoint(9, 2);
cm_baseIcon.infoShadowAnchor = new GPoint(18, 25);

/**
 * Loads map and calls function to load in worksheet data.
 */
function cm_load() {  

  if (GBrowserIsCompatible()) {
    // create the map
    cm_map = new GMap2(document.getElementById("cm_map"));
    cm_map.addControl(new GLargeMapControl());
    cm_map.addControl(new GMapTypeControl());
    cm_map.setCenter(new GLatLng( 43.907787,-79.359741), 3);
    cm_geocoder = new GClientGeocoder();
    cm_loadData();
  } else {
    alert("Sorry, the Google Maps API is not compatible with this browser");
  } 
}

/**
 * Function called when marker on the map is clicked.
 * Opens an info window (bubble) above the marker.
 * @param {Number} markerNum Number of marker in global array
 */
function cm_markerClicked(markerNum) {
  cm_mapMarkers[markerNum].openInfoWindowHtml(cm_mapHTMLS[markerNum]);
}

/** 
 * Called when JSON is loaded. Creates sidebar if param_sideBar is true.
 * Sorts rows if param_rankColumn is valid column. Iterates through worksheet rows, 
 * creating marker and sidebar entries for each row.
 * @param {JSON} json Worksheet feed
 */       
function cm_loadData() {

  // Start adding people
  if (aPeople.length > 0) {
  	cm_int = 0;
	  cm_geocoder.getLocations(aPeople[cm_int].address, addToMap);
	}
}

// addAddressToMap() is called when the geocoder returns an
// answer.  It adds a marker to the map with an open info window
// showing the nicely formatted version of the address and the country code.
function addToMap(response) {
  if (!response || response.Status.code != 200) {
    alert("Sorry, we were unable to geocode that address");
  } else {
    place = response.Placemark[0];
    point = new GLatLng(place.Point.coordinates[1],
                        place.Point.coordinates[0]);
    var html = "<div style='font-size:12px'><strong>" + aPeople[cm_int].name + "</strong><br/>" + aPeople[cm_int].address + "</div>";

                        
    // create the marker
    var rank = cm_int+1;
    var marker = cm_createMarker(point,aPeople[cm_int].name,html,rank);
    cm_map.addOverlay(marker);
    cm_mapMarkers.push(marker);
    cm_mapHTMLS.push(html);
  
    var markerA = document.createElement("a");
    markerA.setAttribute("href","javascript:cm_markerClicked('" + cm_int +"')");
    markerA.style.color = "#000000";
    var legendText= "";
    legendText += rank + ") ";
    legendText += aPeople[cm_int].name;
    markerA.appendChild(document.createTextNode(legendText));
    
    var sidebarDIV = document.getElementById("cm_legend");
    sidebarDIV.appendChild(markerA);
    sidebarDIV.appendChild(document.createElement("br"));
    sidebarDIV.appendChild(document.createElement("br"));
  }
  cm_int += 1;
  if (cm_int < aPeople.length) {
	  cm_geocoder.getLocations(aPeople[cm_int].address, addToMap);
	}
}

/**
 * Creates marker with ranked Icon or blank icon,
 * depending if rank is defined. Assigns onclick function.
 * @param {GLatLng} point Point to create marker at
 * @param {String} title Tooltip title to display for marker
 * @param {String} html HTML to display in InfoWindow
 * @param {Number} rank Number rank of marker, used in creating icon
 * @return {GMarker} Marker created
 */
function cm_createMarker(point, title, html, rank) {
  var markerOpts = {};
  var nIcon = new GIcon(cm_baseIcon);

  if(rank > 0 && rank < 100) {
    nIcon.imageOut = "http://gmaps-samples.googlecode.com/svn/trunk/" +
        "markers/blue/marker" + rank + ".png";
    nIcon.imageOver = "http://gmaps-samples.googlecode.com/svn/trunk/" +
        "markers/green/marker" + rank + ".png";
    nIcon.image = nIcon.imageOut; 
  } else { 
    nIcon.imageOut = "http://gmaps-samples.googlecode.com/svn/trunk/" +
        "markers/blue/blank.png";
    nIcon.imageOver = "http://gmaps-samples.googlecode.com/svn/trunk/" +
        "markers/green/blank.png";
    nIcon.image = nIcon.imageOut;
  }

  markerOpts.icon = nIcon;
  markerOpts.title = title;		 
  var marker = new GMarker(point, markerOpts);
	
  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(html);
  });
  GEvent.addListener(marker, "mouseover", function() {
    marker.setImage(marker.getIcon().imageOver);
  });
  GEvent.addListener(marker, "mouseout", function() {
    marker.setImage(marker.getIcon().imageOut);
  });
  GEvent.addListener(marker, "infowindowopen", function() {
    marker.setImage(marker.getIcon().imageOver);
  });
  GEvent.addListener(marker, "infowindowclose", function() {
    marker.setImage(marker.getIcon().imageOut);
  });
  return marker;
}

cm_load();