	<!--
//<![CDATA[
var map = null;
var stations = new Array();
var owners = new Array();
var dartevents = new Array();
var nxt_marker = 0;
var mkrinc = null;
var selected_programs = new Array();
var selected_options = new Array();
var display_labels = false;
var userpgm = null;
var userop = null;
var ndbcmap = null;
var tileLayer1 = null;
var myTileLayer1 = null;
var m_x = 0;
var m_y = 0;
var curLatLong=null;
var latlnglabel = null;
var mylabels = null;
var labelLayer = null;

// IDs for form fields.
var pgmselect = opselectlabel = opselect = status_R = status_H = null;
// ID for map divs.
var ndbcmaplink = ndbcmaptotals = tsunamilinks = historicallinks = null;
var myom = null;
var zoomlock = true; // guess what this does...
var bounds = null;

//icon globals
var stnicon = histstnicon = badstnicon = tsunamicon = null;
// load json data
var station_data = get_data();
var event_dataaa = new Array();
// assign null program attributes to owners
for( i = 0 ; i < station_data.owner.length ; i++ )
{
	//owners.push({name:station_data.owner[i]});
	owners[i]={name:station_data.owner[i]};
	for( j = 0 ; j < station_data.program.length ; j++ )
	{
		eval("owners[i]."+station_data.program[j].replace(/[^A-za-z0-9]/g,"")+"=null");
	}
}

for( i = 0 ; i < station_data.station.length; i++ )
{
	var tmp_owner = station_data.station[i].owner;
	var tmp_program = station_data.station[i].program;
	eval("owners[tmp_owner]."+station_data.program[tmp_program].replace(/[^A-za-z0-9]/g,"")+"=true");
	if (station_data.station[i].status == 'E')
	{
		owners[tmp_owner].recent = true;
	}
	else
	{
		owners[tmp_owner].recent = false;
	}
}

google.load("maps","2.98",{"other_params":"sensor=false"});
function initMap() {

	checkDartEvents();

	// Defaults for user parameters.
	var userlat = 20;
	var userlon = -120;
	var userzoom = 1;
	var usermaptype = G_HYBRID_MAP;
	var userstatus = 'R';
	//userpgm = 'All';
	//var userop = 'All';

	if (! document.getElementById) {
		alert("Sorry.  Your browser does not support this application.");
		exit;
	}
	if (!(document.getElementById('status_R') && document.getElementById('status_H')
		/* && document.getElementById('pgmselect') && document.getElementById('opselect') */
		&& document.getElementById('ndbcmaplink') && document.getElementById('ndbcmaptotals')
		/* && document.getElementById('opselectlabel') */ && document.getElementById('tsunamilinks')
		&& document.getElementById('historicallinks'))) {
		alert("Sorry.  Your browser does not support this application.");
		exit;
	}

	//pgmselect = document.getElementById('pgmselect');
	//opselectlabel = document.getElementById('opselectlabel');
	//opselect = document.getElementById('opselect');
	status_R = document.getElementById('status_R');
	status_H = document.getElementById('status_H');
	show_labels = document.getElementById('show_labels');
	show_grid = document.getElementById('show_grid');
	latlnglabel = document.getElementById('latlnglabel');

	ndbcmaplink = document.getElementById('ndbcmaplink');
	ndbcmaptotals = document.getElementById('ndbcmaptotals');
	tsunamilinks = document.getElementById('tsunamilinks');
	historicallinks = document.getElementById('historicallinks');

	show_labels.onclick=function(){
		if(this.checked){
			display_labels=true;
			if(!mylabels){
				setTimeout('createLabels();changeDisplay("op");genLink();',500);
			}else{
				changeDisplay("op");
				genLink();
			}
		}else{
			display_labels=false;
			changeDisplay("op");
			genLink();
		}
	}


	curLatLong=document.getElementById('latlnglabel');
	/*
	var s=curLatLong.style;
	s.fontFamily='monospace';
	s.fontSize='medium';
	s.fontWeight='normal';
	s.backgroundColor="white";
	*/
	ndbcmap = document.getElementById('ndbcmap');
	ndbcmap.onmouseout=function(){
		curLatLong.innerHTML='';
	}
	/*
	show_grid.onclick=function(){ // LatLng Overlay
		if(this.checked){
			map.addOverlay( myTileLayer1 );
		}else{
			map.removeOverlay( myTileLayer1 );
		}
	}
	*/

	var userparms = location.search.substring(1);
	var userpairs = userparms.split('&');
	for (var i=0;i<userpairs.length;i++) {
		var eq = userpairs[i].indexOf('=');
		var arg = userpairs[i].substring(0,eq).toLowerCase();
		var val = decodeURIComponent(userpairs[i].substring(eq+1).toLowerCase());
		switch (arg) {
			case 'lat': if (!isNaN(val)) { var tmp = parseFloat(val); if (!isNaN(tmp)) { userlat = tmp; }} break;
			case 'lon': if (!isNaN(val)) { var tmp = parseFloat(val); if (!isNaN(tmp)) { userlon = tmp; }} break;
			case 'zoom': if (!isNaN(val)) { var tmp = parseInt(val); if (!isNaN(tmp) && tmp >=1 && tmp <=9) { userzoom = tmp; }} break;
			case 'type':
				if (val == 'm') { usermaptype = G_NORMAL_MAP; }
				if (val == 'k') { usermaptype = G_SATELLITE_MAP; }
				if (val == 'h') { usermaptype = G_HYBRID_MAP; }
				break;
			case 'status':
				if (val == 'r') { status_R.checked = true; }
				if (val == 'h') { status_H.checked = true; }
				break;
			case 'pgm':
				//val=unescape(val);
				userpgm = val.split("|");
				break;
			case 'op':
				//val=unescape(val);
				userop = val.split("|");
				break;
			case 'ls':
				if(val=="true"){
					display_labels = true;
				}
		}
	}
	if(display_labels==true){
		show_labels.checked=true;
	}
	generate_program_tab();


	google.maps.Marker.prototype.labelShow = function()
	{
		/*
		var txt = document.createElement("div");
		txt.appendChild(document.createTextNode(this.title));
		this.appendChild(txt);
		*/
	}
	google.maps.Marker.prototype.labelHide = function()
	{

	}

	// begin LockZoomControl *****************************************************************************
	/*
	function LockZoomControl() {}
	LockZoomControl.prototype = new google.maps.Control();
	LockZoomControl.prototype.initialize = function(map) {
		var container = document.createElement("div");

		var zoomlockimg = document.createElement("img");
		var zltxt = document.createElement("div");
		zltxt.style.display="none";
		zltxt.style.color="red";
		zltxt.style.lineHeight="10px";
		zltxt.style.fontSize="10px";
		zltxt.style.backgroundColor="white";
		zltxt.style.border="1px solid black";
		zltxt.style.marginTop="2px";
		zltxt.style.padding="3px";
		zltxt.appendChild(document.createTextNode("Auto Zoom (OFF)"))
		container.appendChild(zoomlockimg);
		container.appendChild(zltxt);
		zoomlockimg.setAttribute("src","images/lockclose.gif");
		zoomlockimg.style.cursor="pointer";
		zoomlockimg.onmouseover=function(){
			this.parentNode.childNodes[1].style.display="inline";
		}
		zoomlockimg.onmouseout=function(){
			this.parentNode.childNodes[1].style.display="none";
		}
		zoomlockimg.onclick=function(){
			var img = this.src;
			if(img.match("images/lockclose.gif")){
				this.src="images/lockopen.gif";
				//this.setAttribute("alt","Auto Zoom (ON)");
				this.parentNode.childNodes[1].removeChild(this.parentNode.childNodes[1].childNodes[0]);
				this.parentNode.childNodes[1].appendChild(document.createTextNode("Auto Zoom (ON)"));
				zoomlock=false;
			}else{
				this.src="images/lockclose.gif";
				//this.setAttribute("alt","Auto Zoom (OFF)");
				this.parentNode.childNodes[1].removeChild(this.parentNode.childNodes[1].childNodes[0]);
				this.parentNode.childNodes[1].appendChild(document.createTextNode("Auto Zoom (OFF)"));
				zoomlock=true;
			}
		}
		map.getContainer().appendChild(container);
		return container;
	}

	LockZoomControl.prototype.getDefaultPosition = function() {
	  return new google.maps.ControlPosition(G_ANCHOR_TOP_LEFT, new google.maps.Size(20, 200));
	}
	LockZoomControl.prototype.setButtonStyle_ = function(button) {}
	*/
	// end LockZoomControl *****************************************************************************

	if (google.maps.BrowserIsCompatible()) {
		myom = new OverlayMessage(document.getElementById('ndbcmap'));
		myom.Set('<b>Loading...<\/b>');
		map = new google.maps.Map2(document.getElementById("ndbcmap"));
		map.addControl(new google.maps.ScaleControl(),new google.maps.ControlPosition(G_ANCHOR_BOTTOM_RIGHT,new google.maps.Size(8,20)));
		map.addControl(new google.maps.LargeMapControl());
		map.addControl(new google.maps.MapTypeControl())
		var otherOpts = {
			buttonStartingStyle: {background: '#fff', paddingTop: '4px', paddingLeft: '4px', border:'1px solid black'},
			buttonHTML: "<img title='Drag Zoom In' src='/images/maps/markers/zoomin.gif'>",
			buttonStyle: {width:'25px', height:'23px'},
			buttonZoomingHTML: 'Drag a region on the map (click here to reset)',
			buttonZoomingStyle: {background:'yellow',width:'75px', height:'100%'},
			backButtonHTML: "<img title='Zoom Back Out' src='/images/maps/markers/zoomout.gif'>",
			backButtonStyle: {display:'none',marginTop:'5px',width:'25px', height:'23px'},
			backButtonEnabled: true,
			overlayRemoveTime: 1500
		}
		//map.addControl(new LockZoomControl());
		map.addControl(new DragZoomControl({}, otherOpts, {}), new google.maps.ControlPosition(G_ANCHOR_TOP_LEFT, new google.maps.Size(20,200)));
		map.enableScrollWheelZoom();



// start latlng tile layer
/*
	// add noaa to copyright collection. does not work currently, but allows for tile layer to be displayed //
	var myCopyright = new google.maps.CopyrightCollection("noaa");
	myCopyright.addCopyright(new google.maps.Copyright('test',new google.maps.LatLngBounds(new google.maps.LatLng(0,0), new google.maps.LatLng(0,0)),0,'noaa'));

	// create tile layer //


	tileLayer1=new google.maps.TileLayer( myCopyright );
	tileLayer1.getTileUrl=function(a,b){
		var z=b;
		var f="latlng.php?x="+a.x+"&y="+a.y+"&z="+z;
		return f;
	}
	tileLayer1.isPng=function() { return true;};
	tileLayer1.getOpacity=function() { return 1.0; }
	myTileLayer1=new google.maps.TileLayerOverlay( tileLayer1 );


*/
// end latlng tile layer




		//=======Restricting the range of zoom levels
		//Get the list of map types
		var mt=map.getMapTypes();
		//Overwrite the getMinimumResolution() and getMaximumResolution() methods
		for (var i=0; i<mt.length; i++) {
			mt[i].getMinimumResolution =function() {return 1; }
			mt[i].getMaximumResolution =function() {return 9;}
		}
		//map.setCenter(new GLatLng(20, -120), 1, G_NORMAL_MAP);
		map.setCenter(new google.maps.LatLng(userlat, userlon), userzoom, usermaptype);
		labelLayer = new google.maps.Layer("labelLayer");
		map.addOverlay(labelLayer);
		stnicon = new google.maps.Icon();
		stnicon.image = "/images/maps/markers/tiny_active_marker.gif";
		stnicon.shadow = null;
		stnicon.iconSize = new google.maps.Size(11, 11);
		stnicon.shadowSize = null;
		stnicon.iconAnchor = new google.maps.Point(5, 5);
		stnicon.infoWindowAnchor = new google.maps.Point(5, 5);
		histstnicon = new google.maps.Icon(stnicon,'/images/maps/markers/tiny_historical_marker.gif');
		badstnicon = new google.maps.Icon(stnicon,'/images/maps/markers/tiny_inactive_marker.gif');
		tsunamicon = new google.maps.Icon();
		tsunamicon.image = "/images/maps/markers/tiny_tsunami_event_marker.gif";
		tsunamicon.shadow = null;
		tsunamicon.iconSize = new google.maps.Size(19, 19);
		tsunamicon.shadowSize = null;
		tsunamicon.iconAnchor = new google.maps.Point(9, 9);
		tsunamicon.infoWindowAnchor = new google.maps.Point(9, 9);

		bounds = new google.maps.LatLngBounds();



/*
		map.latlngoverlay = function(){
			if(tileLayer1){
				this.removeOverlay(tileLayer1);
			}
			if(this.getZoom()>3){
				var lat1 = this.getBounds().getNorthEast().lat();
				var lat2 = this.getBounds().getSouthWest().lat();
				var lng1 = this.getBounds().getNorthEast().lng();
				var lng2 = this.getBounds().getSouthWest().lng();
				//alert("/latlngoverlay.php?lat1="+lat1+"&lat2="+lat2+"&lng1="+lng1+"&lng2="+lng2);

				tileLayer1 = new google.maps.GroundOverlay( "/latlngoverlay.php?lat1="+lat1+"&lat2="+lat2+"&lng1="+lng1+"&lng2="+lng2 , this.getBounds() );

				this.addOverlay(tileLayer1);
			}
		}
*/

		/*
		switch (stationsxml[i].getAttribute("pgm")) {
				case 'NDBC Meteorological/Ocean': owners[j].mo = true;break;
				case 'Tsunami': owners[j].dart = true; break;
				case 'TAO': owners[j].tao = true; break;
				case 'Oil and Gas Industry': owners[j].oil = true; break;
				case 'International Partners': owners[j].international = true; break;
				case 'IOOS Partners': owners[j].ioos = true; break;
				case 'NOS/CO-OPS': owners[j].nos = true; break;
				case 'NERRS': owners[j].nerrs = true; break;
			}
		if (station_data.station[i].status == 'E') {
			owners[j].recent = true;
		}
		*/
//			GDownloadUrl("/ndbcmapstations.xml", function(data, responseCode) {
/*
			if(data=="" || !(responseCode==200||responseCode==304) ) {
			myom.Clear();
				return;
			}

		var xml = GXml.parse(data);
		var stationsxml = new Array();
		if(xml.documentElement) {
			stationsxml = xml.documentElement.getElementsByTagName("station");
		} else {
			alert("Sorry!  Your browser does not support this application.");
			exit;
		}
		//var len = stationsxml.length;
*/
		var len = station_data.station.length;
		var programs = new Array();
		var deployed = reporting = 0;
//				var myStations = new Stations();
//				var psl = myStations.get_programs(stationsxml);
		var psl = ["All"];
		for( i=0 ; i<station_data.program.length; i++)
		{
			psl.push(station_data.program[i]);
		}

		for (var i=0;i<len;i++) {
			stations[i] = createMarker(
				station_data.station[i].id, //id
				station_data.station[i].name, //name
				station_data.owner[station_data.station[i].owner], //owner (relational)
				station_data.program[station_data.station[i].program], //program (relational)
				station_data.station[i].status, //status
				station_data.station[i].data, //data
				station_data.station[i].seq, //seq??
				station_data.station[i].lat, //latitude
				station_data.station[i].lon //longitude
				);
//			map.addOverlay(stations[i]);
			//myom.Set('<b>Loading station '+i+' of '+len+'<\/b>');
			if (status_R.checked && stations[i].mystatus != 'E') { stations[i].hide(); }
			if (stations[i].mystatus == 'E') {
				deployed++;
				if (stations[i].mydata == 'y') { reporting++; }
			}
//					programs[i]=stationsxml[i].getAttribute("pgm");
//					for (var j=0;j<owners.length;j++) {
//						if (owners[j].name == stationsxml[i].getAttribute("owner")) { break; }
//					}
			/*
			owners = station_data.owner;

			if (j >= owners.length) {
				owners[j] = {
					name:stationsxml[i].getAttribute("owner"),

					mo:false,
					dart:false,
					tao:false,
					oil:false,
					international:false,
					ioos:false,
					nos:false,
					nerrs:false,
					recent:false
				}
			}

			switch (stationsxml[i].getAttribute("pgm")) {
				case 'NDBC Meteorological/Ocean': owners[j].mo = true;break;
				case 'Tsunami': owners[j].dart = true; break;
				case 'TAO': owners[j].tao = true; break;
				case 'Oil and Gas Industry': owners[j].oil = true; break;
				case 'International Partners': owners[j].international = true; break;
				case 'IOOS Partners': owners[j].ioos = true; break;
				case 'NOS/CO-OPS': owners[j].nos = true; break;
				case 'NERRS': owners[j].nerrs = true; break;
			}
			*/

		}
		//mkrinc = setInterval("add_markers()",20);


//		checkDartEvents();

		//var pgm = pgmselect[pgmselect.selectedIndex].value;
		//if (! pgm) { pgm = 'All'; }
		var pgm = selected_programs;
		if (! pgm || pgm.length<1) { pgm = ['All']; }
		//var op = opselect[opselect.selectedIndex].value;
		var op = selected_options;
		if (! op || op.length < 1) { op = 'All'; }
		showTotals(op,pgm,deployed,reporting);
		owners.sort(sortbyname);
		//opselect.options.length = 0;
//				loadOwners('init',pgm);
		var typeopts = new Array();
		if (userpgm == 'NDBC Meteorological/Ocean') {
			//opselectlabel.innerHTML = 'Select Type to highlight: ';
			//var typeopts = new Array('All','C-MAN','Moored Buoys');
			typeopts.push("C-MAN");
			typeopts.push("Moored Buoys")
			for (var i=0;i<typeopts.length;i++) {
				//opselect.options[i] = new Option(typeopts[i],typeopts[i]);
				//if (typeopts[i].toLowerCase() == userop) { opselect.options[i].selected = true; }
			}
		} else {
			//opselectlabel.innerHTML = 'Select Operator to highlight: ';
			//opselect.options[0] = new Option('All','All');
			//if ('all' == userop) { opselect.options[0].selected = true; }
			if(!userop){selected_options = new Array()}
			//else if ('all' == userop || userop.length < 1 ) { selected_options = new Array() }
			for (i=0;i<owners.length;i++) {
				//opselect.options[i+1] = new Option(owners[i].name,owners[i].name);
				//if (owners[i].name.toLowerCase() == userop) { opselect.options[i+1].selected = true; }
				if (owners[i].name.toLowerCase() == userop) { /* not sure yet */ }
			}
		}
		/*
		pgmselect.options.length = 0;
		for (i=0;i<psl.length;i++) {
			pgmselect.options[i] = new Option(psl[i],psl[i]);
			if (psl == userpgm) { pgmselect.options[i].selected = true; }
		}
		*/

		changeDisplay('init');
		load_icons();
//		map.setZoom(map.getBoundsZoomLevel(bounds));
		map.savePosition();
		genLink();
		google.maps.Event.addListener(map, 'moveend', function(){
			genLink();
			//map.latlngoverlay();
		});
		google.maps.Event.addListener(map, 'maptypechanged', genLink);
		google.maps.Event.addListener(map,'mousemove',function(e){
			//curLatLong.style.top = m_y+"px";
			//curLatLong.style.left = m_x+"px";
			if(curLatLong) curLatLong.innerHTML = formatLat(Math.round(e.lat()*100)/100)+ ", "+ formatLon(Math.round(e.lng()*100)/100);
		});
		return;
//			});
	} else {
	  alert("Sorry, the Google Maps API is not compatible with this browser");
	}
	window.onunload=google.maps.Unload;
}

var evntImg = new Image();
evntImg.src="/images/maps/markers/tiny_tsunami_event_marker2.gif";
//evntImg.src="/images/maps/markers/zoomin.gif";
/*
function checkDartEvents() {
	google.maps.DownloadUrl("/dart/dart_events.xml", function(data, responseCode) {
		if(data=="" || !(responseCode==200||responseCode==304) ) {
			myom.Clear();
			return;
		}
		var xml = google.maps.Xml.parse(data);
		var itemsxml = new Array();
		if(xml.documentElement) {
			var eventsxml = xml.documentElement.getElementsByTagName("event");
			for (var i=0;i<eventsxml.length;i++) {
				var stn = eventsxml[i].getAttribute("station");
				for (var j=0;j<stations.length;j++) {
					if (stations[j].mystn == stn && eventsxml[i].getAttribute("datetime") != null) {
						//stations[j].setImage("/images/maps/markers/tiny_historical_marker.png");
						stations[j].setImage(evntImg.src);
						//alert(stations[j].getIcon());

						stations[j].myeventtime = eventsxml[i].getAttribute("datetime");
						dartevents['s'+stn] = eventsxml[i].getAttribute("datetime");

					}
				}
			}
		}
		myom.Clear();
	});
}
*/
function checkDartEvents() {

	if( typeof XMLHttpRequest == "undefined" )
	{
		XMLHttpRequest = function()
		{
			try { return new ActiveXObject("Msxml2.XMLHTTP.6.0") } catch(e) {}
			try { return new ActiveXObject("Msxml2.XMLHTTP.3.0") } catch(e) {}
			try { return new ActiveXObject("Msxml2.XMLHTTP") } catch(e) {}
			try { return new ActiveXObject("Microsoft.XMLHTTP") } catch(e) {}
			throw new Error( "This browser does not support XMLHttpRequest." )
		}
	}
	var request =  new XMLHttpRequest();
	request.open( "GET" , "/dart/dart_events.xml" , false) ;
	request.send( "" );
	var stn = new Array();
	var xml = google.maps.Xml.parse(request.responseText);
	var itemsxml = new Array();
	var stn = new Array();
	if(xml.documentElement) {
		var eventsxml = xml.documentElement.getElementsByTagName("event");
		for (var i=0;i<eventsxml.length;i++) {
			stn.push( eventsxml[i].getAttribute("station") );
			if (eventsxml[i].getAttribute("datetime") != null) {
				dartevents['s'+stn] = eventsxml[i].getAttribute("datetime");
			}
		}
	}
	event_dataaa = stn;
}
function populateInfoWindow(stn,stnpos,owner) {
	google.maps.DownloadUrl("/get_observation_as_xml.php?station="+stn, function(data, responseCode) {
		var html = null;
		if(data=="" || !(responseCode==200||responseCode==304) ) {
			html = '<strong>Station '+stn.toUpperCase()+'<br />'+owner+'<br />Location:<\/strong> '+formatLat(stnpos.lat())+' '+formatLon(stnpos.lng())+'<br />There are no recent (&lt; 8 hours) meteorological data for this station.<br .>Click <a href="/station_page.php?station='+stn+'" target="_blank">here<\/a> <img src="/images/new_window.png" width="16" height="16" alt="Opens in new window" title="Opens in new window" style="vertical-align:text-top" \/> - <a href="/station_history.php?station='+stn+'" target="_blank">View History<\/a> <img src="/images/new_window.png" width="16" height="16" alt="Opens in new window" title="Opens in new window" style="vertical-align:text-top" \/> for other data from this station.';
		} else {
			var xml = google.maps.Xml.parse(data);
			if(xml.documentElement) {
				var data = {datetime:null, name:null, lat:null, lon:null, winddir:null, windspeed:null, windgust:null, waveht:null, domperiod:null, meanwavedir:null, pressure:null, airtemp:null, watertemp:null, dewpoint:null, tide:null, visibility:null};
				data['id'] = xml.documentElement.getAttribute('id');
				data['name'] = xml.documentElement.getAttribute('name');
				data['lat'] = xml.documentElement.getAttribute('lat');
				data['lon'] = xml.documentElement.getAttribute('lon');
				var items=xml.documentElement.childNodes;
				for (var i=0;i<items.length;i++) {
					if (items[i].nodeType == 1) {
						switch (items[i].nodeName) {
							case 'datetime':
								data[items[i].nodeName] = parseiso8601(items[i].childNodes[0].nodeValue);
								break;
							case 'winddir':
								var dir = deg2dir(items[i].childNodes[0].nodeValue);
								if (dir != null) {
									data[items[i].nodeName] = dir +' ('+items[i].childNodes[0].nodeValue+'&#176;)';
								} else {
									data[items[i].nodeName] = items[i].childNodes[0].nodeValue+'&#176;';
								}
								break;
							case 'meanwavedir':
								var dir = deg2dir(items[i].childNodes[0].nodeValue);
								if (dir != null) {
									data[items[i].nodeName] = dir +' ('+items[i].childNodes[0].nodeValue+'&#176;)';
								} else {
									data[items[i].nodeName] = items[i].childNodes[0].nodeValue+'&#176;';
								}
								break;
							case 'pressure':
								var uom = items[i].getAttribute('uom');
								if (uom != null) {
									data[items[i].nodeName] = items[i].childNodes[0].nodeValue + ' ' +uom;
								} else {
									data[items[i].nodeName] = items[i].childNodes[0].nodeValue;
								}
								var ptend = items[i].getAttribute('tendency');
								if (ptend != null) {
									data[items[i].nodeName] += ' and ' + ptend;
								}
								break;
							default:
								var uom = items[i].getAttribute('uom');
								if (uom != null) {
									data[items[i].nodeName] = items[i].childNodes[0].nodeValue + ' ' +uom;
								} else {
									data[items[i].nodeName] = items[i].childNodes[0].nodeValue;
								}
						}
					}
				}
				var now = new Date();
				var cutoff = new Date(Date.UTC(now.getUTCFullYear(),now.getUTCMonth(),now.getUTCDate(),now.getUTCHours(),now.getUTCMinutes(),now.getUTCSeconds())-8*60*60*1000);
				if (data['id'] != null && data['datetime'] != null && data['lat'] != null && data['lon'] != null && data['datetime'] >= cutoff) {
					var title = '<strong>Station '+data['id'].toUpperCase()+'<br />'+owner+'<br />Location:<\/strong> '+formatLat(data['lat'])+' '+formatLon(data['lon'])+'<br /><strong>Conditions as of:<br />'+data['datetime'].toUTCString().replace("GMT","UTC")+'<\/strong><br />';
					var body = '';
					var winds = '';
					if (data['winddir'] != null) { winds += data['winddir']; }
					if (data['windspeed'] != null) { winds += ' at '+data['windspeed']; }
					if (data['windgust'] != null) { winds += ' gusting to '+data['windgust']; }
					if (winds) {
						body += '<strong>Winds:<\/strong> '+winds+'<br />';
					}
					if (data['waveht'] != null) { body += '<strong>Significant Wave Height:<\/strong> '+data['waveht']+'<br />'; }
					if (data['domperiod'] != null) { body += '<strong>Dominant Wave Period:<\/strong> '+data['domperiod']+'<br />'; }
					if (data['meanwavedir'] != null) { body += '<strong>Mean Wave Direction:<\/strong> '+data['meanwavedir']+'<br />'; }
					if (data['pressure'] != null) { body += '<strong>Atmospheric Pressure:<\/strong> '+data['pressure']+'<br />'; }
					if (data['airtemp'] != null) { body += '<strong>Air Temperature:<\/strong> '+data['airtemp']+'<br />'; }
					if (data['dewpoint'] != null) { body += '<strong>Dew Point:<\/strong> '+data['dewpoint']+'<br />'; }
					if (data['watertemp'] != null) { body += '<strong>Water Temperature:<\/strong> '+data['watertemp']+'<br />'; }
					if (data['visibility'] != null) { body += '<strong>Visibility:<\/strong> '+data['visibility']+'<br />'; }
					if (data['tide'] != null) { body += '<strong>Tide:<\/strong> '+data['tide']+'<br />'; }
					html = title+'<div style="max-height:120px;max-width:300px;overflow:auto;">'+body+'<\/div><a href="/station_page.php?station='+stn+'" target="_blank">View Details<\/a> <img src="/images/new_window.png" width="16" height="16" alt="Opens in new window" title="Opens in new window" style="vertical-align:text-top" \/> - <a href="/station_history.php?station='+stn+'" target="_blank">View History<\/a> <img src="/images/new_window.png" width="16" height="16" alt="Opens in new window" title="Opens in new window" style="vertical-align:text-top" \/>';
				} else {
					html = '<strong>Station '+stn.toUpperCase()+'<br />'+owner+'<br />Location:<\/strong> '+formatLat(stnpos.lat())+' '+formatLon(stnpos.lng())+'<br />There are no recent (&lt; 8 hours) meteorological data for this station.<br .>Click <a href="/station_page.php?station='+stn+'" target="_blank">here<\/a> <img src="/images/new_window.png" width="16" height="16" alt="Opens in new window" title="Opens in new window" style="vertical-align:text-top" \/> for other data from this station.';
				}
			} else {
				html = "Sorry!  Your browser does not support this application.";
				return;
			}
		}
		if (html != null) { map.openInfoWindowHtml(stnpos,html); }
	});
}

function formatLat(lat) {
	if (isNaN(lat)) { return lat; }
	if (lat < 0) { return Math.abs(lat).toString()+'S'; }
	if (lat > 0) { return lat.toString()+'N'; }
	return lat.toString();
}

function formatLon(lon) {
	if (isNaN(lon)) { return lon; }
	if (lon < 0) { return Math.abs(lon).toString()+'W'; }
	if (lon > 0) { return lon.toString()+'E'; }
	return lon.toString();
}

function parseiso8601(isodate) {
	var p = /^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})UTC$/;
	var m = isodate.match(p);
	if (m == null || m.length != 7) { return null; }
	var d = new Date();
	d.setUTCFullYear(m[1]);
	d.setUTCMonth(m[2]-1);
	d.setUTCDate(m[3]);
	d.setUTCHours(m[4]);
	d.setUTCMinutes(m[5]);
	d.setUTCSeconds(m[6]);
	d.setUTCMilliseconds(0);
	return d;
}

function deg2dir(deg){
	if (isNaN(deg)|| deg < 0 || deg > 360) { return null;}
	dir = new Array('N','NNE','NE','ENE','E','ESE','SE','SSE','S','SSW','SW','WSW','W','WNW','NW','NNW','N');
	return dir[Math.round(deg/22.5)];
}

function changeDisplay(mode) {
	var deployed = reporting = 0;
	//var pgm = pgmselect[pgmselect.selectedIndex].value;
	var pgm = selected_programs
	if (! pgm || pgm.length < 1) { pgm = ['All']; }
	//var op = opselect[opselect.selectedIndex].value;
	var op = selected_options;
	if (! op || op.length < 1 ) { op = ['All']; }
	if (mode == 'pgm') { op = ['All']; }
	var status = status_R.checked?'R':'H';
	var bounds = new google.maps.LatLngBounds();
	for (i=0;i<station_data.station.length;i++) {
		//var typeowner = stations[i].myowner;
		var typeowner = station_data.owner[station_data.station[i].owner]; //relational
		var typeprogram = station_data.program[station_data.station[i].program];
		var stationtype = station_data.station[i].type
		//if (pgm == 'NDBC Meteorological/Ocean') {
		//if (array_match(pgm,'NDBC Meteorological/Ocean')) {

		if (typeprogram == 'NDBC Meteorological/Ocean') {
			//if (isNaN(stations[i].mystn))
			if (stationtype.toLowerCase()=="fixed")
			{
				var tmptypeowner = new Array();
				tmptypeowner[0]=typeowner;
				tmptypeowner[1]='C-MAN';
				typeowner = tmptypeowner
				//typeowner = 'C-MAN';
			}
			else
			{
				var tmptypeowner = new Array();
				tmptypeowner[0]=typeowner;
				tmptypeowner[1]='Moored Buoys';
				typeowner = tmptypeowner
				//typeowner = 'Moored Buoys';
			}
		}



		//if ((pgm == 'All' || stations[i].mypgm == pgm) && (op == 'All' || typeowner == op)
		if ((pgm[0] == 'All' || array_match(pgm,stations[i].mypgm ) ) && (op[0] == 'All' || array_match(op,typeowner))
			&& ((status == 'R' && stations[i].mystatus == 'E') || (status != 'R'))) {
			stations[i].show();
			if(display_labels&&mylabels){
				//stations[i].setLabelVisibility(true);
				mylabels[i].show()
			}else if(mylabels){
				mylabels[i].hide()
				//stations[i].setLabelVisibility(false);
			}
			//stations[i].labelShow();
			bounds.extend(stations[i].getLatLng());
			if (stations[i].mystatus == 'E') {
				deployed++;
				if (stations[i].mydata == 'y') { reporting++; }
			}
		} else {
			stations[i].hide();
			if(mylabels){
				mylabels[i].hide();
			}
		}
	}

	var sw = bounds.getSouthWest();
	bounds.extend(new google.maps.LatLng(sw.lat()-1,sw.lng()-1));
	var ne = bounds.getNorthEast();
	bounds.extend(new google.maps.LatLng(ne.lat()+1,ne.lng()+1));
	if (!zoomlock && ( mode == 'pgm' || mode =='op' ) ) { map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds), map.getCurrentMapType()); }
	if ( mode == 'pgm' || mode == 'init' || mode== 'status' ) { loadOwners(mode,pgm); }
	if (pgm == 'Tsunami') {
		tsunamilinks.style.display = 'block';
	} else {
		tsunamilinks.style.display = 'none';
	}
	if (status == 'H') {
		historicallinks.style.display = 'block';
	} else {
		historicallinks.style.display = 'none';
	}
	showTotals(op,pgm,deployed,reporting);
	genLink();
}

function showTotals(op,pgm,deployed,reporting) {
	if (ndbcmaptotals) {
		ndbcmaptotals.innerHTML =
			deployed.toString()+(op=='All'?'':' '+op)+(pgm=='All'?'':' '+pgm)+' stations deployed<br />'+
			reporting.toString()+' have reported in the past 8 hours';
	}
}

function loadOwners(mode,pgm) {
	var status = status_R.checked?'R':'H';
	var opselect = null;
	/*
	if (document.getElementById) { opselect = document.getElementById('opselect'); }
	if (!opselect) { return; }
	var op = opselect[opselect.selectedIndex].value;
	opselect.options.length = 0;
	*/
	selected_options = new Array();
	// Kludge to handle "C-MAN" and "Moored Buoys" types in place of operator.
	//if (pgm == 'NDBC Meteorological/Ocean') {

	//opselect.options[opselect.options.length] = new Option('All','All');
	var typeopts = new Array();
	for(zz=0;zz<pgm.length;zz++){
		if (pgm[zz] =='NDBC Meteorological/Ocean') {
			//opselectlabel.innerHTML = 'Select Type to highlight: ';
			//var typeopts = new Array('C-MAN','Moored Buoys');
			typeopts.push('C-MAN');
			typeopts.push('Moored Buoys');
			/*
			for (var i=0;i<typeopts.length;i++) {
				opselect.options[i] = new Option(typeopts[i],typeopts[i]);
				if (mode != 'pgm' && typeopts[i] == op) { opselect.options[i].selected = true; }
			}
			*/
		} else if (pgm[0]!=='All' && pgm !==''){
			//opselectlabel.innerHTML = 'Select Operator to highlight: ';
			//opselect.options[opselect.options.length] = new Option('All','All');
			//if (mode == 'pgm' || op == 'All') { opselect.options[opselect.options.length-1].selected = true; }
			for (var i=0;i<owners.length;i++) {
				//
				//eval("var chk = owners[i]."+pgm[zz].replace(/[^A-za-z0-9]/g,""));
				var chk = null;

				eval("chk = owners[i]."+pgm[zz].replace(/[^A-za-z0-9]/g,""));

				//if(chk || pgm=="All")
				if(chk || pgm.length==0)
				{
					if (status == 'R' && !owners[i].recent) { continue; }
					//opselect.options[opselect.options.length] = new Option(owners[i].name,owners[i].name);
					array_remove(typeopts,owners[i].name);
					typeopts.push(owners[i].name);
					/*
					if (mode != 'pgm' && op == owners[i].name) {
						//opselect.options[opselect.options.length-1].selected = true;
					}
					*/
				}
			}

		}


		//document.getElementById("owner_tab").innerHTML=typeopts.toString()+ "<br /><br />"+selected_options.toString();
	}
	if(typeopts.length<1){
		typeopts = station_data.owner;
	}
	create_options(typeopts);
	//if (opselect.options.length == 2) { opselect.remove(0); }  // If only one onwer, remove 'All' option
}

function genLink() {
	if (ndbcmaplink && map) {
		var lat = map.getCenter().lat().toFixed(6);
		var lon = map.getCenter().lng().toFixed(6);
		var zoom = map.getZoom();
		var type = map.getCurrentMapType().getUrlArg();
		var status = status_R.checked?'r':'h';
		//var pgm = encodeURIComponent(pgmselect[pgmselect.selectedIndex].value);
		var pgm = selected_programs.join("|");
		//var op = encodeURIComponent(opselect[opselect.selectedIndex].value);
		var op = selected_options.join("|");
		var ls = display_labels;
		ndbcmaplink.href = location.pathname+'?lat='+lat+'&lon='+lon+'&zoom='+zoom+'&type='+type+'&status='+status+'&pgm='+pgm+'&op='+op+'&ls='+ls;
	}
}



function openHelp(doc,winname)
{
	var helpwin;
	 if (window.showModalDialog)
	{
		window.showModalDialog(doc,winname,"dialogWidth:820px;dialogHeight:600px;center:yes");
	}
	else
	{
		helpwin = window.open(doc,winname,'toolbar=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,modal=yes,height=600,width=820');
		helpwin.moveTo(0,0);
	}
	//window.open(doc,winname,'width=820,height=600,toolbar=o,resizeable=1,scrollbars=1');
}

function array_match(arr,term)
{
	var n = false;
	if( arr && isArray(term) )
	{
		for(i3t=0;i3t<term.length;i3t++)
		{
			for(i2t=0;i2t<arr.length;i2t++)
			{
				if(arr[i2t].toLowerCase() == term[i3t].toLowerCase())
				{
					n=true;
					break;
				}
			}
		}
		return n;
	}
	else if(arr){
		for(i2t=0;i2t<arr.length;i2t++)
		{
			if(arr[i2t].toLowerCase() == term.toLowerCase())
			{
				n=true;
				break;
			}
		}
		return n;
	}
}
function isArray(obj) {
   if (obj.constructor.toString().indexOf("Array") == -1)
      return false;
   else
      return true;
}
function array_remove(arr,term)
{
	var n = false;
	if(arr)
	{
		for(i=(arr.length-1);i>=0;i--)
		{
			if(arr[i].toLowerCase() == term.toLowerCase())
			{
				n=true;
				arr.splice(i,1);
			}
		}
	}
	return n;
}


// downloads json data and returns object
function get_data()
{
	if( typeof XMLHttpRequest == "undefined" )
	{
		XMLHttpRequest = function()
		{
			try { return new ActiveXObject("Msxml2.XMLHTTP.6.0") } catch(e) {}
			try { return new ActiveXObject("Msxml2.XMLHTTP.3.0") } catch(e) {}
			try { return new ActiveXObject("Msxml2.XMLHTTP") } catch(e) {}
			try { return new ActiveXObject("Microsoft.XMLHTTP") } catch(e) {}
			throw new Error( "This browser does not support XMLHttpRequest." )
		}
	}
	var request =  new XMLHttpRequest();
	request.open( "GET" , "ndbcmapstations.json" , false) ;
	request.send( "" );
	eval( "var n = " + request.responseText );
	return n;
}

function sortbyname(a,b) {
	if (a.name.toLowerCase() > b.name.toLowerCase()) {
		return 1;
	} else if (a.name.toLowerCase() < b.name.toLowerCase()) {
		return -1;
	} else {
		return 0;
	}
}

function sortbylc(a,b) {
	if (a.toLowerCase() > b.toLowerCase()) {
		return 1;
	} else if (a.toLowerCase() < b.toLowerCase()) {
		return -1;
	} else {
		return 0;
	}
}

function createLabels(){
	mylabels=new Array();

	for( hogie=0; hogie < station_data.station.length; hogie++){
		var point = new google.maps.LatLng(station_data.station[hogie].lat , station_data.station[hogie].lon)
		var name = station_data.station[hogie].id.toUpperCase()
		mylabels[hogie] = new Label( point , name);
		map.addOverlay(mylabels[hogie]);
	}
}
function makeTop (marker,b) {
        return google.maps.Overlay.getZIndex(marker.getPoint().lat()) + 90000000;
 }
function createMarker(stn,stnname,owner,pgm,status,data,seq,lat,lon) {
	var stnpos = new google.maps.LatLng(lat,lon);
	bounds.extend(stnpos);
	var marker = null;
	var title = stn.toUpperCase();
	if (stnname) { title += ' - '+stnname; }
	if (status == 'E') {
		if (data == 'y') {
			//marker = new google.maps.Marker(stnpos,{title:title,icon:stnicon});
			if(array_match(event_dataaa,stn)){
				//marker = new LabeledMarker(stnpos,{title:title,icon:tsunamicon,labelText:stn,labelOffset:new google.maps.Size(7,-7),labelClass:"station_label"});
				var setIndex = google.maps.Overlay.getZIndex(stnpos.lat()) + 9000000;
				marker = new google.maps.Marker(stnpos,{title:title,icon:tsunamicon,zIndexProcess:makeTop});
				//marker.label = strtoupper(stn);
			}else{
				//marker = new LabeledMarker(stnpos,{title:title,icon:stnicon,labelText:stn,labelOffset:new google.maps.Size(7,-7),labelClass:"station_label"});
				marker = new google.maps.Marker(stnpos,{title:title,icon:stnicon});
				//marker = new google.maps.Marker(stnpos,{title:title,icon:tsunamicon});
				//marker.label = strtoupper(stn);
			}
		} else {
			marker = new google.maps.Marker(stnpos,{title:title,icon:badstnicon});
			//marker.label = strtoupper(stn);
			//marker = new LabeledMarker(stnpos,{title:title,icon:badstnicon,labelText:stn,labelOffset:new google.maps.Size(7,-7),labelClass:"station_label"});
		}
	} else {
		marker = new google.maps.Marker(stnpos,{title:title,icon:histstnicon});
		//marker.label = strtoupper(stn);
		//marker = new LabeledMarker(stnpos,{title:title,icon:histstnicon,labelText:stn,labelOffset:new google.maps.Size(7,-7),labelClass:"station_label"});
	}
	google.maps.Event.addListener(marker, "click", function() {
		var html = null;
		if (pgm == 'TAO' && seq != null) {
			html = '<strong>Station '+stn.toUpperCase()+'<br />'+owner+'<br />Location:<\/strong> '+formatLat(lat)+' '+formatLon(lon)+'<br /><a href="http://tao.noaa.gov/refreshed/site.php?site='+seq+'" target="_blank">View Details<\/a> <img src="/images/new_window.png" width="16" height="16" alt="Opens in new window" title="Opens in new window" style="vertical-align:text-top" \/>';
		} else if (pgm == 'Tsunami') {
			html = '<img src="/plot_dart.php?station='+stn+'&uom=M&width=400&height=220" height="220" width="400" alt="Five-day plot of water level at '+stn+'"/><br />';
			if (dartevents['s'+stn]) {
				html += '<a href="/station_page.php?station='+stn+'&type=2&seriestime='+dartevents['s'+stn]+'" target="_blank">View Event Details<\/a> <img src="/images/new_window.png" width="16" height="16" alt="Opens in new window" title="Opens in new window" style="vertical-align:text-top" \/>';
			} else {
				html += '<a href="/station_page.php?station='+stn+'" target="_blank">View Details<\/a> <img src="/images/new_window.png" width="16" height="16" alt="Opens in new window" title="Opens in new window" style="vertical-align:text-top" \/>';
			}
		} else {
			populateInfoWindow(stn,stnpos,owner);
		}
		if (html != null) { map.openInfoWindowHtml(stnpos,html); }
	});
	marker.myowner = owner;
	marker.mypgm = pgm;
	marker.mystatus = status;
	marker.mydata = data;
	marker.myseq = seq;
	marker.mystn = stn;
	marker.myeventtime = null;
	return marker;
}


function generate_program_tab()
{
	var program_tab = document.getElementById("program_tab");

	var intab = document.createElement("div");
	intab.setAttribute("id","program_display_tab");

	for(i=0;i<station_data.program.length;i++)
	{
		var newprog = document.createElement("div");
		newprog.setAttribute("id",station_data.program[i]);
		newprog.style.backgroundColor="white";
		newprog.style.display="block";
		newprog.style.cursor="pointer"



		var chkbx = document.createElement("input");
		chkbx.setAttribute("type","checkbox");
		newprog.onclick=function(){
			array_remove(selected_programs,this.id);
			if (this.style.backgroundColor=="white"||this.style.backgroundColor=="#ffffff")
			{
				selected_programs.push(this.id);
				selected_programs.sort();
				this.style.backgroundColor="#c0c0c0";
				this.childNodes[0].checked=true;
			}
			else{
				this.style.backgroundColor="white";
				this.childNodes[0].checked=false;
			}
			changeDisplay('pgm');
		}
		newprog.appendChild(chkbx);
		newprog.appendChild(document.createTextNode(station_data.program[i]));
		intab.appendChild(newprog);
		if(userpgm){
			if(array_match(userpgm,station_data.program[i])){
				selected_programs.push(station_data.program[i]);
				selected_programs.sort();
				newprog.style.backgroundColor="#c0c0c0";
				newprog.childNodes[0].checked=true;
			}
		}
	}
	program_tab.appendChild(intab);
	userpgm=null;
}

function create_options(arr)
{
	arr.sort(sortbylc);
	document.getElementById("owner_tab").innerHTML='';

	for(ilo = 0; ilo < arr.length; ilo++)
	{
		var newopt = document.createElement("div");
		newopt.setAttribute("id",arr[ilo]);
		newopt.style.backgroundColor="white";
		//var label = document.createElement("label");
		newopt.style.display="block";
		newopt.style.cursor="pointer";
		var chkbx = document.createElement("input");
		chkbx.setAttribute("type","checkbox");
		/*
		if(array_match(selected_options,arr[ilo])){
			alert(arr[ilo]);
			chkbx.checked=true;
			newopt.style.backgroundColor="#c0c0c0";
		}
		*/

		newopt.onclick=function(){
			array_remove(selected_options,this.id);
			if (this.style.backgroundColor=="white"||this.style.backgroundColor=="#ffffff")
			{
				selected_options.push(this.id);
				selected_options.sort();
				this.style.backgroundColor="#c0c0c0";
				this.childNodes[0].checked=true;
			}
			else{
				this.style.backgroundColor="white";
				this.childNodes[0].checked=false;
			}
			changeDisplay('op');
		}
		newopt.appendChild(chkbx);
		newopt.appendChild(document.createTextNode(arr[ilo]));
		document.getElementById("owner_tab").appendChild(newopt);
		if(userop){
			if(array_match(userop,arr[ilo])){
				selected_options.push(arr[ilo]);
				selected_options.sort();
				newopt.style.backgroundColor="#c0c0c0";
				newopt.childNodes[0].checked=true;
				changeDisplay("op");
			}
		}
	}
	userop=null;
}
// incremental marker loader
var nxt_marker = 0;
var mkrinc =150;
function load_icons()
{

	if(nxt_marker*mkrinc<stations.length)
	{
		for(mj = nxt_marker*mkrinc; mj < (nxt_marker+1)*mkrinc && mj < stations.length; mj++)
		{
			map.addOverlay(stations[mj]);
			if (status_R.checked && stations[mj].mystatus != 'E') { stations[mj].hide(); }
			if( selected_programs.length < 1 && selected_options.length > 0 ){
				if(!array_match(selected_options, station_data.owner[station_data.station[mj].owner]) ){
					stations[mj].hide();
				}
			}else if( selected_programs.length > 0 && !array_match(selected_programs,station_data.program[station_data.station[mj].program])){
				stations[mj].hide();
			}else if( array_match(selected_programs,"NDBC Meteorological/Ocean") && station_data.program[station_data.station[mj].program] =="NDBC Meteorological/Ocean" ){
					if(array_match(selected_options,"Moored Buoys")||array_match(selected_options,"C-MAN")){
						if(array_match(selected_options,"Moored Buoys")&&array_match(selected_options,"C-MAN")){/*do nothing*/}
						else if( array_match(selected_options,"Moored Buoys") && !array_match(selected_options,"C-MAN") && isNaN(station_data.station[mj].id) ){
							stations[mj].hide();
						}
						else if( !array_match(selected_options,"Moored Buoys") && array_match(selected_options,"C-MAN") && !isNaN(station_data.station[mj].id) ){
							stations[mj].hide();
						}
					}else if( selected_programs.length > 1 && !array_match(selected_options,"Moored Buoys")&&!array_match(selected_options,"C-MAN") && selected_options.length>0){
						stations[mj].hide();
					}
			}else if( selected_programs.length > 0 && array_match(selected_programs, station_data.program[station_data.station[mj].program]) && selected_options.length > 0 && !array_match(selected_options, station_data.owner[station_data.station[mj].owner])){
				stations[mj].hide();
			}
			var getpercent = ((nxt_marker+1) / Math.ceil(stations.length/mkrinc))*100
			myom.Set('<div style="width:'+getpercent+'%;background-color:blue;height:100%;">&nbsp;</div>');
		}
		setTimeout('load_icons()',1);
	}else{
		myom.Clear();
		//checkDartEvents();
		//changeDisplay('op');
	}
	nxt_marker++;
}

window.onload=initMap;

//window.onunload=google.maps.Unload;
//]]>
//-->
