// Copyright 2003 BullMahi LLC.  All rights reserved.


// constants

// number of waypoint marker images to create
var NUMCOPIES        = 5;

// max number of waypoints in a route
var NUMWPS           = NUMCOPIES+1+1; // original image + numcopies + harbor


var fbz;

// indeces into 'port' arrays
var MISSIONBAYPORTID = 0;
var SDPORTID         = 1;
var ENSENADAPORTID   = 2;
var DANAPOINTPORTID  = 3;
var OCEANSIDEPORTID  = 4;
var NUMHARBORS       = 5;

// set the browser type
var isNav = (navigator.appName == "Netscape");
var isIE  = (navigator.appName == "Microsoft Internet Explorer");

if (!document.layers)
{
    document.write('<style type="text/css">#reldiv {position:relative;background-color:#ffffff;border:1px solid #000099;}<\/style>');
}


// map point constants

// drag and drop coordinates are relative to upper left corner of window (eg browser).
// graphics coordinates are relative to upper left corner of map canvas (see origin 
// object below).

// offsets from drag and drop origin to graphics origin (corner of gif image)
var XOFFSET;
var YOFFSET;
if (isIE)
{
	XOFFSET         =    0;
	YOFFSET         =  100;
}
else
{
	XOFFSET         =    0;
	YOFFSET         =   97;
}

// graphics coord of map origin (edge of map grid line at upper left corner)
var XORIGIN         =   23; // 118deg 40' W
var YORIGIN         =   21; //33deg 50' N

// max value of x/y on map - graphics coords
//var MAXX           =  962;
//var MAXY           = 1382; //966 - YOFFSET;
var MAXX             =  982 - XOFFSET; // 116deg W
var MAXY             = 1619 - YOFFSET; //30 deg 10' N

// map border width
var XBORDERWIDTH    = 0; //15;
var YBORDERWIDTH    = 0; //12;

var MapHeight       =  MAXY - XORIGIN;
var MapWidth        =  MAXX - YORIGIN;

// location on page where waypoint images are 'stacked'
var wpHomeX;
var wpHomeY;

if (isIE)
{
	wpHomeX         =  764;
	wpHomeY         =  512;
}
else
{
	wpHomeX         = 764;
	wpHomeY         = 482;
}

// map lat/lon parameters in degrees
TopLat = 33.833;
BottomLat = 30.167;
LeftLon = 118.667;
RightLon = 116.0;

ScaleHeight = TopLat - BottomLat;
ScaleWidth = LeftLon - RightLon;
//alert("scaleHeight: " + ScaleHeight + " scalewidth: " + ScaleWidth);
pixelToNM = 6.418;

// inputs are graphics coords
function onmap(x,y)
{
	//alert ("(MAXX,MAXY), " + MAXX + " " + MAXY + " x: " + x + " y: " + y);
	return ((x <= MAXX && x >= XORIGIN) && (y >= YORIGIN && y <= MAXY));
}

// convert graphics coord to lat
function yToLat(y)
{
	mapy = y - (XOFFSET + YORIGIN);
	lat = TopLat - (ScaleHeight*mapy)/MapHeight;
	//if (mapy == 0) alert("mapy == 0, return lat == " + lat);
	return lat;
}

// convert graphics coord to lon
function xToLon(x)
{
	mapx = x - XORIGIN;
	lon = LeftLon - (ScaleWidth*mapx)/MapWidth;
	return lon;

}


// upper left corner of map in graphics coords (not border)
var origin = new point(XOFFSET,YOFFSET);



var wp = new Array(NUMWPS);
for (var i = 0; i < NUMWPS; i++)
	wp[i] = new waypoint(-1,-1,"");

var homes = new Array(NUMHARBORS);
for (var i = 0; i < NUMHARBORS; i++)
	homes[i] = new waypoint(-1,-1);

var home;
var oldhome;

function init_homes()
{
	// graphics coord system
	homes[MISSIONBAYPORTID].x = xToGC(532);
	homes[MISSIONBAYPORTID].y = yToGC(570); 
	homes[MISSIONBAYPORTID].name = "Mission Bay";

	homes[SDPORTID].x         = xToGC(544);
	homes[SDPORTID].y         = yToGC(606);
	//alert(homes[SDPORTID].x + " " + homes[SDPORTID].y);
	homes[SDPORTID].name      = "San Diego Harbor";

	homes[ENSENADAPORTID].x   = xToGC(755);
	homes[ENSENADAPORTID].y   = yToGC(980);
	homes[ENSENADAPORTID].name = "Ensenada";

	homes[DANAPOINTPORTID].x =  379;
	homes[DANAPOINTPORTID].y =  275;
	homes[DANAPOINTPORTID].name = "Dana Point";

	homes[OCEANSIDEPORTID].x =   474;
	homes[OCEANSIDEPORTID].y =  370;
	homes[OCEANSIDEPORTID].name = "OceanSide Harbor";
	// graphics coord system
	home = new point(homes[currentHarbor].x, homes[currentHarbor].y);
	oldhome = new point(home.x, home.y);
}

// state  info

// wp being dragged
var currentwp    = -1;

// distance from currentHarbor through waypoints back to port
var tripdist     =  0;
var tripspeed    = -1;
var tripfuelrate = -1;
var tripfuel     = -1;
var currentHarbor    = MISSIONBAYPORTID;

// drag and drop coords
function sendWaypointHome(obj)
{
	var e = document.getElementById(obj.id);
	// drag and drop coords
	obj.moveTo(wpHomeX,wpHomeY);
}

// inputs are graphics coords
function setHome(portID)
{
	//alert("setHome");
	if (portID >= MISSIONBAYPORTID && portID <= NUMHARBORS)
	{
		home.x = homes[portID].x;
		home.y = homes[portID].y;
		currentHarbor = portID;
	}
	else
	{
		home.x = homes[MISSIONBAYPORTID].x;
		home.y = homes[MISSIONBAYPORTID].y;
		currentHarbor = MISSIONBAYPORTID;
	}
	wp[0].x  = home.x;
	wp[0].y  = home.y;
	wp[0].name = 0;

	//dd.elements.fb.x/y are drag and drop coords
	//alert(dd.elements.fb.x);


	drawfbdata(dd.elements.fb.x,dd.elements.fb.y);
	calcRoute();

}

function initMap()
{
	//alert("initMap " + XOFFSET);
	setHome(MISSIONBAYPORTID);
	dd.elements.fb.maximizeZ();
	dd.elements.waypoint.maximizeZ();
	for (var wp = 1; wp < NUMWPS-1; wp++)
	{
		dd.elements["waypoint" + wp].maximizeZ();
	}
}

function pickwp(x,y,id)
{
	var firstempty = -1;
	var found = false;
	for (var i = 1; i < NUMWPS; i++)
	{
		if (wp[i].x == -1 && firstempty == -1)
		{
			firstempty = i;
		}
		else if (id == wp[i].name)
		{
			found = true;
			currentwp = i;
		}
		//alert (id + firstempty + " " + wp[i].x);
	}
	if (!found && firstempty != -1)
	{
		wp[firstempty].x = x; // no longer empty
		wp[firstempty].y = y;
		wp[firstempty].name = id;
		//alert(firstempty + " " + wp[firstempty].name);
		currentwp = firstempty;
	}
}

function eliminateWPFromRoute(wpid)
{
		// collapse list
		for (var i = wpid; i < NUMWPS-1; i++)
		{
			wp[i].x = wp[i+1].x;
			wp[i].y = wp[i+1].y;
			wp[i].name = wp[i+1].name;
		}
		wp[NUMWPS-1].x = -1;
		wp[NUMWPS-1].y = -1;
}

// called when a waypoint icon is dropped.
// inputs are drag and drop coords
function drawwaypoint(x,y)
{
	//alert(dd.obj.id + " " + dd.obj.name);

	// if dropped outside map then assume it is being taken out of route

   // images stacked in order so largest id is dragged first.
	var gcx = xToGC(x);
	var gcy = yToGC(y);
   //alert (currentwp + " " + x + " " + y + " " + gcx + " " + gcy);

	if (!onmap(gcx,gcy))
	{	
		//alert("not on map, origin: " + origin.x + ", " + origin.y);
		eliminateWPFromRoute(currentwp);
		sendWaypointHome(dd.obj);
	}
	else if (currentwp != -1)
	{
		wp[currentwp].x = gcx;
		wp[currentwp].y = gcy;
	}
	currentwp = -1;		
	calcRoute();
}

// uses graphics coords
function calcRoute()
{
	//alert("calcRoute");
	var d2 = document.getElementById("tripdata");
	var dist = 0;
	var time = 0;
	var spd = 0;
	var leg = 0;
	var first = false;
	jg.clear();
	jg.setColor("#000000"); // blue

	// note that for display purposes, 0,0 is the upper left window corner, but the graphics
	// canvas actually has its origin at the corner of the image.  This is why
	// the coords passed to drawArrow are offset!  Can probably find a more elegant approach ...

	var pt1 = 0;
	var lastpt = 0;
	for (var pt2 = 1; pt2 < NUMWPS; pt2++)
	{
		if (wp[pt2].x != -1)
		{
			leg = Math.sqrt( Math.pow(wp[pt2].x - wp[pt1].x,2) + Math.pow(wp[pt2].y - wp[pt1].y,2));
			dist = dist + leg;
//			drawArrow(wp[pt1].x+XBORDERWIDTH+XOFFSET,wp[pt1].y+YBORDERWIDTH+YOFFSET,
//						wp[pt2].x+XBORDERWIDTH+XOFFSET,wp[pt2].y+YBORDERWIDTH+YOFFSET);
			drawArrow(wp[pt1].x,wp[pt1].y,
						wp[pt2].x,wp[pt2].y);
			pt1 = pt2;
			lastpt = pt2;
		}
		else
		{
			// nothing to do
		}
	}
	// now do leg from last waypoint back to harbor
	if (lastpt != 0)
	{
			leg = Math.sqrt( Math.pow(wp[lastpt].x - wp[0].x,2) + Math.pow(wp[lastpt].y - wp[0].y,2));
			dist = dist + leg;
			drawArrow(wp[lastpt].x,wp[lastpt].y,
						wp[0].x,wp[0].y);
	}
	jg.paint();
	if (dist == 0)
		d2.innerHTML="<span class=\"lefttext\">Roundtrip Distance: <br>Total time on water: </span>";
	else
	{
		dist = 100*(dist/pixelToNM);
		dist = Math.round(dist) / 100;
		spd = document.getElementById("speed").value;
		if (spd == 0)
			time = 0;
		else
			time = dist/spd;
		time = Math.round(time);
		d2.innerHTML="<span class=\"lefttext\">Roundtrip Distance: </span><span class=\"calcdatatext\">" + dist + " nm<br></span><span class=\"lefttext\">Total time on water: <span class=\"calcdatatext\">" + time + "hrs</span>";
	}
	tripdist = dist;
	calcFuel();
}

function empty()
{
	//alert("empty");
}


function clearRoute()
{
	var idx = NUMWPS-1;
	for (i = idx; i > 0; i--)
	{
		if (wp[i].x != -1)
		{
			currentwp = i;
			nm = wp[i].name;
			eliminateWPFromRoute(i);
			//alert(nm + " " + dd.elements[nm].name);
			sendWaypointHome(dd.elements[nm]);
			window.setTimeout("empty();",500);
		}
	}
	currentwp = -1;
	calcRoute();
}

function reverseRoute()
{
	var x,y,n;
	var idx = NUMWPS-1;
	for (i = 1; i < idx; i++)
	{
		x = wp[idx].x;
		y = wp[idx].y
		n = wp[idx].name;
		wp[idx].x    = wp[i].x;
		wp[idx].y    = wp[i].y;
		wp[idx].name = wp[i].name;
		wp[i].x = x;
		wp[i].y = y;
		wp[i].name = n;
		idx--;
	}
	calcRoute();
}

function checkSpeedEntry(doalert)
{
	var err = 0;
	var speed = document.getElementById("speed").value;
	if (speed == "")
		tripspeed = -1;
	else if (!isValidNumber(speed))
	{
		err = 1;
		tripspeed = -1;
		if (doalert) alert("Speed must be a number (nm/hr)");
	}
	else
		tripspeed = speed;
	return (err == 0);
}

function checkFuelRateEntry(doalert)
{
	var err = 0;
	var obj = document.getElementById("fuelrate");
	var fr = obj.value;
	if (fr == "")
		tripfuelrate = -1;
	else if (!isValidNumber(fr))
	{
		err = 1;
		tripfuelrate = -1;
		if (doalert) alert("Fuel Rate must be a number (gal/hr)");
	}
	else 
	{
		tripfuelrate = fr;
	}
	return (err == 0);
}

function calcFuel()
{
	//alert ("calcFuel");
	var d2 = document.getElementById("fuel");
	var fuel = 0;
	var mpg =0;
	err = 0;
	var fuelrate = document.getElementById("fuelrate").value;
	//var speed = document.getElementById("speed").value;
	//alert("tripdist: " + tripdist);
	if (tripdist > 0 && tripspeed != -1 && tripfuelrate != -1)
	{
		fuel = tripfuelrate * (tripdist / tripspeed);
		fuel = fuel*100;
		tripfuel = Math.round(fuel) / 100;
		mpg = Math.round((tripdist / tripfuel)*100);
		mpg = Math.round(mpg) /100;
		d2.innerHTML = "<span class=\"lefttext\">Fuel Usage: </span><span class=\"calcdatatext\">" + tripfuel + "gals at " + mpg + "nm/gal" + "</span>";
	}
	else
		d2.innerHTML = "<span class=\"lefttext\">Fuel Usage: </span>";

}

// called when fb is 'engaged' for dragging
function pickfb()
{
	var d1 = document.getElementById("reldiv");
	//fbz = d1.style.zIndex;
	d1.style.zIndex = "3000";
}

// inputs are drag and drop coords
function dragfbdata(x,y)
{
	drawfbdata(x,y);
}

// inputs are drag and drop coords
function dropfbdata(x,y)
{
	//alert(x + " " + y + " " + xToGC(x) + " " + yToGC(y));
	drawfbdata(x,y);
}

// inputs are drag and drop coords
function drawfbdata(x,y)
{
	var d1 = document.getElementById("reldiv");
	var gcx = xToGC(x);
	var gcy = yToGC(y);
	var latd = yToLat(gcy);
	var lond = xToLon(gcx);

	// get integer part
	var tmp = new String(latd);
	i = tmp.indexOf(".");
	if (i < 0)
		latd2 = latd;
	else
	{
		var tmp2 = tmp.substring(0,i);
		var latd2 = parseInt(tmp2);
	}

	tmp = new String(lond);
	i = tmp.indexOf(".");
	if (i < 0)
		lond2 = lond;
	else
	{
		tmp2 = tmp.substring(0,i);
		var lond2 = parseInt(tmp2);
	}

	m = Math.abs(latd - latd2);
	m = 60*m/100;

	var latm = Math.round(m*10000);
	//alert (m + " " + latm);
	latm = latm/100;

	m = Math.abs(lond - lond2);
	m = 60*m/100;
	var lonm = Math.round(m*10000);
	lonm = lonm/100;

   // calculate dist from home port to location
   var dist = Math.sqrt( Math.pow(gcx-home.x,2) + Math.pow(gcy - home.y,2));
	dist = 100*(dist/pixelToNM);
	dist = Math.round(dist) / 100;


	if (isIE)
		dd.elements.reldiv.moveTo(x+30,y);
	else
		dd.elements.reldiv.moveTo(x+30,y);

	var dispx = gcx - XORIGIN;
	var dispy = gcy - YORIGIN;

	if (!onmap(gcx,gcy)) {
		//d1.innerHTML=" ";
		d1.innerHTML="<span class=\"lefttextgrey\">" + dispx + " " + dispy + "<br>" + "Lat: " + latd2 + "&deg; " + latm + "'<br>Lon: " + lond2 + "&deg; " + lonm + "'<br>NM: " + dist + "</span>";
		//alert(d1.innerHTML);
	}
	else {
		//d1.innerHTML="<font size=\"-1\">" + "Lat: " + latd2 + "&deg; " + latm + "'<br>Lon: " + lond2 + "&deg; " + lonm + "'<br>NM: " + dist + "</font>";
		d1.innerHTML="<span class=\"lefttextblack\">" + dispx + " " + dispy + "<br>" + "Lat: " + latd2 + "&deg; " + latm + "'<br>Lon: " + lond2 + "&deg; " + lonm + "'<br>NM: " + dist + "</span>";
		//alert(d1.innerHTML);
	}
}

var summaryWindow = '';

function openSummary()
{
	calcFuel();
	if (!summaryWindow || summaryWindow.closed)
	{
			if (isIE)
			{
				// IE raises access denied error when 1st arg is empty ...
				summaryWindow = window.open("about:blank", "foo", "width=920,height=900,scrollbars=yes");
			}
			else
				summaryWindow = window.open("", "", "width=920,height=900,scrollbars=yes");
			if (!summaryWindow.opener) summaryWindow.opener = self;
	}
	else if (summaryWindow.focus)
	{
		summaryWindow.focus();
	}

	// delay for IE: IE tries to write to window before opened or ...
	window.setTimeout("writeSummary();",500, "JavaScript");
}

var latd, latm, lond, lonm;
function setLatLonForDisplay(gcx,gcy)
{
	tmplatd = yToLat(gcy);
	tmplond = xToLon(gcx);

	// get integer part
	var tmp = new String(tmplatd);
	i = tmp.indexOf(".");
	if (i < 0)
		latd = tmplatd;
	else
	{
		var tmp2 = tmp.substring(0,i);
		latd = parseInt(tmp2);
	}

	tmp = new String(tmplond);
	i = tmp.indexOf(".");
	if (i < 0)
		lond = tmplond;
	else
	{
		tmp2 = tmp.substring(0,i);
		lond = parseInt(tmp2);
	}

	m = Math.abs(yToLat(gcy) - latd);
	m = 60*m/100;
	latm = Math.round(m*10000);
	latm = latm/100;

	m = Math.abs(xToLon(gcx) - lond);
	m = 60*m/100;
	lonm = Math.round(m*10000);
	lonm = lonm/100;
}

function writeSummary()
{

	var hdr = "<html><head><title>BullMahi Trip Summary</title><meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\"></head>";
	var body = "<body bgcolor=\"#FFFFCC\">";
	
	body += "<script language=\"Javascript1.2\">";
	body += "<!--\n";
	body += "function printpage() {window.print();}\n"
	body += "\/\/-->\n<"
	body += "/script>";
	
	body += "<table width=\"600\" border=\"0\"><tr>";
	body += "<td width=\"127\" height=\"172\" valign=\"middle\"><img src=\"../gifs/dorado_2_color.gif\" width=\"123\" height=\"163\" ></td>";
   body += "<td width=\"473\" align=\"middle\" valign=\middle\"><h1>BullMahi Trip Summary</h1></td>";
	body += "</tr></table>";

	//body += "<img src=\"Assets/dorado_2_color.gif\" width=\"123\" height=\"163\" valign=\"middle\" align=\"left\">";
	//body += "<h1><b>BullMahi Trip Summary</b></h1><p>";
	//body += "<br clear=\"all\">";
	body += "<hr>";

	
	setLatLonForDisplay(homes[currentHarbor].x,homes[currentHarbor].y);
	body += "Your trip Starts and ends at " + homes[currentHarbor].name + " (lat:" + latd + "&deg; " + latm + ", lon: " + lond + "&deg; " + lonm + ")";
	
	var dist = 0;
	var leg;
	var pt1 = 0;
	var lastpt = 0;
	var legnum = 0;
	var legdescrip = "<ul>";
	for (var pt2 = 1; pt2 < NUMWPS; pt2++)
	{
		if (wp[pt2].x != -1)
		{
			legnum++;
			leg = Math.sqrt( Math.pow(wp[pt2].x - wp[pt1].x,2) + Math.pow(wp[pt2].y - wp[pt1].y,2));
			dist = dist + leg;
			leg = 100*(leg/pixelToNM);
			leg = Math.round(leg) / 100;

			legdescrip += "<li>Route leg " + legnum + " is " + leg + " nautical miles long; <b>from </b> ";
			
			setLatLonForDisplay(wp[pt1].x,wp[pt1].y);
			legdescrip += " (lat:" + latd + "&deg; " + latm + ", lon: " + lond + "&deg; " + lonm + ")";
			setLatLonForDisplay(wp[pt2].x,wp[pt2].y);
			legdescrip += "   <b>to</b> (lat:" + latd + "&deg; " + latm + ", lon: " + lond + "&deg; " + lonm + ")<p>";
			legdescrip += "</li>";
			pt1 = pt2;
			lastpt = pt2;
		}
		else
		{
			// nothing to do
		}
	}
	// now do leg from last waypoint back to harbor
	if (lastpt != 0)
	{
			legnum++;
			leg = Math.sqrt( Math.pow(wp[lastpt].x - wp[0].x,2) + Math.pow(wp[lastpt].y - wp[0].y,2));
			dist = dist + leg;
			leg = 100*(leg/pixelToNM);
			leg = Math.round(leg) / 100;
			legdescrip += "<li>Route leg " + legnum + " is " + leg + " nautical miles long; <b>from </b> ";
			
			setLatLonForDisplay(wp[lastpt].x,wp[lastpt].y);
			legdescrip += " (lat:" + latd + "&deg; " + latm + ", lon: " + lond + "&deg; " + lonm + ")";
			setLatLonForDisplay(wp[0].x,wp[0].y);
			legdescrip += "   <b>to</b> (lat:" + latd + "&deg; " + latm + ", lon: " + lond + "&deg; " + lonm + ")<p>";
			legdescrip += "</li></ul>";
	}
	
	if (legnum > 0)
	{
		body += " through the following legs:<p>";
		body += legdescrip;
		dist = 100*(dist/pixelToNM);
		dist = Math.round(dist) / 100;
		body += "Your total trip length is " + dist + " nautical miles<p>";
	}
	else
		body += "<p>You did not provide any route information<p>";

	if (legnum > 0 && tripspeed != -1 && tripfuelrate != -1)
	{
		body += "Based on your estiamted average speed of " + tripspeed + " knots and your average fuel consumption rate of " + tripfuelrate + " gals/hr,";
		body += " your trip will require approximately " + tripfuel + " gallons of fuel<p>";
	}
	else
	{
		body += "You did not enter any fuel consumption information<p>";
	}

	body += "<hr>";
	body += "<center><p><p><input type=\"button\" value=\"Print Page\" onClick=\"printpage()\"><p>";
	body += "<input type=\"button\" value=\"Close Window\" onClick=\"window.close()\"></center>";
	body += "<p><p><p><center>Copyright &copy; 2004 BullMahi LLC. All rights reserved</center>";
		
	body += "</body></html>";
	summaryWindow.document.write(hdr + body);
	summaryWindow.document.close();
}
