function dec2dms(dec, dir) 
{
	// dec = A decimal measurement, perhaps a GPoint.x or .y
	// dir = 'x' or 'y'
	// returns a string such as 47&deg; 22' 40" N
	var plus=Math.abs(dec);
	var degr=Math.floor(plus);
	var minu=Math.floor(60*(plus-degr));
	var sec=Math.floor(60*(60*(plus-degr)-minu));
	var compass="?"
	if (minu<10) {minu="0"+minu};
	if (sec<10) {sec="0"+sec};
	if (dir=='x') {
		if (dec<0) {compass="W"} else {compass="E"}
	} else {
		if (dec<0) {compass="S"} else {compass="N"}
	}
	return ""+degr+"&deg; "+minu+"' "+sec+'" '+compass;
} 

var PI = 3.14159265358979323846;
var FEETPERMETERS = 3.2808399;

function rads(degs)
{
	return (degs * PI / 180.0);
}
function degs(rads)
{
	return (rads * 180.0 / PI);
}
function distanceInMeters(lat1, lon1, lat2, lon2)
{
	// Haversine Formula 

	var R = 6366707.0;
    var dlon = lon2 - lon1;
    var dlat = lat2 - lat1;
    var a = Math.pow( Math.sin(rads(dlat/2)), 2) + Math.cos(rads(lat1)) * Math.cos(rads(lat2)) * Math.pow( Math.sin(rads(dlon/2)), 2);
    var c = 2 * asinf( min(1, sqrtf(a)));
    var d = R * c;
	return d;
}

function distanceInKM(lat1, lon1, lat2, lon2)
{
	return distanceInMeters(lat1, lon1, lat2, lon2) / 1000;
}

function distanceInMiles(lat1, lon1, lat2, lon2)
{
	return distanceInKM(lat1, lon1, lat2, lon2) / 1.607;	// 6366707 meters = 3963 miles
}

function meters2feet(meters)
{
	return meters * FEETPERMETERS;
}

function feet2meters(feet)
{
	return feet / FEETPERMETERS;
}

function formatDistance(d)
{
	var d2 = parseFloat(d);
	if (isNaN(d2))
		return "n/a";
	else
		return d2.toFixed(2) + " mi.";
}

function formatElev(d)
{
	var d2 = parseFloat(d);
	if (isNaN(d2))
		return "n/a";
	else
		return Math.floor(meters2feet(d2)) & " ft."
}

function formatLat(d)
{
	var d2 = parseFloat(d);
	if (isNaN(d2))
		return "n/a";
	else
		return dec2dms(d2, "y");
}

function formatLon(d)
{	
	var d2 = parseFloat(d);
	if (isNaN(d2))
		return "n/a";
	else
		return dec2dms(d2, "x");
}
