/* 
dgm.js 
Copyright 2006 Donald Marino. All rights reserved. 
--------------------------------------------------
*/

var box_top;
var box_left;
var box_height;
var box_width;
var extent = { minx:-180.0,miny:-90.0,maxx:180.0,maxy:90.0 };
var newextent = { x1:0.0, x2:0.0, y1:0.0, y2:0.0 };
fix_aspect_ratio();
var dpp = 0.00;
var cur_x = 0;
var cur_y = 0;
var dragging = 0;
var mapserver = "http://ims.cr.usgs.gov/servlet19/com.esri.wms.Esrimap/USGS_WMS_REF?";
var request = "request=GetMap";
var service = "service=WMS";
var version = "version=1.1.1";
var srs = "srs=EPSG:4326";
var format = "format=image/png";
var styles = "styles=";
var layers = "layers=States,County,Urban_Areas,Water_Bodies,Roads,State_Labels";
var mapheight = "height=396";
var mapwidth = "width=580";
var mapextent = "bbox=" + String(extent.minx) + "," + String(extent.miny) + "," + String(extent.maxx) + "," + String(extent.maxy);
var url = "";
var mapurl = "";

// default to blue marble map
build_bmng_map();


///////////////////////////////////////////////////////////////////////////

function dgm_init()
{
	// register the events
	var mapcover = document.getElementById('mapcover');
	if(window.ActiveXObject) 
	{
		mapcover.attachEvent("onmousedown",mapMouseDown);
		mapcover.attachEvent("onmousemove",mapMouseMoved);
		mapcover.attachEvent("onmouseup",mapMouseUp);
	} else {
		mapcover.addEventListener("mousedown",mapMouseDown, false );
		mapcover.addEventListener("mousemove",mapMouseMoved, false );
  	mapcover.addEventListener("mouseup", mapMouseUp, true);
	}
	var world = document.getElementById('world');
	if(window.ActiveXObject) 
	{
		world.attachEvent("onmouseup",zoomToWorld);
	} else {
		world.addEventListener("mouseup",zoomToWorld,true);
	}
	
	
	// fix the layout for IE
	if (window.ActiveXObject) 
	{ 
		fix_ie_layout(); 
	}
	var db = document.getElementById('dbox');
	db.style.background = "url(" + 'images/trans.png' + ")";
	var world = document.getElementById('world');
	world.style.background = "url(" + 'images/world.png' + ")";
}

function assemble_getcapabilities_url(ms)
{
	var val = mapserver + request;
	return(val);
}

function assemble_getmap_url()
{
	var val = mapserver + request + "&" + service + "&" + version + "&" + srs + "&" + format + "&" + styles + "&" + mapextent + "&"  + mapwidth + "&" + mapheight + "&" + layers;
	return(val);
}

function build_usgs_url()
{
	mapserver = "http://ims.cr.usgs.gov/servlet19/com.esri.wms.Esrimap/USGS_WMS_REF?";
	styles = "styles=";
	layers = "layers=States,County,Urban_Areas,Water_Bodies,,State_Labels";
	return(assemble_getmap_url());
}

function build_jpl_map()
{
	mapserver = "http://wms.jpl.nasa.gov/wms.cgi?";
	layers = "layers=global_mosaic";
	styles = "styles=pseudo_bright";
	bgurl = assemble_getmap_url();
}

function build_visual_map()
{
	mapserver = "http://wms.jpl.nasa.gov/wms.cgi?";
	layers = "layers=global_mosaic";
	styles = "styles=visual_bright";
	bgurl = assemble_getmap_url();
}

function build_pseudo_map()
{
	mapserver = "http://wms.jpl.nasa.gov/wms.cgi?";
	layers = "layers=global_mosaic";
	styles = "styles=pseudo_bright";
	bgurl = assemble_getmap_url();
}


function build_bmng_map()
{
	mapserver = "http://wms.jpl.nasa.gov/wms.cgi?";
	layers = "layers=BMNG";
	styles = "styles=";
	bgurl = assemble_getmap_url();
}

function build_colordem_map()
{
	mapserver = "http://wms.jpl.nasa.gov/wms.cgi?";
	layers = "layers=huemapped_srtm";
	styles = "styles=";
	bgurl = assemble_getmap_url();
}

function switchMap(map){
	switch (map)
	{
		case 'visual':
				
				build_visual_map();
				set_map_title("True Color Landsat7 Image");
			break;
		
		case 'pseudo':
				// get the capabilites URL
				result = getCapabilities("JPL");
			  if (result)
				{
					build_pseudo_map();
					set_map_title("False Color Landsat7 Image");
				} else {
					var displaytext = document.getElementById('display_text');
					displaytext.innerHTML = "Server capabilites unavailable.";
				}
			break;
		
		case 'bmng':
		    build_bmng_map();
				set_map_title("Blue Marble Next Generation Image");
			break;
		
		case 'colordem':
				build_colordem_map();
				set_map_title("SRTM Color Elevation");
		  break;
		
		default:
		  break;
	}
	fetchMap();
}

function fetchMap(){
	
	var layer0 = document.getElementById('layer0');
	layer0.style.background =  "url(" + bgurl + ")";
	//layer0.innerHTML = "<img src=" + bgurl + " alt='Map Image' ondrag='window.event.returnValue = false;'></img>";
	//mapurl = build_usgs_url();
	//var layer1 = document.getElementById('layer1');
	//layer1.innerHTML = "<img src=" + mapurl + " alt='Map Image' on></img>";
	//set_map_scale();
}

// async get capabilities call -----------------------

function getCapabilities(server)
{
	//http://developer.apple.com/internet/webcontent/xmlhttpreq.html
	// fetch the capabilities URL for the server named
	var cap_url = assemble_getcapabilities_url(server);
	var req;

		req = false;
	  if(window.XMLHttpRequest) {
	    try {
			  req = new XMLHttpRequest();
	    } catch(e) {
	 	 	 req = false;
      }
	  } else if(window.ActiveXObject) {
	      try {
	       	req = new ActiveXObject("Msxml2.XMLHTTP");
	     	} catch(e) {
	       	try {
	         		req = new ActiveXObject("Microsoft.XMLHTTP");
	        } catch(e) {
			       	req = false;
        	}
				}
	  }
		
		if(req) {
			req.onreadystatechange = processReqChange;
			try {
			 	netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
				var displaytext = document.getElementById('display_text');
				displaytext.innerHTML = "Starting up...";
			 	req.open("GET", cap_url, true);
				req.send("");
			} catch (e) {
			 
		  }
			return(true);
		} else {
			// couldn't make a request object for some reason
			return(false);
		}
	
}


function processReqChange() {
   
		var status = document.getElementById('server_status');
		var displaytext = document.getElementById('display_text');
		displaytext.innerHTML = "Inside req change";
		switch (req.readyState)
		{
			case 0:
				break;
			case 1:
				// loading
				status.innerHTML = "Loading....";
				break;
			case 2:
				break;
			case 3:
				break;
			case 4:
			
				// done. return the capabilities doc
				if (req.status == 200)
				{
					displaytext.innerHTML = req.responseText;
					status.innerHTML = "Done.";
				} else {
					status.innerHTML = "Server Error! Could not retreive data.";
				}
				
				break;
		}

}

// event handling -------------------------------------------------

function mapMouseDown(e)
{
	dragging = 1;
	var mapframe = document.getElementById("mapcover");
	var maptop = 67;
	var mapleft = 12;
	box_top = e.clientY-maptop;
	box_left = e.clientX-mapleft;
	dpp = calc_scale();
	// clear the box
  newextent = { x1:0.0, x2:0.0, y1:0.0, y2:0.00 };
	
	// get the map coords of the request
	newextent.x1 =  extent.minx + box_left*dpp;
	newextent.y1 = extent.maxy - box_top*dpp;
	
}

function mapMouseMoved(e)
{
	var dbox = document.getElementById("dbox");
	if (dragging == 1)
	{
		var maptop = 70;
		var mapleft = 15;
		var new_box_top = (e.clientY-maptop < box_top) ? e.clientY-maptop : box_top;
	  var	new_box_left = (e.clientX-mapleft < box_left) ? e.clientX-mapleft : box_left;
		var new_box_height = (e.clientY-maptop < box_top) ? box_top-(e.clientY-maptop) : e.clientY-box_top-maptop;
		var new_box_width = (e.clientX-mapleft < box_left) ? box_left-(e.clientX-mapleft) : e.clientX-box_left-mapleft;
		dbox.style.top = new_box_top + "px";
		dbox.style.left = new_box_left + "px";
		dbox.style.height = new_box_height + "px";
		dbox.style.width = new_box_width + "px";
	}

}

function mapMouseUp(e)
{
	dragging = 0;
	var maptop = 67;
	var mapleft = 12;
	var box_y = e.clientY-maptop;
	var box_x = e.clientX-mapleft;
	hide_box(e);
	
	// update the mapextent
	newextent.x2 = extent.minx + box_x*dpp;
	newextent.y2 = extent.maxy - box_y*dpp;
	extent.minx = Math.min(newextent.x1,newextent.x2);
	extent.maxx = Math.max(newextent.x1,newextent.x2);
	extent.miny = Math.min(newextent.y1,newextent.y2);
	extent.maxy = Math.max(newextent.y1,newextent.y2);
	fix_aspect_ratio();
	mapextent = "bbox=" + String(extent.minx) + "," + String(extent.miny) + "," + String(extent.maxx) + "," + String(extent.maxy);
	bgurl = assemble_getmap_url();
	//alert(mapextent);
	fetchMap();
	
}

function zoomToWorld()
{
	extent = { minx:-180.0,miny:-90.0,maxx:180.0,maxy:90.0 };
	fix_aspect_ratio();
	mapextent = "bbox=" + String(extent.minx) + "," + String(extent.miny) + "," + String(extent.maxx) + "," + String(extent.maxy);
	bgurl = assemble_getmap_url();
	fetchMap();
}

function hide_box(e)
{
	var dbox = document.getElementById("dbox");
	box_left = -650;
	box_top = -650;
	box_height = 1;
	box_width = 1;
	dbox.style.top = -650 + "px";
	dbox.style.left = -650 + "px";
	dbox.style.height = 1 + "px";
	dbox.style.width = 1 + "px";
}

function set_map_title(title)
{
	var t = document.getElementById('map_title');
	t.innerHTML = title;
}

function set_map_scale()
{
	var s = document.getElementById('scale');
	s.innerHTML = "Scale: " + String(calc_scale());
}

function calc_scale()
{
	// the scale is the difference between the map width in pixels and degrees.
	var dx = extent.maxx - extent.minx;
	var scale = dx/580;
	return((extent.maxx-extent.minx)/580);
}

function fix_aspect_ratio()
{
	//make the maps extent fit into the frame
	var ar = 1.46464;
	var x_ext = Math.abs(extent.maxx - extent.minx);
	var y_ext = Math.abs(extent.maxy - extent.miny);
	if (x_ext > y_ext)
	{
		// wider
		var newydim = x_ext/ar;
		var ycenter = (extent.maxy - (y_ext/2));
		extent.maxy = (ycenter + (newydim/2));
		extent.miny = (ycenter - (newydim/2));
	} else {
		// taller
		var newxdim = y_ext*ar;
		var xcenter = (extent.maxx - (x_ext/2));
		extent.maxx = (xcenter + (newxdim/2));
		extent.minx = (xcenter - (newxdim/2));
	}
	
}


function fix_ie_layout()
{
	
	//add some size to the frames
	var mf = document.getElementById('mainframe');
	if (mf)
	{
		mf.style.height = 475 + "px";
		mf.style.width = 608 + "px";
  }
	var mf = document.getElementById('mapframe');
	if (mf)
	{
		mf.style.height = 406 + "px";
		mf.style.width = 590 + "px";
  }
	var mf = document.getElementById('innermapframe');
	if (mf)
	{
		mf.style.height = 398 + "px";
		mf.style.width = 582 + "px";
  }

}

//