var map = null;
var icons = [];
var regions = [];

var points = {
  color: { // Marker: icon color
    'Creepmeter': 'red',
    'Dilatometer': 'orange',
    'Magnetometer': 'yellow',
    'Tiltmeter': 'green',
    'GTSM Tensor Strainmeter': 'blue',
    'DTM Tensor Strainmeter': 'purple',
    'Long Baseline Tiltmeter' : 'magenta',
    'Pore Pressure' : 'turquoise',
    'Multiple Instruments' : 'black'
  }
};

// Array of regions with corresponding map parameters for pre-defined zoom options
regions['SF'] = new createRegion("San Francisco", 37.9, -122, 9);
regions['SJ'] = new createRegion("San Juan Bautista", 36.8, -121.4, 10);
regions['PK'] = new createRegion("Parkfield", 35.9, -120.4, 10);
regions['LV'] = new createRegion("Long Valley", 37.65, -118.90, 11);
regions['SC'] = new createRegion("Southern California", 34.2, -117.9, 8);
regions['all'] = new createRegion("All Regions", 36.2000, -119.75, 7);

//window.onunload = GUnload; // Clean up potential browser memory leaks

function loadMap(region) { //region passed by HTML page
  if (GBrowserIsCompatible()) {
  
    var SiteArray = [];

    //initialize map; add controls and tools
    var map_type = G_PHYSICAL_MAP;        
    map = new GMap2(document.getElementById("map"));

    map.setCenter(new GLatLng(regions[region].lat, regions[region].lon), regions[region].zoom, map_type);
    map.addMapType(G_PHYSICAL_MAP);
    //map.addMapType(G_SATELLITE_3D_MAP);
    var controls = new GHierarchicalMapTypeControl();
    map.addControl(controls);
    map.addControl(new GLargeMapControl());
    map.addControl(new GScaleControl());
    //map.addControl(new GOverviewMapControl());
    
    //restrict min/max zoom levels
    var mt = map.getMapTypes();
    for (var i=0; i<mt.length; i++) {
      mt[i].getMinimumResolution = function() {return regions[region].zoom;}
      mt[i].getMaximumResolution = function() {return 13;}
    }  
  
    GDownloadUrl("maps/getPoints.php?region=" + region, function(data) {
      var xml = GXml.parse(data);
      var markers = xml.documentElement.getElementsByTagName("marker");
      var num_markers = markers.length;
      
      for (var i = 0; i < num_markers; i++) {
        SiteArray[i] = true;
      }
    
      for (var i = 0; i < num_markers; i++) { // Loop thru each marker
        if(SiteArray[i]) { // Site not already "crossed off" list to be handled
          var instruments_html = "";
          var instrument_type = "";
          var instrument_type_display = "";
          var num_instruments = 0;
          var lat1 = markers[i].getAttribute("lat");
          var lon1 = markers[i].getAttribute("lon");

          for (var j = 0; j < num_markers; j++) { // For each marker, loop thru list again to look for matching lat / lon values (includes first match plus multiples)
            if(SiteArray[j]) { // Site not already "crossed off" list to be handled
              var img_html = "";
              var lat2 = markers[j].getAttribute("lat");
              var lon2 = markers[j].getAttribute("lon");

              if (lat1 == lat2 && lon1 == lon2) {
                num_instruments ++;
                instrument_type_prev = instrument_type;
                SiteArray[j] = false; // "cross off" already handled site

                var title = markers[j].getAttribute("site_name");
                instrument_type = markers[j].getAttribute("instrument_type");
                var plotfile_list = markers[j].getAttribute("plotfiles");
                var plotfiles = plotfile_list.split(',');
                for (k = 0; k < plotfiles.length; k ++) {
                  if (plotfiles[k]) { // skip records with no plotfiles
                    img_html += '<img src="lfplots/7day/' + plotfiles[k] + '" title="' + instrument_type + '" width="311" height="138" /><br />';                  
                  }
                }
                var point = new GLatLng(lat1,lon1);
                
                instruments_html += img_html;
                instrument_type_now = instrument_type;
                if (instrument_type_prev == instrument_type_now) {
                  instrument_type_display = instrument_type_now;
                }
                else {
                  if (num_instruments > 1) {
                    instrument_type_display += ", ";
                  }
                  instrument_type_display += instrument_type_now;
                }
              }
            }
          } // end of second loop thru list
          
          if (instruments_html == "") {
            instruments_html = "<p>No plots available.</p>"
          }
          if (num_instruments > 1) {
            instrument_type_icon = 'Multiple Instruments';
          } else {
            instrument_type_icon = instrument_type;
          }

          titletip = title + " (" + instrument_type_display + ")";
          subtitle = instrument_type_display;
          var html_snippet = "<div class=\"bubble\"><h1>" + title + "</h1><h2>" + subtitle + "</h2>";
              html_snippet += instruments_html + "</div>";

          var icon = getIcon(instrument_type_icon);
          var mark = createMarker(point, titletip, html_snippet, icon);
          map.addOverlay(mark);
        }
      }
    });
    loadFaults();
	}
}
	
function createMarker(point, title_tip, html_snippet, icon) { // Sets marker attributes and adds click / mouse event handlers
	var marker = new GMarker(point, {icon:icon, draggable:false, title:title_tip});
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml (html_snippet);
	});
	return marker;
}

function getIcon(type) {
  var icon_size = 24;
  if (!type) { //set unknown type to grey
    ref = "grey";
  }
  var ref =  points.color[type];
  if (!icons[ref]) {
    var center_pt = parseInt(icon_size/2);
    var icon = new GIcon();
    icon.image = 'images/' + ref + '.png';
	  icon.shadow = 'images/shadow-sah.png';
	  icon.shadowSize = new GSize(32, 24);
    icon.iconSize = new GSize(icon_size, icon_size);
    icon.iconAnchor = new GPoint(center_pt, center_pt);
    icon.infoWindowAnchor = new GPoint(center_pt, center_pt);
    icons[ref] = icon;
  }
  return icons[ref];
}

function createRegion(name, lat, lon, zoom) { // Populates regional map parameters object
  this.name = name;
  this.lat = lat;
  this.lon = lon;
  this.zoom = zoom;
}