// ***************************************************************************
// *  startup.js
// *
// *  Copyright  2007  Larry Moore
// *  larmoor@gmail.com
// ****************************************************************************/
//
//
//   This program is free software; you can redistribute it and/or modify
//   it under the terms of the GNU General Public License as published by
//   the Free Software Foundation; either version 2 of the License, or
//   (at your option) any later version.
// 
//   This program is distributed in the hope that it will be useful,
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//   GNU General Public License for more details.
// 
//   You should have received a copy of the GNU General Public License
//   along with this program.  The GPL is available at http://www.gnu.org, 
//   or by writing to the Free Software Foundation, Inc., 59 Temple Place - 
//   Suite 330, Boston, MA 02111-1307, USA.
//
//
// This module initializes the USNG application, and manages the size of the map window and associated
//    information window.
//
// Significant parts of this module are borrowed from a Google mashup by Matthew Somerville at
//     http://traintimes.org.uk/map/.  This code is responsible for the overall design of the USNG application.

/*var zonelinecolor = "#ff0000"
var zonelinewidth = 5
var zonelineopacity = .40

var k100_linecolor = "#0000ff"
var k100_linewidth = 3
var k100_lineopacity = .40

var k1_linecolor = "#000000"
var k1_linewidth = 1
var k1_lineopacity = 1

var usngmap = null;
var marker_point;
var coords
var google_map



var currview = null    // object that models the current viewport
var lines_ = null      // object that contains zone lines
var lines100k = null
var lines1k = null*/

var user_startzoom
var user_startusng
var user_startlat
var user_startlng
var user_maptype
var scale_factor

var layers = {
	'storm_reports':
	{'url': 'http://wdssii.nssl.noaa.gov/geotiff_new/spcStormLogs.kmz',
	'name': 'SPC Storm Reports', 'visible': true,
	'hyper': 'http://www.spc.noaa.gov/climo/'},		
	
	'storm_tracks1':
	{'url': 'http://www.floridadisaster.org/gis/kml/data/four.kmz',
	'name': 'Tropical Storm Claudette', 'visible': true,
	'hyper': 'http://www.nhc.noaa.gov/graphics_at4.shtml?5-daynl#contents'},

	/*'southeast_radar':
	{'url': 'http://www.floridadisaster.org/gis/kml/data/southeastradar.kmz',
	'name': 'Southeast Radar', 'visible': false,
	'hyper': 'http://weather.noaa.gov/weather/FL_cc_us.html'},*/
	
	/*'dof_fires_over_100ac':
	{'url': 'http://cummink07.googlepages.com/Wildfires_Over100.kml',
	'name': 'FDOF - Fires over 100 acres', 'visible': true,
	'hyper': 'http://www.fl-dof.com/wildfire'}, */
	
	'nws_watches_warnings':
	{'url': 'http://www.srh.noaa.gov/data/radar/poly.kml',
	'name': 'Watches and Warnings', 'visible': true,
	'hyper': 'http://www.nws.noaa.gov/alerts/fl.html'}
	};

function load() {
	if (GBrowserIsCompatible()) {
        //switchtoSearch();
		//Update.mapSize();
		//GEvent.bindDom(window,"resize",this,this.Update.mapSize);
		usngmap = new GMap2(document.getElementById('map'),{draggableCursor: 'crosshair', draggingCursor: 'pointer'}  );
                usngmap.addControl(new GLargeMapControl());
		cm_getJSON();
		//addJSONtoLayerList();
		usngmap.addControl(new GMapTypeControl());
//		usngmap.addControl(new GOverviewMapControl());
		usngmap.addControl(new GScaleControl());
        //usngmap.zoneon = false;    // flag to tell if utm zones should be displayed
        //usngmap.grid100kon = false;
        //usngmap.grid1kon=false;
        //showCoordinates();
        //addClickListener();
        //addUSNGlistener();
        //addZoomlistener();
        //addPanlistener();
        //document.getElementById("info").innerHTML = Info.VisibleText + Info.JSONLayerText + Info.WWALayerText
		readStartParameters();
        //GridOptions.Show(3, scale_factor)
		
		//add multiple layers
		for (var layer in layers) {
			//addLayer(layer, (layers[layer].name));
			var visible = layers[layer].visible
			if (visible == true) {
				//document.getElementById(layer).checked = true;
				toggleGeoXml(layer, true);
			} else {
				//document.getElementById(layer).checked = false;
				toggleGeoXml(layer, false);			
			}
		}
		
		initializeMap();
        //currview = new usngviewport(usngmap)  // initial instance of the viewport, with utm zones
	}
}


// add listener to continuously update usng coordinate output
/*function addUSNGlistener() { 
    GEvent.addListener(usngmap, 'mouseout', function(point) {
        blankCoordinates();
    });
    GEvent.addListener(usngmap, 'mousemove', function(point) {
        updateCoordinates(point.lng().toFixed(4), point.lat().toFixed(4));
    });
}*/

// add listener to detect change in zoom level
function addZoomlistener() {
   GEvent.addListener(usngmap,'zoomend', function(oldzoom,newzoom) {
        //GridOptions.Show(oldzoom, newzoom)
   });
}

// add listener to detect pan
function addPanlistener() {
   GEvent.addListener(usngmap,'moveend', function() {
        usngmap.checkResize()
        /*currview = new usngviewport(usngmap)
        if (usngmap.zoneon == true) {
           usngmap.removeOverlay(lines_)
           lines_ = new usngzonelines(currview,zonelinecolor,usngmap.getZoom(),zonelineopacity)
           usngmap.addOverlay(lines_)
           lines_.zonedraw()
           if (usngmap.getZoom() < 10 || usngmap.grid100kon==false) { 
              lines_.zonemarkerdraw()
           }
        }
        if (usngmap.grid100kon == true) {
           usngmap.removeOverlay(lines100k)
           lines100k = new grid100klines(currview,k100_linecolor,k100_linewidth,k100_lineopacity)
           usngmap.addOverlay(lines100k)
        }
        if (usngmap.grid1kon == true) {
           usngmap.removeOverlay(lines1k)
           lines1k = new grid1klines(currview,k1_linecolor,k1_linewidth,k1_lineopacity)
           usngmap.addOverlay(lines1k)
        }*/
   });
}

///////////////////// 'toggle' functions -- called when checkbox is clicked by user //////////////

// response to check box that allows user to turn zone lines on and off
/*function toggleZoneDisp(thismap) {
   if (thismap.zoneon == false) { 
        thismap.zoneon=true; 
        currview = new usngviewport(thismap)
        lines_ = new usngzonelines(currview,zonelinecolor,usngmap.getZoom(),zonelineopacity)
        thismap.addOverlay(lines_)
        lines_.zonedraw()
        if (usngmap.getZoom() < 10 || usngmap.grid100kon==false) { 
           lines_.zonemarkerdraw()
        }
   }
   else { 
       thismap.removeOverlay(lines_)   
       thismap.zoneon = false; 
   }
 //   alert("in toggleZoneDisp, property zoneon="+map.zoneon)
}

// 100,000-meter grid squares
function toggle100kDisp(thismap) {
   if (thismap.grid100kon == false) {
       thismap.grid100kon = true;
       lines100k = new grid100klines(currview,k100_linecolor,k100_linewidth,k100_lineopacity)
       thismap.addOverlay(lines100k)
       if (usngmap.getZoom()>=10 && usngmap.zoneon==true) { 
           lines_.zonemarkerremove()
        }
   }
   else {
       thismap.removeOverlay(lines100k)
       thismap.grid100kon = false
       if (usngmap.getZoom()>=10 && usngmap.zoneon==true) { 
           lines_.zonemarkerdraw()
        }
   }
}

// 1,000-meter grid
function toggle1kDisp(thismap) {
   if (thismap.grid1kon == false) {
       thismap.grid1kon = true;
       lines1k = new grid1klines(currview,k1_linecolor,k1_linewidth,k1_lineopacity)
       thismap.addOverlay(lines1k)
    }
   else {
       thismap.removeOverlay(lines1k)
       thismap.grid1kon = false
    }
}*/

//////////////// end toggle functions /////////////////////////////////////////


///////////////  begin layers list functions ////////////////////////////////

/*function addJSONtoLayerList () {
	var layerTR = document.createElement("tr");
	var nameTD = document.createElement("td");
	var name = "Response";
	layerTR.appendChild(nameTD);
}*/

/*function addLayer (id) {
	var layerTR = document.createElement("tr");
	var inputTD = document.createElement("td");
	var input = document.createElement("input");
	input.type = "checkbox";
	input.id = id;
	input.onclick = function () { toggleGeoXml(this.id, this.checked) };
	inputTD.appendChild(input);
	
	var nameTD = document.createElement("td");
	var nameA = document.createElement("a");
	nameA.href = layers[id].hyper;
	nameA.target =  "_blank"
	var name = document.createTextNode(layers[id].name);
	nameA.appendChild(name);
	nameTD.appendChild(nameA);
	
	layerTR.appendChild(inputTD);
	layerTR.appendChild(nameTD);
	document.getElementById("layerslist").appendChild(layerTR);
}*/

function toggleGeoXml(id, checked) {
	if (checked) {
		var geoXml = new GGeoXml(layers[id].url);
		layers[id].geoXml = geoXml;
		usngmap.addOverlay(geoXml);
	} else if (layers[id].geoXml) {
		usngmap.removeOverlay(layers[id].geoXml);
	}
}

///////////////  end layers list functions ////////////////////////////////


/*function addClickListener() {
      // click on map to get lat/long
      GEvent.addListener(usngmap, "click", function(overlay, point) {
        if (overlay) { // user clicked on a marker or balloon...do nothing 
             return 
        }
        // ??var marker_temp = new GMarker(point) 
        // create a string to display various coordinate values
        marker_point=point
        var latLngStr = buildCoordString(point) 
             + '<input type="button" value="Set a marker" onclick=setMarker()>'   

// comment out next line except when running on a USGS system and enabling map download functionality
//          + '<br><input type="button" value="Download GeoPDF USGS map" onclick=downloadUSGSmap()>'

        usngmap.openInfoWindowHtml(point,latLngStr)
      });
}

// set up on-map USNG coordinate display
function showCoordinates() {
	coords = document.getElementById("_coords");
	coords.style.visibility = 'visible';
}

// when cursor moves outside map, don't display any coordinates
function blankCoordinates() {
    var coords = document.getElementById("_coords");
    coords.innerHTML =  "- - - - -"+"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+ "- - - - -";
}

// when cursor movement is detected, update coordinate readout	
function updateCoordinates(lon, lat) {
    var coords = document.getElementById("_coords");

    if (lat<=84 && lat>=-80) {
	coords.innerHTML =  LLtoUSNG(lat,lon,4)+"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+lat2dm(lat)+", "+lon2dm(lon);
    }
    else {
	coords.innerHTML =  "[ undefined ]"+"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+lat2dm(lat)+", "+lon2dm(lon);
   }
}	*/




// in response to button click in info window, set a marker
function setMarker()
{
   //usngmap.closeInfoWindow()
   displayCoordMarker(marker_point.lat(),marker_point.lng(),"","")
}


// Updates from server, site, and periodically
 Update = {
    mapSize: function() {
	var m = document.getElementById('map');
	//var i = document.getElementById('info');
	var a=getWindowSize();
	var b=kb(m);
	var c=a.height-b.y-24;
	var d=a.width-48;
	m.style.height=c+'px';
	m.style.width=d+'px';
	//i.style.width = Info.Width + 'px';
	//i.style.height=c+'px';
	var l = document.getElementById('loading').style;
	l.top = (b.y+c/4) + 'px';
	l.left = (b.x+d/2) + 'px';
    /*    if (coords) {
    	   coords.style.top = (c-40) + "px";
//	   coords.style.left = 200 + "px";
        }

        if (usngmap) {
           usngmap.checkResize()
           currview = new usngviewport(usngmap)
        }
        if (usngmap && (usngmap.zoneon==true)) { 
           usngmap.removeOverlay(lines_)   
           lines_ = new usngzonelines(currview,zonelinecolor,usngmap.getZoom(),zonelineopacity)
           usngmap.addOverlay(lines_)
           lines_.zonedraw()
           if (usngmap.getZoom() < 10 || usngmap.grid100kon==false) { 
              lines_.zonemarkerdraw()
           }
        }
        if (usngmap && (usngmap.grid100kon==true)) { 
           usngmap.removeOverlay(lines100k)   
           lines100k = new grid100klines(currview,k100_linecolor,k100_linewidth,k100_lineopacity)
           usngmap.addOverlay(lines100k)
        }
        if (usngmap && (usngmap.grid1kon==true)) { 
           usngmap.removeOverlay(lines1k)   
           lines1k = new grid1klines(currview,k1_linecolor,k1_linewidth,k1_lineopacity)
           usngmap.addOverlay(lines1k)
        }
    */
	}
};


// controls what grids the user is given an option to display...function of zoom level
/*GridOptions = {
        ShowZones: '<input type="checkbox" name="zonelines" onclick=toggleZoneDisp(usngmap) />USNG Zones',
        Show100k: '<input type="checkbox" name="lines100k" onclick=toggle100kDisp(usngmap) />100k grid',
        Show1k: '<input type="checkbox" name="lines1k" onclick=toggle1kDisp(usngmap) />1k grid',

	Show : function(oldzoom,newzoom) {
                // zoom in cases
                if (oldzoom<4 && newzoom>=4) {
                   document.getElementById('zonecheckbox').innerHTML = this.ShowZones
                } 
                if (oldzoom<7 && newzoom>=7) {
                      document.getElementById('grid100kcheckbox').innerHTML = this.Show100k;
                }
                if (oldzoom<13 && newzoom>=13) {
                      document.getElementById('grid1kcheckbox').innerHTML = this.Show1k;
                }
                // zoom out cases
                if (oldzoom>=13 && newzoom<13) {
                   document.inputboxes.lines1k.checked = false
                   document.getElementById('grid1kcheckbox').innerHTML = ''
                   if (lines1k) { lines1k.remove() }
                   usngmap.grid1kon = false
                }
                if (oldzoom>=7 && newzoom<7) {
                   document.inputboxes.lines100k.checked = false
                   document.getElementById('grid100kcheckbox').innerHTML = ''
                   if (lines100k) { lines100k.remove() }
                   usngmap.grid100kon = false
                }
                if (oldzoom>=4 && newzoom<4) {
                   document.inputboxes.zonelines.checked = false
                   document.getElementById('zonecheckbox').innerHTML = ''
                   lines_.remove()
                   usngmap.zoneon = false
                }
	}
}*/

/*Info = {
	Width : 250,

	HiddenText : '<p id="showhide"><a href="" onclick="Info.Show(); return false;">&laquo;</a></p>',

	VisibleText : '<p id="showhide"><a href="" onclick="Info.Hide(); return false;">Hide Legend &raquo;</a></p>',

	JSONLayerText:  '<br><br><p><strong>Hurricane Gustav</strong><br><img src="http://gmaps-samples.googlecode.com/svn/trunk/markers/green/blank.png" alt="Open Shelters"><a href="http://floridanss.communityos.org/cms" target="_blank">Open Shelters</a><br><br><strong>Tropical Storm Fay Recovery</strong><br><img src="http://gmaps-samples.googlecode.com/svn/trunk/markers/blue/blank.png" alt="DRC">&nbsp;Disaster Recovery Centers<br><img src="http://gmaps-samples.googlecode.com/svn/trunk/markers/orange/blank.png" alt="OPS">&nbsp;Operational Facilities<br><br><strong>Weather Layers</strong></p><p><table><tbody id="layerslist"></tbody></table></p>',
	
	WWALayerText:	'<img src="http://www.srh.noaa.gov/ridge/graphics/ffw.gif">&nbsp;Flood<br><img src="http://www.srh.noaa.gov/ridge/graphics/smw.gif">&nbsp;Marine<br><img src="http://www.srh.noaa.gov/ridge/graphics/svr.gif">&nbsp;Thunderstorm<br><img src="http://www.srh.noaa.gov/ridge/graphics/tor.gif">&nbsp;Tornado',
			
    /*ClearButton:  '<input type="button" value="Clear directions" onclick=clearDirections() />',


	Hide : function() {
		var i = document.getElementById('info');
		this.content = i.innerHTML;
		i.innerHTML = this.HiddenText;
		this.Width = 3;
		Update.mapSize();
	},
	Show : function() {
		var i = document.getElementById('info');
		i.innerHTML = this.content;
		this.Width = 250;
		Update.mapSize();
	}
};*/

function kb(a){
	var b={"x":0,"y":0};
	while(a){
		b.x+=a.offsetLeft;
		b.y+=a.offsetTop;
		a=a.offsetParent;
	}
	return b
}

function getWindowSize(){
	a=new GSize(0,0);
	if(window.self&&self.innerWidth){
		a.width=self.innerWidth;
		a.height=self.innerHeight;
		return a;
	}
	if(document.documentElement&&document.documentElement.clientHeight){
		a.width=document.documentElement.clientWidth;
		a.height=document.documentElement.clientHeight;
		return a;
	}
	a.width=document.body.clientWidth;
	a.height=document.body.clientHeight;
	return a;
}

function readStartParameters() {
    var qsParm = new Array()
    var query = parent.window.location.search.substring(1)
    var parms = query.split('&')
    for (var i=0; i<parms.length; i++) {
       var pos = parms[i].indexOf('=')
       if (pos > 0) {
           var key = parms[i].substring(0,pos)
           var val = parms[i].substring(pos+1)
           qsParm[key] = val
       }
    }


    if (qsParm['usng']) {
       user_startusng = isUSNG(qsParm['usng'])
    }
    if (qsParm['lat']) {
       user_startlat = qsParm['lat']
    }
    if (qsParm['lng']) {
       user_startlng = qsParm['lng']
    }
    if (qsParm['zoom']) {
       user_startzoom = qsParm['zoom']
    }

    if (qsParm['disp']) {
       user_maptype = qsParm['disp']
    }

   if (user_startzoom) {
      scale_factor = parseFloat(user_startzoom)
   }
   else {
      scale_factor = 6
   }

}

function initializeMap() {

   // process command line options
   // if the user provided center coordinates and/or zoom factor on command line, process these
   if (user_startusng) {   // USNG coordinates have priority over lat/lng
      var latlon = GUsngtoLL(user_startusng)
      start_lat = latlon.lat()
      start_lng = latlon.lng()
   }
   else if (user_startlat && user_startlng) {
     start_lat=parseFloat(user_startlat);
     start_lng=parseFloat(user_startlng);
   }
   else {
     start_lat="28.201065"
     start_lng="-83.792725"	 
   }

   if (user_maptype == 's' || user_maptype == 'S') {
      maptype = G_SATELLITE_MAP
   }
   else if (user_maptype == 'h' || user_maptype == 'H') {
      maptype = G_HYBRID_MAP
   }
   else {
      maptype = G_NORMAL_MAP
   }

   usngmap.setCenter(new GLatLng(start_lat, start_lng), scale_factor, maptype);

   if ((user_startusng) || (user_startlat && user_startlng)) {
      displayCoordMarker(start_lat,start_lng,"","")
   }

}
