function AddMapLayer() {
	var id = (new Date).getTime();
	var baseUrl = document.getElementById('base-url').value;
	var name = document.getElementById('layer-name').value;
    map1.wmsLayers.push(new WmsLayer(baseUrl, baseUrl, id, baseUrl + "?styles=", 500000, 'Added By User', 'Added By User', 0, 10, '-180,-90,180,90', null,null,name,'Custom Layer', null, 4326,'1.1.1','getmap','wms','image/png',100,true));
    map1.appendLayer(id);
    
    
    document.getElementById('base-url').value = '';
    document.getElementById('layer-name').value = '';
    refreshCatalog(true);
}


function SaveMap() {
  var vpbb = map1.getViewportBoundingBox();
  var ucbb = map1.getUnclippedBoundingBox();
  var legendURL = document.getElementById('save_map_legend_url').innerHTML;
  
  var xml = '<map dimX="' + map1.xdim + '" dimY="' + map1.ydim + '" tileSize="' + map1.tileWidth + '">';
  xml += '<responseType>image</responseType>';
  xml += '<fileExtension>PNG</fileExtension>';
  xml += '<attachFile>nawqa_map</attachFile>';
  xml += '<viewportBBox><xmin>' + vpbb.xmin + '</xmin><ymin>' + vpbb.ymin + '</ymin><xmax>' + vpbb.xmax + '</xmax><ymax>' + vpbb.ymax + '</ymax></viewportBBox>';
  xml += '<unclippedBBox><xmin>' + ucbb.xmin + '</xmin><ymin>' + ucbb.ymin + '</ymin><xmax>' + ucbb.xmax + '</xmax><ymax>' + ucbb.ymax + '</ymax></unclippedBBox>';

  if (legendURL != '') {
    xml += '<legend><url>' + legendURL + '</url><position>bottomcenter</position></legend>';
  }
  
  xml += '<watermark><image>http://internal.usgs.gov/visual/visual_id_files/raster/BW/80x22_black.jpg</image><location>bottomleft</location><opacity>0.5</opacity></watermark>';
  
  for (var i = 0; i < map1.layers.length; i++) {
      xml += '<layer zOrder="' + i + '" opacity="' + map1.layers[i].wmsLayer.opacity + '">';
      for (var j = 0; j < map1.layers[i].mapTiles.length; j++) {
          var tile = map1.layers[i].mapTiles[j];
          if (tile.mapTile.src.indexOf('blank.gif') < 0) {
              xml += '<tile x="' + tile.mapTile.style.left.split('px')[0] + '" y="' + tile.mapTile.style.top.split('px')[0] + '">' + tile.mapTile.src.replace(/&/g,"&amp;").replace(/ /g,"%20") + '</tile>';
          }
      }
      xml += '</layer>';
  }
  xml += "</map>";
  
  //document.getElementById('debug_me').innerHTML = xml.replace(/</g,"&lt;");

  var saveMapForm = document.getElementById('save_map_form');
  document.getElementById('xml_req').value = xml;
  saveMapForm.submit();
}


function queryConstituents(query) {
  last_sorted = 0;
  var selector = document.getElementById('constituent-selector');
  selector.innerHTML = '';
  if (query.value && query.value != '') {
    var consts = document.getElementById('param_const');
    var ctr = 0;
    for (var i = 0; i < consts.options.length; i++) {
      if (consts.options[i].innerHTML.toUpperCase().indexOf(query.value.toUpperCase()) == 0 ||
          consts.options[i].value.indexOf(query.value) == 0) {
      
        var opt = consts.options[i].innerHTML.split('(Sampled:');
        var displayname = opt[0];
        var sampled = opt[1].split("%)")[0];


        var d = document.createElement('div');
        d.className='columns-3';
        d.style.margin='0px';
        d.style.borderBottom='solid black 1px';
        d._i = i;
        d.onmousemove = function() { return false; };
        d.onmouseup = function() { document.getElementById('param_const').selectedIndex = this._i; return false; };
        d.onmouseover = function() {this.style.backgroundColor='rgb(184,259,254)'};
        d.onmouseout = function() {this.style.backgroundColor='white'};

        d.innerHTML = '<div class="clearfix const-div"><div class="const-name" style="float: left; width: 58% !important;" title="' + displayname + '">' + displayname.substring(0,32) + '...</div>'+
        '  <div class="const-pcode" style="float: left; width: 15% !important;">' + consts.options[i].value + '</div>'+
        '  <div class="const-sampled" style="float: left; width: 15% !important;">' + sampled + '</div></div>';
      
        selector.appendChild(d);
    
        ctr++;
      }
    }
  }
  sortConstSampled();
}





var last_sorted = 0;

function sortConstName() {
  var constSelector = document.getElementById('constituent-selector');
  var carr = new Array();
  for (var i = 0; i < constSelector.childNodes.length; i++) {
    var cc = constSelector.childNodes[i];
    var ci = constSelector.childNodes[i].innerHTML;
    var cn = firstChildWithClass(cc, 'div', 'const-name').innerHTML.toUpperCase();
    carr.push([cc, cn, ci]);
  }
  if (last_sorted != 0) {
    carr.sort(constSorter);
    last_sorted = 0;
  } else {
    carr.sort(constSorterReverse);
    last_sorted = 1;
  }
  constSelector.innerHTML = '';
  for (var i = 0; i < carr.length; i++) {
    var c = constSelector.appendChild(carr[i][0]);
    c.innerHTML = carr[i][2];
  }
  carr = null;
}

function sortConstPcode() {
  var constSelector = document.getElementById('constituent-selector');
  var carr = new Array();
  for (var i = 0; i < constSelector.childNodes.length; i++) {
    var cc = constSelector.childNodes[i];
    var ci = constSelector.childNodes[i].innerHTML;
    var cn = firstChildWithClass(cc, 'div', 'const-pcode').innerHTML; 
    carr.push([cc, cn, ci]);
  }

  if (last_sorted != 2) {
    carr.sort(constSorter);
    last_sorted = 2;
  } else {
    carr.sort(constSorterReverse);
    last_sorted = 3;
  }
  constSelector.innerHTML = '';
  for (var i = 0; i < carr.length; i++) {
    var c = constSelector.appendChild(carr[i][0]);
    c.innerHTML = carr[i][2];
  }
  carr = null;
}



function sortConstSampled() {
  var constSelector = document.getElementById('constituent-selector');
  var carr = new Array();
  for (var i = 0; i < constSelector.childNodes.length; i++) {
    var cc = constSelector.childNodes[i];
    var ci = constSelector.childNodes[i].innerHTML;
    var cn = firstChildWithClass(cc, 'div', 'const-sampled').innerHTML;
    carr.push([cc, +cn, ci]);
  }

  if (last_sorted != 4) {
    carr.sort(constSorterReverse);
    last_sorted = 4;
  } else {
    carr.sort(constSorter);
    last_sorted = 5;
  }
  constSelector.innerHTML = '';
  for (var i = 0; i < carr.length; i++) {
    var c = constSelector.appendChild(carr[i][0]);
    c.innerHTML = carr[i][2];
  }
  carr = null;
}

function constSorter(t1, t2) {
  if (t1[1] < t2[1]) return -1;
  if (t1[1] > t2[1]) return 1;
  return 0;
}

function constSorterReverse(t1, t2) {
  if (t1[1] < t2[1]) return 1;
  if (t1[1] > t2[1]) return -1;
  return 0;
}


function firstChildWithClass(element, tagName, className) {
  var fullList = element.getElementsByTagName(tagName);
  for (var i=0; i<fullList.length; i++) {
    if (fullList[i].className.indexOf(className) > -1) {
      return fullList[i];
    }
  }
	return null;
}


function resetLists(lists) {
  for (var i = 0; i < lists.length; i++) {
    var l = document.getElementsByName(lists[i]);
    for (var j = 0; j < l.length; j++) {
      l[j].selectedIndex = 0;
    }
  }
}

var fitBBox_ar;
function mapFitAndCreateCallback(pSet) {
  if (fitBBox_ar) fitBBox_ar.abort();
  if ((pSet.getParameterValues('constituent') == 'OFF' && pSet.getParameterValues('submit_name') == 'Water Quality')) {
	  mapCreateCallback(pSet);
  } else {
	  fitBBox_ar = new AjaxRequest();
	  fitBBox_ar.asyncRequest('GET','fitToBBox',pSet.getParameterQueryString(),
	  function() {
	    fitToBBoxAndCreateMap(pSet);
	  });
	  document.body.style.cursor = 'wait';
  }
}

function fitToBBoxAndCreateMap(pSet) {
  bbox = fitBBox_ar.getResponseText().split(',');
  map1.fitToBBox(+bbox[0],+bbox[1],+bbox[2],+bbox[3]);
  mapCreateCallback(pSet);
  document.body.style.cursor = '';  
}

function mapCreateCallback(pSet) {
  document.getElementById('mvlegend').innerHTML = '';
  document.getElementById('export_tab_li').className = '';
  document.getElementById('graph_tab_li').className = '';
  
  delayRefreshes();  //clears graph

  
  
  if ((pSet.getParameterValues('constituent') == 'OFF' && pSet.getParameterValues('submit_name') == 'Water Quality')) {
    document.getElementById('export_tab_li').className = 'disabled';
    document.getElementById('graph_tab_li').className = 'disabled';
    var id = pSet.getParameterValues('layer_id');
    //remove old layer-
    map1.removeLayer(id);    
  } else {

    //disable graph if sites are selected
    if (pSet.getParameterValues('submit_name') == 'Sites')
      document.getElementById('graph_tab_li').className = 'disabled';
  

    //here's where i append this new layer to the map
    var baseUrl = 'http://' + appbase + '/' + pSet.getParameterValues('submit_to') + '?' + pSet.getParameterQueryString();
 
    var id = pSet.getParameterValues('layer_id');
    var name = pSet.getParameterValues('submit_name');
    var title = pSet.getParameterValues('submit_name');
    var zdepth = pSet.getParameterValues('zdepth');
  
    
    //see if this is in the mapobjects wmsLayers dictionary
    var found = false;
    var wms = map1.wmsLayers;
    for (var i = 0; i < wms.length; i++) {
      if (wms[i].id == id) {
        found = true;
        //change the baseurl if found
        wms[i].baseUrl = baseUrl;
        wms[i].title = title;
        wms[i].name = name;
        break;
      }
    }
    //if not found, push it on the stack  
    if (!found) {
      map1.wmsLayers.push(new WmsLayer(name, title, id, baseUrl, -1*zdepth, 'Custom', 'Custom', 0, 10, '-180,-90,180,90', null,null,null,'Custom Layer', null, 8307,'1.1.1','getmap','wms','image/png',100,true));
    }
    
    //remove old layer-
    map1.removeLayer(id);
    
    //append new layer
    map1.appendLayer(id);
    
    map1.currentParameterSet = pSet;    
    
    var param = document.getElementById('param_const');
    var full_const = param.options[param.selectedIndex].innerHTML;
    
    var leg = document.createElement('img');
    leg.src = 'legend?' + pSet.getParameterQueryString() + "&fullconstituent=" + escape(full_const.split('(Sampled')[0]);
    document.getElementById('mvlegend').appendChild(leg);
    document.getElementById('save_map_legend_url').innerHTML = leg.src;
  }
}


function highlightTool(node) {
  var buttons = node.parentNode.getElementsByTagName('a');
  for (var i = 0; i < buttons.length; i++) {
    buttons[i].className = '';
  }
  node.className = 'selected';
}


var w;
function identifyPoint(event, map) {
  event = event || window.event;

  var coords = getRelativeCoords(event, map.pane);
  var ll = map.getLatLonFromPixel(coords[0], coords[1]);

  if (map.currentParameterSet) {
    var args = map.currentParameterSet.getParameterQueryString();
    args += '&lat=' + ll[1] + '&lon=' + ll[0];
    
    var base_path = map.currentParameterSet.getParameterValues('base_path');
    
    
    if (w) { w.close(); }
    w = window.open(base_path + 'id.jsp?' + args, "IdentifyPoint","scrollbars,menubar,resizable=yes,width=750,height=300");
  } else {
    alert(ll[0] + " : " + ll[1]);
  }

}


var predef_ar;

function cancelStorePT() {
  document.getElementById('add_predef').style.display = 'none';
  document.getElementById('predefs').style.display = 'block';
}

function closeStorePT() {

  var name = document.getElementById('predef_name').value;
  var desc = document.getElementById('predef_desc').value;
  
  if (name && desc) {  
    document.getElementById('add_predef').style.display = 'none';
    document.getElementById('predefs').style.display = 'block';
    storePredefTheme(name, desc);
  } else {
    alert('Please enter a name and description.');
  }
}

function openStorePT() {
  document.getElementById('predef_name').value = '';
  document.getElementById('predef_desc').value = '';

  document.getElementById('add_predef').style.display = 'block';
  document.getElementById('predefs').style.display = 'none';
}


function storePredefTheme(name, desc) {
  if (map1.currentParameterSet) {
    var pSet = map1.currentParameterSet;
    
    var args = pSet.getParameterQueryString();
    
    //get map layers
    for (var i = 0; i < map1.layers.length; i++) {
      if (map1.layers[i].id != pSet.getParameterValues('layer_id')) {
        args += '&layer=' + map1.layers[i].id;
      }
    }
    
    //center lat lon
    var ll = map1.getCenterLatLon();
    args += '&lat=' + ll[0];    
    args += '&lon=' + ll[1];
    
    //zoom
    args += '&zoom=' + map1.zoom;
    args += '&name=' + name;
    args += '&desc=' + desc;
    
    //ajax call to store predefined theme
    if (predef_ar) {
      predef_ar.abort();
      predef_ar = null;
    }
    predef_ar = new AjaxRequest();
    predef_ar.asyncRequest('POST', 'storePredef', args, predefStored);
  }
}


function predefStored() {
  var success = predef_ar.getResponseText();
  predef_ar = null;
  listPredefinedThemes();
}


function loadPredefTheme(id) {
  if (!id) id = 3;
  //ajax call to load predefined theme
  if (predef_ar) {
    predef_ar.abort();
    predef_ar = null;
  }
  predef_ar = new AjaxRequest();
  
  
  predef_ar.asyncRequest('GET', 'loadPredef', 'id=' + id, predefLoaded);        
}


function predefLoaded() {
  var xml = predef_ar.getResponseXML();
  
  var map_center = getNodeValue(xml,'map-center');
  var map_zoom = getNodeValue(xml,'map-zoom');
  var ll = map_center.split(',');
  
  //adjust map position/zoom
  map1.jumpTo(ll[0],ll[1],map_zoom);
  
  
  //do layers
  map1.removeAllLayers();
  var layerset = xml.getElementsByTagName('layer-set')[0];
  var layers = layerset.getElementsByTagName('layer-id');

  for (var i = 0; i < layers.length; i++) {
    map1.appendLayer(layers[i].firstChild.nodeValue);
  }
  
  
  //do DATA layer
  var map_parameters = xml.getElementsByTagName('map-parameters')[0];
  var parameters = map_parameters.getElementsByTagName('parameter');
  
  for (var i = 0; i < parameters.length; i++) {
    var elem_name = parameters[i].getAttribute('name');
    var num_vals = parameters[i].getAttribute('num_vals');



    var values = new Array();
    var elem = document.getElementsByName(elem_name)[0];
    var type = '';
    if (elem.type) type = elem.type.toUpperCase();
    elem.selectedIndex = -1;
    
    for (var j = 0; j < num_vals; j++) {
      var val = parameters[i].getElementsByTagName('value')[j];
       
      if (type == 'TEXT' || type == 'HIDDEN' || type == 'TEXTAREA') {
        //alphanumeric  
        if (val.firstChild) {
          elem.value = val.firstChild.nodeValue;
        }
      } else if (type == 'RADIO') {
  
      } else if (type == 'CHECKBOX') {
  
          
      } else if (type == 'SELECT-MULTIPLE' || type == 'SELECT-ONE') {
        if (elem.options) {
          for (var k = 0; k < elem.options.length; k++) {
            if (elem.options[k].value == val.firstChild.nodeValue) {
              elem.options[k].selected = true;
            } else if (val.firstChild.nodeValue == 'null') {
              elem.options[0].selected = true;
            }
          }
        }
      }      
    }
  }
  
    
  if (getNodeValue(xml, 'map-type') == 'sites') {
    mapSitesSubmit.processParameters();
    mapSitesSubmit.submitParameters();
    map1.currentParameterSet = mapSitesSubmit;
  } else {
    mapWaterQuality.processParameters();
    mapWaterQuality.submitParameters();
    map1.currentParameterSet = mapWaterQuality;
  }
  
  map1.imagesDoneLoading();
  
  var it = document.getElementsByName('binning_method')[0].value; 
  if (it == 'equal_count') {
    document.getElementById('thresh_input').style.display = 'none';
  } else {
    document.getElementById('thresh_input').style.display = 'block';
  }

  updateExportURLs();

}

function listPredefinedThemes() {
  document.getElementById('predef_list').innerHTML = '';
  if (predef_ar) {
    predef_ar.abort();
    predef_ar = null;
  }
  predef_ar = new AjaxRequest();
  
  
  predef_ar.asyncRequest('GET', 'listPredef', '', predefListed);      
}

function predefListed() {
  document.getElementById('predef_list').innerHTML = predef_ar.getResponseText();
}




function lockMap() {

  unlockMap();
  var modal = document.createElement('div');
  //modal.style.backgroundColor = 'gray';
  modal.style.opacity = '0.4';
  modal.style.filter = 'alpha(opacity=40)';
  modal.style.zIndex = 3999;
  modal.style.position = 'absolute';
  modal.style.top = '1px';
  modal.style.left= '1px';
  modal.style.width = '768px';
  modal.style.height = '540px';
  modal.id = 'modal';
  modal.style.backgroundColor = 'gray';
  modal.onclick = function () {alert('Please wait until layer catalog refreshes.'); };
  
  document.getElementById('maparea').appendChild(modal);
  
  
  
}

function unlockMap() {

  if (document.getElementById('modal'))
    document.getElementById('maparea').removeChild(document.getElementById('modal'));

    
}







var graph_ar;
function dataGraph() {
  if (map1.currentParameterSet && document.getElementById('graph_tab_li').className == 'selected') {
    document.getElementById('graph-canvas').innerHTML = '<br/><img src="images/progress_bar.gif" alt="please wait..."/></br>';
    if (graph_ar) graph_ar.abort();
    var param = document.getElementById('param_const');
    var full_const = param.options[param.selectedIndex].innerHTML;
        
    
    graph_ar = new AjaxRequest();
    var args = map1.currentParameterSet.getParameterQueryString();
    args += '&points=' + getOptVal('points');
    args += '&scale=' + getOptVal('scale');
    args += '&expand=' + getOptVal('expand');
    args += '&BBOX=' + map1.getViewportBoundingBoxString();
  
    graph_ar.asyncRequest('GET','graph',args,drawDataGraph);
  }
}


function drawDataGraph() {
  document.getElementById('graph-canvas').innerHTML = graph_ar.getResponseText();
  document.getElementById('graph-description').style.display = 'block';  
  graph_ar = null;
}


function clearGraph() {
  if (graph_ar) graph_ar.abort();
  document.getElementById('graph-canvas').innerHTML = '';
  graph_ar = null;
  document.getElementById('graph-description').style.display = 'none';  

}


function waitGraph() {
  if (graph_ar) graph_ar.abort();
  document.getElementById('graph-canvas').innerHTML = '<br/><img src="images/progress_bar.gif" alt="please wait..."/></br>';
  graph_ar = null;
}


function getOptVal(name) {
  var radio = document.getElementsByName(name);
  for (var i = 0; i < radio.length; i++) {
    if (radio[i].checked) {
      return radio[i].value;
    }
  }
}












var is;
if(!layername) {var layername="popuplabel";}

if(!begin) { var begin = new Array(); }
if(!end) { var end = new Array(); }
begin["any"]='<table id="ncp-hover" style="background-color: #eeffff; border: solid black 1px;"><tr><td>';
end["any"]='</td></tr></table>';

if(!popupLabelZIndex) { var popupLabelZIndex = ""; }
var skn;
var yyy;


function initNCP() {
	if(!is) { is = new Is(); }
	
  var popup;
  //document.writeln('<div id="popuplabel" align="center" style="position:absolute; visibility:hidden; width:auto;'+(popupLabelZIndex.length>0 ? (' z-index: '+popupLabelZIndex+';') : '')+'"></div>');
  popup = document.createElement('div');
  popup.id='popuplabel';
  //popup.align='center';
  popup.style.position='absolute';
  popup.style.visibility='hidden';
  popup.style.width='auto';
  if (popupLabelZIndex.length>0) {
    popup.style.zIndex = popupLabelZIndex;
  }
	document.body.appendChild(popup);
	skn=popup.style;
  setNCPEvents();
}



function setNCPEvents() {
	if(is.nav4) {
		document.captureEvents(Event.MOUSEMOVE);
		document.onmousemove=get_mouse;	
	} else  {
		if (is.nav5up) {
			document.addEventListener("mousemove", get_mouse, true);
		} else {
			document.onmousemove=get_mouse;	
		}
		skn.visibility="visible";
		skn.display="none";
	}
}

function Is() {
	this.ver=navigator.appVersion
	this.agent=navigator.userAgent.toLowerCase()
	this.dom=document.getElementById?1:0
	this.opera5=(navigator.userAgent.indexOf("opera")>-1 && document.getElementById)?1:0
	this.ie4=(document.all && !this.dom && !this.opera5)?1:0;	
	this.ie5=(this.ver.indexOf("msie 5")>-1 && this.dom && !this.opera5)?1:0; 
	this.ie6=(this.ver.indexOf("msie 6")>-1 && this.dom && !this.opera5)?1:0;
	this.ie=(this.agent.indexOf("msie") != -1)
	this.mac=this.agent.indexOf("max")>-1
	this.nav=((this.agent.indexOf("mozilla")!=-1) && ((this.agent.indexOf("spoofer")==-1) && (this.agent.indexOf("compatible") == -1)))	
	this.nav5up=(this.dom && parseInt(this.ver) >= 5) ?1:0; 
	this.nav4=(document.layers && !this.dom)?1:0;
	return this
}

var highlites = new Array();
Xoffset=0;     // modify these values to ...
Yoffset=20;    // change the popup position.
yyy=-1000;
timeoutID = 10;
sideBuffer = 5;	// specifies the minimum amount of space on the sides of the active labels.



function createArray(data) {
	data = data.replace(/\+/g,"%20");
	if(is.nav4) {
		// NS4 does not decode function parameters prior to send
		data = unescape(data);
		data = data.replace(/\+/g,"%20");
	}
	var result = new Array();
	if(data!=null && data.length > 0) {
		var namevaluepairs = data.split("&");
		for(var i=0;i<namevaluepairs.length;i++) {
			var pair = namevaluepairs[i].split("=");
			if(pair.length!=2)
				continue;
			result[i] = unescape(pair[1]);
			result[unescape(pair[0])] = unescape(pair[1]);
		}
	}
	return result;
}

function getNSLayer() {
	outputted = false;
	for (var i=0; i < document.layers.length; i++) {
		if (document.layers[i].name == layername) {
			outputted = true;
			break;
		}
	}
	if (!(outputted)) {
		skn = new Layer(10);
		if(popupLabelZIndex.length>0)
			skn.zIndex = popupLabelZIndex;
		layername = skn.name;
		skn.visibility="hide";
	}
	return skn;
}
	
	
	
var ncpCoords;
function setMouseNCP(evt) {

  evt = (evt) ? evt : window.event;
  ncpCoords = getPositionedEventCoords(evt);

}
	
	

function displayActiveLabel(which, text){
	var content = "";
  setNCPEvents();
	
	content = begin['any']+text.replace(/ /g,"&nbsp;")+end['any'];
  

  var coords = text.split('<q>');
  
  //make sure point has lat lon data
  if (coords.length > 1) {


    coords = coords[1].split('</q>')[0].split(',');
    


    //calculate pixel coord stuff
    var bboxCoords = map1.getViewportBoundingBox();
    var deviceWidth = 768;
    var deviceHeight = 512;
    
    var latitudeExtent = bboxCoords.ymax - bboxCoords.ymin;
    var longitudeExtent = bboxCoords.xmax - bboxCoords.xmin;
    var degreesPerPixelLatitude = latitudeExtent / deviceHeight;
    var degreesPerPixelLongitude = longitudeExtent / deviceWidth;
    
    
    //go through all coord pairs and put a highlite on map
    for (var i = 0; i < coords.length; i++) {
 
      var coordPair = coords[i].split(":");
      var lat = coordPair[0];
      var lon = coordPair[1];
 
  
      var normalLat = bboxCoords.ymax - lat;
      var normalLon = lon - bboxCoords.xmin;
      
      var pixelLat = normalLat / degreesPerPixelLatitude;
      var pixelLon = normalLon / degreesPerPixelLongitude;
      
      var h = document.createElement('div');
      h.className = 'highlite';
      h.style.left = parseInt(pixelLon) - 10 + 'px';
      h.style.top = parseInt(pixelLat) - 10 + 'px';  
      
      map1.mapViewport.appendChild(h);  
      
      highlites.push(h);
    }
        
  }
  
	yyy=Yoffset;
	if(is.ie) {
		document.all("popuplabel").innerHTML=content;
		skn.display='';
	} else if(is.nav4) {
		skn = getNSLayer();	
		skn.document.write(content);
		skn.document.close();
		skn.visibility="visible";
	} else if(is.nav5up) {
		document.getElementById("popuplabel").innerHTML=content;
		skn.display='';
		skn.visibility="visible";		
	}
  skn.zIndex = 2001;
	window.status = text;
	timeoutID = setTimeout("window.status = unescape('"+escape(text)+"');", 0);	
}

function get_mouse(e) {
var e = (e) ? e : window.event;

	var clientWidth = 0;
	var scrollLeft = 0;
	var scrollTop = 0;
	var cw = 0;
	var rectX = 0;
	if (is.nav4) {
		skn = getNSLayer();
		if(skn.visibility=="hide")
			return;
		cw = skn.document.width;
		rectX = (e.pageX-window.pageXOffset)-cw/2+Xoffset;
		clientWidth = self.innerWidth;
		scrollLeft = self.pageXOffset;
		scrollTop = e.pageY;
	} else if (is.ie) {
		if(skn.display=="none")
			return;
		cw = document.all("popuplabel").scrollWidth;
		rectX = event.clientX-cw/2+Xoffset;
		if (document.documentElement && document.documentElement.clientWidth)
			clientWidth = document.documentElement.clientWidth;
		else
			clientWidth = document.body.clientWidth;
		if (document.documentElement && document.documentElement.scrollLeft)
			scrollLeft = document.documentElement.scrollLeft;
		else
			scrollLeft = document.body.scrollLeft;
		if (document.documentElement && document.documentElement.scrollTop)
			scrollTop = document.documentElement.scrollTop;
		else
			scrollTop = document.body.scrollTop;
		scrollTop+=event.clientY;
	} else if (is.nav5up) {
		if(skn.display=="none")
			return;
		cw = parseInt(document.defaultView.getComputedStyle(document.getElementById("popuplabel").firstChild,'').getPropertyValue('width'));	
		rectX = e.clientX-cw/2+Xoffset;
		if(self.innerWidth)
			clientWidth = self.innerWidth;
		else
			clientWidth = document.body.clientWidth;
		if(self.pageXOffset)
			scrollLeft = self.pageXOffset;
		else
			scrollLeft = document.body.scrollLeft;
		scrollTop = e.pageY;
	}
	if(cw==0)
		cw = 1;
	if((rectX+cw) >= (clientWidth-sideBuffer))
		rectX -= ((rectX+cw)-(clientWidth-sideBuffer));
	if (rectX < sideBuffer)
		rectX = sideBuffer;
	skn.left = (rectX+scrollLeft)+(is.nav4?'':'px');
	skn.top = (yyy+scrollTop)+(is.nav4?'':'px');
}

function unDisplayActiveLabel() {

	yyy=-1000;
  
  for (var i = 0; i < highlites.length; i++) {
    map1.mapViewport.removeChild(highlites[i]);
  }
  highlites = new Array();
  
	if(is.nav4) {
		skn = getNSLayer();
		skn.visibility="hide";
	} else if (is.nav5up||is.ie) {
		skn.display="none";
	}
  
  document.getElementById("popuplabel").style.left = '-1000px';
	window.status = "";

	clearTimeout(timeoutID);	
}


function listBackgroundMaps() {

  if (map1.wmsLayerManager.isLoading) {
    lockMap();
    document.getElementById('bglayers').innerHTML = 'Refreshing Map Layers Catalog.  Please wait...';
    //redraw layers if tab is opened during a call to the NMC
    map1.wmsLayerManager.onloaded = function() {
      if (document.getElementById('background_tab_li').className == 'selected')
        listBackgroundMaps();
        map1.wmsLayerManager.onloaded = null;
    };    
  } else {
    unlockMap();
    var selector = new Object();
    var layers = map1.wmsLayerManager.getAllAvailableLayers();
    var bgtab = document.getElementById('bglayers');
    bgtab.innerHTML = '';
    
    //sort out layers into classifications
    for (var i = 0; i < layers.length; i++) {
      if (!selector[layers[i].classTheme]) {
        selector[layers[i].classTheme] = new Object();
      }    
      if (!selector[layers[i].classTheme][layers[i].className]) {
        selector[layers[i].classTheme][layers[i].className] = new Array();    
      }
      
      
      selector[layers[i].classTheme][layers[i].className].push(layers[i]);        
    }
    
    //reverse so custom layers go on bottom
    var temp_cat = new Array();
    for (var i in selector) {
      temp_cat.push(i);
    }
    
    for (var i = temp_cat.length - 1; i >= 0; i--) {
    
      if (temp_cat[i] == 'CUSTOM LAYERS') {
        bgtab.appendChild(document.createElement('hr'));
      }    
    
    
      var bgClass = document.createElement('div');
      bgClass.className = 'layer-off';
      
      
      
  
      var bgClassThemeLabel = document.createElement('div');
      bgClassThemeLabel.innerHTML = temp_cat[i];
      bgClassThemeLabel.className = 'closed';
      bgClassThemeLabel.onclick = function () {
        if (this.nextSibling.style.display == 'none') {
          this.nextSibling.style.display = 'block';
          this.className = 'open';
        } else {
          this.nextSibling.style.display = 'none';
          this.className = 'closed';
        }
      }
  
      bgClass.appendChild(bgClassThemeLabel);
  
      var bgClassTheme = document.createElement('div');
      bgClassTheme.style.display = 'none';
      bgClassTheme.className = 'theme-set';
  
  
      var ct_all = 0;
      var ct_all_sel = 0;
      
      for (var j in selector[temp_cat[i]]) {
  
        var bgClassName = document.createElement('div');
        bgClassName.innerHTML = j;
        bgClassName.className = 'closed';
        bgClassName.onclick = function () {
          if (this.nextSibling.style.display == 'none') {
            this.nextSibling.style.display = 'block';
            this.className = 'open';
          } else {
            this.nextSibling.style.display = 'none';
            this.className = 'closed';
          }
        }
        
        bgClassTheme.appendChild(bgClassName);
        
        var bgClassBGs = document.createElement('div');
        bgClassBGs.style.display = 'none';
        bgClassBGs.className = 'layer-set';
        bgClassTheme.appendChild(bgClassBGs);
        
        var ct_lay = 0;
        var ct_lay_sel = 0;
        for (var k = 0; k < selector[temp_cat[i]][j].length; k++) {
          
          ct_all++;
          ct_lay++;
          
          var bg = document.createElement('div');
          
          var bgcheck = document.createElement('input');
          bgcheck.type = 'checkbox';
          bgcheck.layerid = selector[temp_cat[i]][j][k].id;
          bgcheck.onclick = function() {
            if (this.checked) {
              map1.appendLayer(this.layerid);               
              incrementLayerCount(this);              
            } else {
              map1.removeLayer(this.layerid);
              decrementLayerCount(this);              
            }
          }
          
          
          var bgtitlespan = document.createElement('span');
          bgtitlespan.innerHTML = selector[temp_cat[i]][j][k].title;
          
          if (map1.containsLayer(selector[temp_cat[i]][j][k].id)) {
            bgcheck.checked = true;
            bgcheck.defaultChecked = true;
            bgtitlespan.style.fontWeight = 'bold';
            
            ct_all_sel++;    
            ct_lay_sel++;
          }

          
          bg.appendChild(bgcheck);
          bg.appendChild(bgtitlespan);
          
          bgClassBGs.appendChild(bg);      
        }
        
        bgClassName.innerHTML += ' (<span>' + ct_lay_sel + '/' + ct_lay + '</span>)';
        if (ct_lay_sel > 0) 
          bgClassName.style.fontWeight = 'bold';
        else 
          bgClassName.style.fontWeight = 'normal';        
        
      }
      
      bgClassThemeLabel.innerHTML += ' (<span>' + ct_all_sel + '/' + ct_all + '</span>)';
      if (ct_all_sel > 0)
        bgClassThemeLabel.style.fontWeight = 'bold';
      else 
        bgClassThemeLabel.style.fontWeight = 'normal';
      
      
      
      
      bgClass.appendChild(bgClassTheme);
  
      bgtab.appendChild(bgClass);
      
    }
  }
}

//------------------------------------------------------------------------
function openAddressEntry() {
  document.getElementById('address-entry').style.display = 'block';
} 
function closeAddressEntry() {
  document.getElementById('address-entry').style.display = 'none';
} 

var yws;
function findAddress() {
  var yurl = '';
	
	yurl += 'street=';
	if (document.getElementById('yahoo-address')) {
		yurl += document.getElementById('yahoo-address').value;
	}
	
	if (yurl != '') yurl += '&city=';
	if (document.getElementById('yahoo-city')) {
		yurl += document.getElementById('yahoo-city').value;
	}
	
	if (yurl != '') yurl += '&state=';
	if (document.getElementById('yahoo-state')) {
		yurl += document.getElementById('yahoo-state').value;
	}
  
	if (yurl != '') yurl += '&zip=';
	if (document.getElementById('yahoo-zip')) {
		yurl += document.getElementById('yahoo-zip').value;
	}


  var address_entry_results = document.getElementById('address-entry-results');
  address_entry_results.innerHTML = 'Searching for location...';
	
  yws = new AjaxRequest();
  yws.asyncRequest('POST', 'yahoows', yurl, printAddresses);

}

function printAddresses() {
  var addressXML = yws.getResponseXML();
  var addressText = yws.getResponseText();
  var address_entry_results = document.getElementById('address-entry-results');
  address_entry_results.innerHTML = '';

  if (addressXML.childNodes.length > 0 && addressXML.childNodes[0].nodeName != 'parsererror') {
    var results;
    if (addressXML.childNodes[0].nodeName.toUpperCase() != 'RESULTSET') {
      results = addressXML.childNodes[1].childNodes;
    } else {
      results = addressXML.firstChild.childNodes;
    }
  
    
    for (var i = 0; i < results.length; i++) {
      var address = results[i].childNodes;
   
      if (results[i].getAttribute('warning')) {
        var warning = results[i].getAttribute('warning');
        if (warning) {
          var warn = document.createElement('div');
          warn.style.color = 'red';
          warn.style.fontStyle = 'italic';
          warn.style.fontSize = '90%';
          warn.style.paddingBottom = '3px';
          warn.style.borderBottom = 'dotted black 1px';
          warn.style.marginBottom = '3px';
          warn.innerHTML = warning;
          address_entry_results.appendChild(warn);
        }
      }
      
      var precision;
      try {
        var p = results[i].getAttribute('precision');
        if (p.toUpperCase() == 'ADDRESS') {
          precision = 17;
        } else if (p.toUpperCase() == 'CITY') {
          precision = 10;
        } else if (p.toUpperCase() == 'STATE') {
          precision = 6;
        } else if (p.toUpperCase() == 'ZIP') {
          precision = 10;
        }
      } catch (e) {
        precision = 6;  //state zoom by default
      }
      
      
      try {
        var rlat = address[0].firstChild.nodeValue;
      } catch (e) {
      
      }
      
      try {
        var rlon = address[1].firstChild.nodeValue;
      } catch (e) {
      
      }
      
      try {
        var radd = address[2].firstChild.nodeValue;
      } catch (e) {
        //Logger.info("no address found");
      }
      
      try {
        var rcity = address[3].firstChild.nodeValue;
      } catch (e) {
        //Logger.info("no city found");     
      }
         
      try {
        var rstate = address[4].firstChild.nodeValue;
      } catch (e) {
        //Logger.info("no state found");
      }
      
      try {
        var rzip = address[5].firstChild.nodeValue;
      } catch (e) { 
        //Logger.info("no zip found");
      }
      
      
      var a = document.createElement('a')
      a.href = '#';
      a.lat = rlat;
      a.lon = rlon;
      a.precision = precision;
      a.onclick = function () {
        map1.jumpTo(this.lon, this.lat, this.precision);
        closeAddressEntry();
        return false;
      }
      a.innerHTML = '';
      if (radd) a.innerHTML += radd + ',&nbsp;';
      if (rcity) a.innerHTML += rcity + ',&nbsp;';
      if (rstate) a.innerHTML += rstate + '&nbsp;';
      if (rzip) a.innerHTML += rzip;
      
      address_entry_results.appendChild(a);
      var br = document.createElement('br');
      address_entry_results.appendChild(br);
    }
  } else {
    var nores = document.createElement('div');
    nores.innerHTML = 'No matches.';
    address_entry_results.appendChild(nores);
  }
  
}

function updateExportURLs() {
  if (map1.currentParameterSet) {
    document.getElementById('kml_export').href = 'http://' + appbase + '/export?' +
                                      map1.currentParameterSet.getParameterQueryString() + 
                                      '&export=KML&BBOX=' + map1.getViewportBoundingBoxString();
                                      
    document.getElementById('tsv_export').href = 'http://' + appbase + '/export?' +
                                      map1.currentParameterSet.getParameterQueryString() + 
                                      '&export=TSV&BBOX=' + map1.getViewportBoundingBoxString();
                                      
    document.getElementById('shape_export').href = 'http://' + appbase + '/export?' +
                                      map1.currentParameterSet.getParameterQueryString() + 
                                      '&export=SHP&BBOX=' + map1.getViewportBoundingBoxString();
                                        

    document.getElementById('xls_export').href = 'http://' + appbase + '/export?' +
                                      map1.currentParameterSet.getParameterQueryString() + 
                                      '&export=XLS&BBOX=' + map1.getViewportBoundingBoxString();                                              
                                      
  }
}


function incrementLayerCount(node) {
  node.nextSibling.style.fontWeight = 'bold';

  node.parentNode.parentNode.previousSibling.style.fontWeight = 'bold';
  var ct_node = node.parentNode.parentNode.previousSibling.getElementsByTagName('span')[0];  
  var ct = ct_node.innerHTML.split('/');
  ct_node.innerHTML = (parseInt(ct[0])+1) + '/' + ct[1];

  node.parentNode.parentNode.parentNode.previousSibling.style.fontWeight = 'bold';
  ct_node = node.parentNode.parentNode.parentNode.previousSibling.getElementsByTagName('span')[0];
  ct = ct_node.innerHTML.split('/');
  ct_node.innerHTML = (parseInt(ct[0])+1) + '/' + ct[1];
  
}

function decrementLayerCount(node) {
  node.nextSibling.style.fontWeight = 'normal';
  
  var ct_node = node.parentNode.parentNode.previousSibling.getElementsByTagName('span')[0];
  var ct = ct_node.innerHTML.split('/');
  ct_node.innerHTML = (parseInt(ct[0])-1) + '/' + ct[1];
  
  if (parseInt(ct[0])-1 == 0) {
    node.parentNode.parentNode.previousSibling.style.fontWeight = 'normal';
  }
  

  ct_node = node.parentNode.parentNode.parentNode.previousSibling.getElementsByTagName('span')[0];
  ct = ct_node.innerHTML.split('/');
  ct_node.innerHTML = (parseInt(ct[0])-1) + '/' + ct[1];
  if (parseInt(ct[0])-1 == 0) {
    node.parentNode.parentNode.parentNode.previousSibling.style.fontWeight = 'normal';
  }  
}

var mapSitesSubmit;
var mapSitesFitSubmit;
var mapWaterQuality;
var mapWaterFitQuality;

function createParameterSets() {
  mapSitesSubmit = new ParameterSet('map_sites_set', mapCreateCallback, 'Keep View And Map');
  mapSitesFitSubmit = new ParameterSet('map_sites_fit_set', mapFitAndCreateCallback, 'Fit Map To Data');
  mapWaterQuality = new ParameterSet('map_waterquality_set', mapCreateCallback, 'Keep View And Map');
  mapWaterFitQuality = new ParameterSet('map_waterquality_fit_set', mapFitAndCreateCallback, 'Fit Map To Data');
      
}


refreshGTO = null;
refreshBTO = null;
function delayRefreshes() {
  if (document.getElementById('graph_tab_li').className == 'selected') {
    waitGraph();
    if (refreshGTO) clearTimeout(refreshGTO);    
    refreshGTO = setTimeout(function() {dataGraph(), refreshGTO = null}, 1000);
  } else {
    clearGraph();
  }

}



var last_bbox;
function refreshCatalog(override) {
  if (map1.getViewportBoundingBoxString() != last_bbox || override) {
    document.getElementById('bglayers').innerHTML = 'Refreshing Catalog. Please wait...';
    map1.wmsLayerManager.updateWmsLayers();
    listBackgroundMaps();
    
    
    last_bbox = map1.getViewportBoundingBoxString();
  }      
}


function tabGraphRefresh() {
  var g = document.getElementById('graph-canvas');      
  if (g.innerHTML == '') dataGraph();
}

function appendLegend(id) {  
  var layer = map1.getWmsLayer(id);
  if (layer && layer.classTheme != 'Custom' && !document.getElementById('leg_' + id)) {
    var legarea = document.getElementById('legends');
    var legcontainer = document.createElement('div');
    legcontainer.id = 'leg_' + id;
    legcontainer.className = 'legend-container';
    
    var leg = document.createElement('img');
    var legendUrl = layer.legendUrl;
    if (!legendUrl && (!layer.serviceType || layer.serviceType == 'wms')) {
      legendUrl = layer.baseUrl;
      legendUrl += '&request=GetMap';
      legendUrl += '&srs=EPSG:' + layer.srs;
      legendUrl += '&version=' + layer.version;
      legendUrl += '&layers=' + layer.layers;
      legendUrl += "&BBOX=" + map1.getViewportBoundingBoxString();
      legendUrl += "&width=100"
      legendUrl += "&height=66";            
      legendUrl += '&transparent=true';
      legendUrl += '&format=' + layer.format; 
    }
    if (legendUrl) leg.src = legendUrl;
    
    //alert(legendUrl);
    
    var title = document.createElement('h4');
    title.style.backgroundColor = '#DDDBB4';
    if (layer.metaUrl) {
      title.innerHTML = '<a href="' + layer.metaUrl + '" target="_blank">' + layer.title + "</a>";
    } else {
      title.innerHTML = layer.title;
    }

    var typetheme = document.createElement('div');
    typetheme.innerHTML = 'Theme/Type: ' + layer.classTheme + '/' + layer.className;
    
    var desc = document.createElement('div');
    desc.innerHTML = 'Description: ' + layer.description;


    legarea.appendChild(legcontainer);      
    legcontainer.appendChild(title);
    if (legendUrl) legcontainer.appendChild(leg);   
    legcontainer.appendChild(typetheme);
    legcontainer.appendChild(desc);
    
  }
}


function removeLegend(id) {
  var legarea = document.getElementById('legends');
  var lc = document.getElementById('leg_' + id);
  if (lc) {
    legarea.removeChild(lc);
  }
}    

function catalogOutOfSync() {
  document.getElementById('bglayers').innerHTML = 'Layers are out of sync with map. <a href="#" onclick="refreshCatalog(); return false;">Refesh Catalog</a>';      
}
    
