// Javascript code supporting the CoRIS map

      // display message at beginning of task
      function taskStart(msg) {
	var counterSelected = document.getElementById("recordsTotalButton");
	counterSelected.style.color = '#ff0000';
	counterSelected.value = msg;
      }

      // display message at end of task
      function taskEnd(msg) {
	var counterSelected = document.getElementById("recordsTotalButton");
	counterSelected.style.color = '#000000';
	counterSelected.value = msg;
      }

      // display count of matching records
      function displayCount() {
	var msg = ''
	if (recordCounter == 0)	 {
	  msg = "No records to be displayed";
	} else if (recordCounter == 1) {
	  msg = recordCounter + " record to be displayed";
	} else {
	  msg = recordCounter + " records to be displayed";
	}
	taskEnd(msg);
      }

      // function to handle loading of CoRIS metadata records
      function loadCoRISRecords() {
	cmarkers = [];
	taskStart('Loading data ... please stand by');
	//	GLog.write("loading marker.xml");
        GDownloadUrl("xmls/marker.xml", function(data, code) {
	  if (data == null || code != 200) {
	    alert("Error loading CoRIS metadata.  Please reload the page.");
	    return;
	  }
	  var xmlDoc = GXml.parse(data);
	  var markers = [];
	  try {
	    markers = xmlDoc.documentElement.getElementsByTagName("x");
//	    GLog.write(markers.length + ' markers');
	  } catch(e) {
//	    GLog.write('catch ' + e.name + ' ' + e.message);
	  }
	    for (var j=0; j<markers.length; j++) {
	    // obtain attributes for each marker
	      var begDate = markers[j].getAttribute("p");
	      var endDate = markers[j].getAttribute("q");
	      var top = markers[j].getAttribute("n");
	      var urlat = parseFloat(top);
	      var bottom = markers[j].getAttribute("s");
	      var lllat = parseFloat(bottom);
	      var left = markers[j].getAttribute("w");
	      var lllon = parseFloat(left);
	      var right = markers[j].getAttribute("e");
	      var urlon = parseFloat(right);
	      var title = markers[j].getAttribute("t");
	      var coris_keyword = markers[j].getAttribute("k");
	      var coris_tracking_id = markers[j].getAttribute("i");
	      var browseURL = markers[j].getAttribute("b");
	      var metadataURL = markers[j].getAttribute("m");

	      var arrayOfKeyword = coris_keyword.split(" > ");
	      topic = arrayOfKeyword[0];
	      theme = arrayOfKeyword[1];
	      var summary_html = '<div class="infoWindowTab"><b><div class="titleFrame">'+title+'</div></b><br /><b>Time Frame</b><table class="smallText1" colspan="2"><tr><td>Start: '+begDate+'&nbsp;&nbsp;&nbsp;&nbsp;</td><td>End: '+endDate+'</td></tr></table><br /><b>Bounding Coordinates</b>'
	      if ((lllon != urlon) || (lllat != urlat))	 {
		summary_html += '&nbsp;&nbsp;&nbsp;&nbsp;<u><a href="javascript:displayOnMap()">Display on Map</u></a>';
	      }
	      summary_html += '<table class="smallText1" colspan="2"><tr><td>North: '+top+'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td>East: '+right+'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td></tr><tr><td>South: '+bottom+'</td><td>West: '+left+'</td></tr></table><br /><b>CoRIS Details</b><br />&nbsp;Topic: '+topic+'<br />&nbsp;Theme: '+theme+'<br />&nbsp;Tracking ID: '+coris_tracking_id+'<br /><br /><b>Additional Links</b><br />';
	      summary_html += '<table class="smallText1" colspan="2">';
	      var column = 1;
	      summary_html += '<tr>';
	      if (metadataURL.length != 0) {
		summary_html += '<td>&nbsp;&nbsp;<u><a href='+metadataURL+' target="_blank">Metadata (FGDC)</a></u></td>';
		column = 2;
	      }
	      if (browseURL.length != 0) {
		summary_html += '<td>&nbsp;&nbsp;<u><a href="'+browseURL+'" target="_blank">Graphic Image</a></u></td>';
		if (column == 1) {
		  column = 2;
		} else {
		  summary_html += '</tr>';
		  column = 1;
		}
	      }
	      for (var idx=0; true; ++idx) {
		var fattrname= "f" + idx;
		var formname = markers[j].getAttribute(fattrname);
		if (!formname)	break;
		var nattrname = "u" + idx;
		var str = markers[j].getAttribute(nattrname);
		if (!str) break;
		summary_html += '<td>&nbsp;&nbsp;<u><a href="'+str+'" target="_blank">Data</a></u> (' +formname+ ')</td>';
		if (column == 1) {
		  column = 2;
		} else {
		  summary_html += '</tr>';
		  column = 1;
		}
	      }
	      summary_html += '</table>';
	      summary_html += '</div>';

	      var bounds = new GLatLngBounds(new GLatLng(lllat, lllon), new GLatLng(urlat, urlon));
	      var ptCenter = bounds.getCenter();
	      var lat = ptCenter.lat();
	      var lon = ptCenter.lng();
	      var point = new GLatLng(lat,lon);

	      var zoomLevel = 0;
	      if ((lllon != urlon) || (lllat != urlat))	 {
		var box = new GLatLngBounds(new GLatLng(lllat, lllon), new GLatLng(urlat, urlon));
		var bPolygon = [];
		if (urlon == 180.0)  urlon = 179.9999;
		var bLine = [];
		if (lllon <= urlon) {
		  bLine.push(new GLatLng(lllat,lllon));
		  bLine.push(new GLatLng(urlat,lllon));
		  bLine.push(new GLatLng(urlat,urlon));
		  bLine.push(new GLatLng(lllat,urlon));
		  bLine.push(new GLatLng(lllat,lllon));
		}
		else {
		  bLine.push(new GLatLng(lllat,lllon));
		  bLine.push(new GLatLng(urlat,lllon));
		  bLine.push(new GLatLng(urlat,180.0));
		  bLine.push(new GLatLng(lllat,180.0));
		  bLine.push(new GLatLng(lllat,lllon));
		  bPolygon.push(new GPolygon(bLine,'#ff0000',1,1.0,'#ff0000',0.2,{clickable:false}));
		  bLine = [];
		  bLine.push(new GLatLng(lllat,-180.0));
		  bLine.push(new GLatLng(urlat,-180.0));
		  bLine.push(new GLatLng(urlat,urlon));
		  bLine.push(new GLatLng(lllat,urlon));
		  bLine.push(new GLatLng(lllat,-180.0));
		  zoomLevel = 1;
		}
		bPolygon.push(new GPolygon(bLine,'#ff0000',1,1.0,'#ff0000',0.2,{clickable:false}));
	      }
	      else {
		var box;
		var bLine = [];
		var bPolygon = [];
	      }
	      // create marker
	      var marker = createMarker(point,title,summary_html,topic,theme,box,bPolygon);
	    }
//    	    GLog.write("loaded");
	    loadMessage();
	});

	// reload the CoRIS metadata records every hour in case of updates
	setTimeout("loadCoRISRecords()", 3600000);
      }

      // function to handle loading of reefbase locations
      function loadReefbase() {
	var currentZoomLevel = mapCoRIS.getZoom();
        GDownloadUrl("xmls/reefbase.xml", function(data, code) {
	  if (data == null || code != 200) {
	    alert("Error loading reef information.  Please reload the page.");
	    return;
	  }
	  var xmlDoc = GXml.parse(data);
	    arrayOfReefs = [];
	    // obtain array of markers and loop through it
	    var markers = [];
	    try {
	      markers = xmlDoc.documentElement.getElementsByTagName("marker");
	    } catch(e) {
	    }
	    for (var j=0; j<markers.length; j++) {
	    // obtain attributes for each marker
	      var lat = parseFloat(markers[j].getAttribute("lat"));
	      var lon = parseFloat(markers[j].getAttribute("lon"));
	      var point = new GLatLng(lat,lon);
	      var id_code = markers[j].getAttribute("idcode");
	      var reef_name = markers[j].getAttribute("reefname");
	      var reef_system = markers[j].getAttribute("reefsystem");
	      var reef_type = markers[j].getAttribute("reeftype");
	      var country = markers[j].getAttribute("country");
	      var locality = markers[j].getAttribute("locality");
	      var island_system = markers[j].getAttribute("islandsyst");
	      var summary_html = '<div class="infoWindow"><b>'+reef_name+' - '+id_code+'</b><br /><b>Reef System:</b> '+reef_system+'<br /><b>Reef Type:</b> '+reef_type+'<br /><b>Country:</b> '+country+'<br /><b>Locality:</b> '+locality+'<br /><b>Island System:</b> '+island_system+'</div>';
	      // create marker
	      var marker = createReefMarker(point,reef_name,summary_html);
	      arrayOfReefs.push(marker);
	    }
	    if (currentZoomLevel >= 5) {
	      reefCluster.addMarkers(arrayOfReefs);
	      reefCluster.refresh();
	    }
	    else {
	      alert("		Your current zoom level is " + currentZoomLevel + "\nYou must be at zoom level 5 or higher to see the coral reef locations");
	    }
	    loadMessage();
	});
      }

      // A function to create the marker and set up the event window
      function createMarker(point,name,html,topic,theme,bounds,pLine) {
	// create icon symbol
	var icon = new GIcon();
	icon.image = "xmark_spot.png";
	icon.iconSize = new GSize(12, 12);
	icon.iconAnchor = new GPoint(10, 10);
	icon.infoWindowAnchor = new GPoint(5, 1);

	found:
	for (var ii = 0; ii < Topics.length; ++ii) {
	  if (topic.indexOf(Topics[ii][0]) != -1) {
	    for (var ij = 1; ij < Topics[ii].length; ++ij) {
	      if (theme.indexOf(Topics[ii][ij][0]) != -1) {
		icon.image = 'images/' + Topics[ii][ij][2];
		break found;
	      }
	    }
      //      GLog.write("theme " + theme + " topic " + topic + " not found");
	  }
	}

	var marker = new GMarker(point,{icon:icon,title:name});
	marker.type = topic;
	marker.theme = theme;
	marker.titleText = name.toUpperCase();

	GEvent.addListener(marker, "click", function() {
	  marker.openInfoWindow(html);
	  if (displayShown) {
	    for (var j=0;j<displayBox.length;++j) {
	      mapCoRIS.removeOverlay(displayBox[j]);
	    }
	  }
	  displayBox = null;
	  displayBounds = null;
	  displayShown = false;
	  if (!bounds.isEmpty()) {
	    displayBox = pLine;
	    displayBounds = bounds;
	  }
	});
	cmarkers.push(marker);
	return marker;
      }

      // A function to create the reef markers and set up the event window
      function createReefMarker(point,name,html) {
      // create icon symbol
	var icon = new GIcon();
	icon.image = "images/reefs.png";
	icon.iconSize = new GSize(20, 20);
	icon.iconAnchor = new GPoint(10, 10);
	icon.infoWindowAnchor = new GPoint(10, 10);
	var marker = new GMarker(point,{icon:icon,title:name});
	GEvent.addListener(marker, "click", function() {
	  marker.openInfoWindow(html);
	});
	rmarkers.push(marker);
	return marker;
      }

      // This function calculates the total number of records returned from a search
      // the search can either be generated from a dropdown list or from a text entered in search box
      function calcRecordCount(form) {
	var dataTheme = document.getElementById("dataThemeInfo");
	dataTheme.setAttribute('class','buttonDisable');
	dataTheme.setAttribute('className','buttonDisable');
	recordCounter = 0;
	if (textSearch)	 {
	  var textSearchID = document.getElementById("searchTextEntry");
	  var textSearchValue = textSearchID.value.toUpperCase();
	  if (textSearchValue.length == 0) {
	    alert("You haven't entered any text\nPlease Try Again");
	  }
	  else {
	    for (var j=0;j<cmarkers.length;j++)	 {
	      var titleValue = cmarkers[j].titleText;
	      if (titleValue.indexOf(textSearchValue) != -1)
	        recordCounter++;
	    }
	  }
	} else {
	  var numberOfThemes = 0;
	  for (var k=0;k<form.theme.length;k++)	 {
	    if (form.theme.options[k].selected)	 {
	      numberOfThemes++;
	      var themeSelected = new Array();
	      themeSelected = form.theme.options[k].value.split(',');
	      topicMarker = themeSelected[0];
	      themeMarker = themeSelected[1];
	      for (var j=0;j<cmarkers.length;j++) {
		if ((cmarkers[j].type==topicMarker) && (cmarkers[j].theme==themeMarker))
		  recordCounter++;
	      }
	    }
	  }
	}
	var dataTheme = document.getElementById("dataThemeInfo");
	if (numberOfThemes == 1) {
	  dataTheme.setAttribute('class','button');
	  dataTheme.setAttribute('className','button');
	}
	else {
	  dataTheme.setAttribute('class','buttonDisable');
	  dataTheme.setAttribute('className','buttonDisable');
	}
	displayCount();
      }

      // Display the Legend
      // optionally displays Reef info
      function updateLegend() {
	var messageHTML = '';
	var reefsChecked = document.getElementById("reefs");
	if (reefsChecked.checked) {
	  messageHTML = '<div class="smallText1">';
	  messageHTML += '<img src="images/reef_cluster.png" height="20" width="20">&nbsp;Cluster of reefs - Click on symbol to zoom closer and see individual reefs<br />';
	  messageHTML += '<img src="images/reefs.png" height="20" width="20">&nbsp;Individual Reef';
	  messageHTML += '</div>';
	  messageHTML += '<div class="smallText1">NOTE: Reefs can only be displayed if the zoom level of the map is 5 or greater.</div></div>';
	}

	document.getElementById("legend").innerHTML = messageHTML + legendHTML;
      }

      // This function displays the points returned from a Search.
      // The search can either be generated from a dropdown list or from
      // text entered in search box.
      // If points are close together, results use clustering routine
      // in ClusterMarker.js
      function displayThemes() {

	// first clear any currently displayed information
	mapCoRIS.clearOverlays();
	recordCounter = 0;
	mapCoRIS.getInfoWindow().hide();
	document.getElementById("sidebar").innerHTML = '';
	taskStart('Loading records ... please stand by');

	// set up array that will be used by cluster
	cluster.removeMarkers();
	arrayOfMarkers = [];

	// calculate list of visible data types
	var topickey = new Array();
	for (var ii = 0; ii < Topics.length; ++ii) {
	  topickey[ii] = new Array();
	  for (var ij = 0; ij < Topics[ii].length; ++ij) {
	    topickey[ii][ij] = 0;
	  }
	}

	if (ulcorner && lrcorner) { // bounding box specified

	  var lllon = ulcorner.x;
	  var urlon = lrcorner.x;
	  var lllat = lrcorner.y;
	  var urlat = ulcorner.y;

	  for (var j=0;j<cmarkers.length;j++) {
	    var position = cmarkers[j].getLatLng();
	    var marker_lat = position.lat();
	    var marker_lng = position.lng();
	    if ((marker_lat >= lllat) &&
	        (marker_lat <= urlat) &&
		(marker_lng >= lllon) &&
		(marker_lng <= urlon)) {

	      arrayOfMarkers.push(cmarkers[j]);
	      recordCounter++;
	    }
	  }
	} else if (textSearch) { // text search
	  var textSearchID = document.getElementById("searchTextEntry");
	  var textSearchValue = textSearchID.value.toUpperCase();

	  for (var j=0;j<cmarkers.length;j++) {
	    var titleValue = cmarkers[j].titleText;
	    if (titleValue.indexOf(textSearchValue) != -1) {

	      arrayOfMarkers.push(cmarkers[j]);
	      recordCounter++;
	    }
	  }
	} else { // display selected topic(s) and theme(s)
	  var themes = document.getElementById("theme");

	  for (var ik = 0; ik < themes.length; ik++) {
	    if (themes.options[ik].selected) {
	      var themeSelected = new Array();
	      themeSelected = themes.options[ik].value.split(',');
	      topicMarker = themeSelected[0];
	      themeMarker = themeSelected[1];
	      for (var j=0;j<cmarkers.length;j++) {
		if ((cmarkers[j].type == topicMarker) &&
		    (cmarkers[j].theme == themeMarker)) {
			arrayOfMarkers.push(cmarkers[j]);
			recordCounter++;
		 }
	      }
	    }
	  }
	}

	cluster.addMarkers(arrayOfMarkers);
	cluster.refresh(false);

	// calculate visible theme(s) from list
	for (var im = 0; im < arrayOfMarkers.length; ++im) {
	  // cmarkers[j].type=="Geographic Information"
	  // cmarkers[j].theme=="Backscatter"
	isvis:
	  for (var ii = 0; ii < Topics.length; ++ii) {
	    if (Topics[ii][0] == arrayOfMarkers[im].type) {
	      for (var ij = 1; ij < Topics[ii].length; ++ij) {
		if (Topics[ii][ij][0] == arrayOfMarkers[im].theme) {
//		  if (topickey[ii][ij] == 0) {
//		    GLog.write("found " + arrayOfMarkers[im].type + " > " +
//			arrayOfMarkers[im].theme);
//		  }
		  topickey[ii][ij] = 1;
		  break isvis;
	        }
	      }
	      break isvis;
	    }
	  }
	}

	displayCount();

	if (recordCounter == 0)	 {
//	  dataThemeDefinition();
	  mapCoRIS.returnToSavedPosition();
	} else {
	  document.getElementById("topRightHdg").innerHTML =
		'<div class="headerFrame">Legend</div>';

	  legendHTML = '<div class="smallText1"><img src="images/cluster.png" height="20" width="20">&nbsp;Cluster of records - Click on symbol to zoom closer and see individual records</div>';
	  legendHTML += '<table class="smallText1" colspan="2">';

	  for (var ii = 0; ii < Topics.length; ++ii) {
	    for (var ij = 1; ij < Topics[ii].length; ++ij) {
	      if (topickey[ii][ij] == 1) {
		legendHTML += '<tr><td><img src="images/' +
		  Topics[ii][ij][2] +
		  '" height="12" width="12"></td><td>' +
		  Topics[ii][ij][1] +
		  '</td></tr>';
	      }
	    }
	  }

	  legendHTML += '</table>';

	  updateLegend();
	}
      }

      // creates sidebar used for clustered markers
      function handleClusterClick(args)	 {
	var clusterZoomLevel = mapCoRIS.getBoundsZoomLevel(args.clusterMarker.clusterGroupBounds)
	if (clusterZoomLevel > 14) {
	  var clusteredRecordsHTML = '';
	  clusteredRecordsHTML = '<div class="headerFrame">Total number of records at/near same location: '+args.clusteredMarkers.length+'</div>';
	  var recNo = 0;
	  for (var k=0;k<args.clusteredMarkers.length;k++) {
	    recNo = k + 1;
	    clusteredRecordsHTML += '<div class="button1"><a href="javascript:cluster.triggerClick('+args.clusteredMarkers[k].index+')">'+recNo+') '+args.clusteredMarkers[k].getTitle()+'</a></div>';
	  }
	  document.getElementById("sidebar").innerHTML = clusteredRecordsHTML;
	}
	else {
	  mapCoRIS.setCenter(args.clusterMarker.getLatLng(), mapCoRIS.getBoundsZoomLevel(args.clusterMarker.clusterGroupBounds));
	  document.getElementById("sidebar").innerHTML = '';
	}
      }

      // function to handle click on a cluster
      function clusterClick(j) {
	cluster.triggerClick(j);
      }

      // creates sidebar used for clustered reef markers
      function handleReefClusterClick(args) {
	var clusterZoomLevel = mapCoRIS.getBoundsZoomLevel(args.clusterMarker.clusterGroupBounds)
	if (clusterZoomLevel > 14) {
	  var clusteredRecordsHTML = '';
	  clusteredRecordsHTML = '<div class="headerFrame">Total number of reefs at/near same location: '+args.clusteredMarkers.length+'</div>';
	  var recNo = 0;
	  for (var k=0;k<args.clusteredMarkers.length;k++) {
	    recNo = k + 1;
	    clusteredRecordsHTML += '<div class="button1"><a href="javascript:reefCluster.triggerClick('+args.clusteredMarkers[k].index+')">'+recNo+') '+args.clusteredMarkers[k].getTitle()+'</a></div>';
	  }
	  document.getElementById("sidebar").innerHTML = clusteredRecordsHTML;
	}
	else {
	  mapCoRIS.setCenter(args.clusterMarker.getLatLng(), mapCoRIS.getBoundsZoomLevel(args.clusterMarker.clusterGroupBounds));
	  document.getElementById("sidebar").innerHTML = '';
	}
      }

      // sets up status bar
      function updateStatusBar() {
	 var bounds = mapCoRIS.getBounds();
	 var SW = bounds.getSouthWest();
	 var NE = bounds.getNorthEast();
	 var oCoords = document.getElementById("coords");
	 var str = '<b>SW:</b> ' + SW.y.toFixed(6) + ', ' + SW.x.toFixed(6);
	 str += '<br /><b>NE:</b> ' + NE.y.toFixed(6) + ', ' + NE.x.toFixed(6);
	 oCoords.innerHTML = str;
      }

      // populates status bar with values
      function mouseMove(mousePt) {
	 mouseLatLng = mousePt;
	 var zoom = mapCoRIS.getZoom();
	 var oStatusDiv = document.getElementById("mouseTrack");
	 var mousePx = normalProj.fromLatLngToPixel(mousePt, zoom);
	 var str = '<b>Mouse LatLng:</b> ' + mousePt.y.toFixed(6) + ', ' + mousePt.x.toFixed(6);
	 str += '<br /><b>Zoom Level:</b> ' + zoom;
	 oStatusDiv.innerHTML = str;
      }

      // function to clear and reset map
      function clearMap() {
	cluster.removeMarkers();
	arrayOfMarkers = [];
	cluster.refresh();
	textSearch = false;
	mapCoRIS.returnToSavedPosition();
	document.getElementById("sidebar").innerHTML = '';
	document.getElementById("legend").innerHTML = '';
	taskEnd('No records displayed');
	var textID = document.getElementById("searchTextEntry");
	textID.value = "";
	initDynamicOptionLists();
	//dataThemeDefinition();
	ulcorner = null;
	lrcorner = null;
	mapCoRIS.clearOverlays();
	displayBox = null;
	displayBounds = null;
	displayShown = false;
	recordCounter = 0;
	updateLegend();
      }

      // handle movements and send updates to status bar
      function moveEnd() {
	updateStatusBar();
      }

      // handles zoom levels, updates status bar, and checks to see if reefs should be displayed
      function zoomEnd(oldZ,zoom) {
	var center = mapCoRIS.getCenter();
	updateStatusBar();
	var zoomLevel = mapCoRIS.getZoom();
	if (zoomLevel <= 2) {
	  document.getElementById("sidebar").innerHTML = '';
	}
	var reefsChecked = document.getElementById("reefs");
	if (reefsChecked.checked) {
	  if (zoomLevel < 5) {
	    var sidebarID = document.getElementById("sidebar");
	    if (sidebarID.innerHTML.indexOf("reefCluster") != -1) {
	      document.getElementById("sidebar").innerHTML = '';
	    }
	    reefCluster.removeMarkers();
	  }
	  else {
	    reefCluster.removeMarkers();
	    reefCluster.addMarkers(arrayOfReefs);
	    reefCluster.refresh();
	  }
	}
      }

      // handles turning off text searching and empty the text search box with any previous entry
      function turnOffTextSearch() {
	  //	GLog.write("turnOffTextSearch");
	textSearch = false;
	var textID = document.getElementById("searchTextEntry");
	textID.value = "";
	//	GLog.write("turnOffTextSearch done");
      }

      function loadMessage() {
	var messageID = document.getElementById("loadingMessage");
	messageID.innerHTML = '';
	displayCount();
	updateLegend();
      }

      // setup link to specific data definition page
      function dataThemeDefinition() {
	//alert("In the function");
	var themeSelected = document.getElementById("theme");
	var themeValues = new Array();
	themeValues = themeSelected.value.split(',');
	themeInfoPage = themeValues[2];
	//alert(themeInfoPage);
	themeURL = '/data/' + themeInfoPage;
	start(themeURL);
      }

      // handles opening up definition pages of themes
      function start(page) {
	var Win1 = open(page,"ThemeWindow","height=450,width=375,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes");
	Win1.focus();
      }

      // handles adding reefs to map
      function addReefsToMap() {

	var currentZoomLevel = mapCoRIS.getZoom();
	var reefsChecked = document.getElementById("reefs");
	if (reefsChecked.checked) {
	  if (reefsLoaded) {
	    if (currentZoomLevel >= 5) {
	      reefCluster.addMarkers(arrayOfReefs);
	      reefCluster.refresh();
	    } else {
	      alert("		Your current zoom level is " + currentZoomLevel + "\nYou must be at zoom level 5 or higher to see the coral reef locations");
	    }
	  } else {
	    reefsLoaded = true;
	    taskStart('Loading data ... please stand by');
	    // read reef locations
	    loadReefbase();
	  }
	} else {
	  reefCluster.removeMarkers();
	}
	loadMessage();
      }

      // handles help
      function CoRISHelp() {
	helpHTML = 'CoRISHelp.htm';
	var Win1 = open(helpHTML,"HelpWindow","height=250,width=225,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes");
	Win1.focus();
      }

      // handles searching for records within in a map-defined box
      function searchRadius() {
	  //	GLog.write("searchRadius");
	var dataTheme = document.getElementById("dataThemeInfo");
	dataTheme.setAttribute('class','buttonDisable');
	dataTheme.setAttribute('className','buttonDisable');
	var messageID = document.getElementById("loadingMessage");
	var messageHTML = '<div align="center">';
	messageHTML += '<div class="smallText">';
	messageHTML += 'To define a search box on the map, first click the upper left corner, followed by the lower right corner';
	messageHTML += '</div></div>';
	messageID.innerHTML = messageHTML;
	//	GLog.write("searchRadius adding listener");
	var searchExtentListener = GEvent.addListener(mapCoRIS, 'click', function(marker,point) {
	    //	  GLog.write("searchRadius listener got a point there");
	  if (!ulcorner) {
	    ulcorner = point;
	    searchCornerMarker = createSearchCorner(point);
	    mapCoRIS.addOverlay(searchCornerMarker);
	  } else if (!lrcorner) {
	    lrcorner = point;
	  }
	  //	  GLog.write("searchRadius listener got both");

	  // fix order of corners if necessary to avoid error message
	  if (ulcorner && lrcorner) {
	    if (ulcorner.y < lrcorner.y) {
	      var tmp = ulcorner.y;
	      ulcorner.y = lrcorner.y;
	      lrcorner.y = tmp;
	    }
	    if (lrcorner.x < ulcorner.x) {
	      var tmp = ulcorner.x;
	      ulcorner.x = lrcorner.x;
	      lrcorner.x = tmp;
	    }
	  }

	  if (ulcorner && lrcorner) {
	    messageID.innerHTML = '';
	    recordCounter = 0;
	    var lllon = ulcorner.x;
	    var urlon = lrcorner.x;
	    var lllat = lrcorner.y;
	    var urlat = ulcorner.y;
	    var searchPolygon = new GPolygon([new GLatLng(lllat,lllon), new GLatLng(lllat,urlon), new GLatLng(urlat,urlon), new GLatLng(urlat,lllon), new GLatLng(lllat,lllon)], "#2a8f03", 2, 1, "#ff0000", 0.0);
	    mapCoRIS.addOverlay(searchPolygon);
	    for (var j=0;j<cmarkers.length;j++) {
	      var position = cmarkers[j].getLatLng();
	      var marker_lat = position.lat();
	      var marker_lng = position.lng();
	      if ((marker_lat >= lllat) &&
		  (marker_lat <= urlat) &&
		  (marker_lng >= lllon) &&
		  (marker_lng <= urlon)) {
		recordCounter++;
	      }
	    }
	    loadMessage();

	    //	    GLog.write("searchRadius listener removed");
	    GEvent.removeListener(searchExtentListener);
	  }
	  });
	//	GLog.write("searchRadius listener added");
      }

      // handles making a marker symbol for upper left corner of search box
      function createSearchCorner(point) {
	var icon = new GIcon();
	icon.image = "images/searchMarker.png";
	icon.iconSize = new GSize(8, 8);
	icon.iconAnchor = new GPoint(5, 5);
	icon.infoWindowAnchor = new GPoint(5, 5);
	var marker = new GMarker(point,{icon:icon});
	return marker;
      }

      // handles setting corners of search box to null
      function turnOffSearchBox() {
	  //	GLog.write("turnOffSearchBox");
	ulcorner = null;
	lrcorner = null;
	//	GLog.write("turnOffSearchBox done");
      }

      // function to handle drawing bounding box of a record
      function displayOnMap() {
	mapCoRIS.getInfoWindow().hide();
	var boundsZoom = mapCoRIS.getBoundsZoomLevel(displayBounds);
	--boundsZoom;
	var boundsCenter = displayBounds.getCenter();
	mapCoRIS.setCenter(boundsCenter, boundsZoom);
	for (var j=0;j<displayBox.length;++j) {
	  mapCoRIS.addOverlay(displayBox[j]);
	}
	displayShown = true;
      }
