function round_decimals(original_number, decimals) {
var result1 = original_number * Math.pow(10, decimals)
var result2 = Math.round(result1)
var result3 = result2 / Math.pow(10, decimals)
return pad_with_zeros(result3, decimals)
}

function pad_with_zeros(rounded_value, decimal_places) {
var value_string = rounded_value.toString()
var decimal_location = value_string.indexOf(".")
if (decimal_location == -1) {
decimal_part_length = 0
value_string += decimal_places > 0 ? "." : ""
}
else {
decimal_part_length = value_string.length - decimal_location - 1
}
var pad_total = decimal_places - decimal_part_length
if (pad_total > 0) {
for (var counter = 1; counter <= pad_total; counter++) 
value_string += "0"
}
return value_string
}

function leading_zeros(number, new_length) {
// adds a set number of leading zeros to a number to make it the 
//necessary length ie convert '1' to '001' 
var value_string = number.toString();
var temp = new_length - value_string.length;
if(temp > 0) {
var j = '';
for (var i=0; i < temp; i++) {j += '0';}
value_string = j + value_string;
}
return value_string;
}

function gridloc(latitude,longitude) {
// calculations by g4vwl, modified by ei8ic
var latitude = -latitude;        
var lo = parseFloat(longitude);
var la = parseFloat(latitude);

lo = (lo+180)/20;
la = (la+90)/10;
var a = parseInt(lo);
var b = parseInt(la);
lo = (lo-a)*10;
la = (la-b)*10;
var c = Math.floor(lo);
var d = Math.floor(la);
var e = parseInt((lo-c)*24);
var f = parseInt((la-d)*24);
var upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var lower = "abcdefghijklmnopqrstuvwxyz";
a = upper.charAt(a);
b = upper.charAt(b);
e = lower.charAt(e); 
f = lower.charAt(f); 
return a+b+c+d+e+f
}

// distance and bearing   
var kilom, bearing, long_path;

function DegToRad(deg)
{
// convert degrees to radians
	var rad=180/Math.PI
	return (deg / rad);
}

function RadToDeg(rad)
{
// convert radians to degrees
	return rad * 180 / Math.PI;
}

function GreatCircleDist(latA,longA,latB,longB)
{
 // Calculate great circle distance between two points.
 // 6371km = earth's radius.
 	return 6371 * 2 * Math.asin(Math.sqrt(Math.cos(latA) * Math.cos(latB) * Math.pow(Math.sin((longA-longB)/2),2) + Math.pow(Math.sin((latA-latB)/2),2)));
}

function GreatCircleBearing(latA,longA,latB,longB)
{
	//Calculate the initial great circle bearing between two points
	longA = -longA; longB = -longB;
	if ((latA==latB) && (longA==longB)) return 0;
	var temp = (Math.cos(latA) * Math.cos(latB) * Math.cos(longA - longB)) + (Math.sin(latA) * Math.sin(latB));
	if (temp==1) temp = 0;
		else if (temp==-1) temp = Math.PI / 2;
		else temp= 0 - Math.atan(temp / Math.sqrt(1 - (temp * temp))) + Math.PI / 2;
	temp = ((Math.sin(latB) - Math.sin(latA) * Math.cos(temp)) / (Math.sin(temp) * Math.cos(latA)));
	if (1 - temp < .00000001) return 360;
		else if (1 + temp < .000000001) return 180;
		else {
			temp = RadToDeg(-Math.atan(temp / Math.sqrt(1 - (temp * temp))) + Math.PI / 2);
	if (Math.sin(longB - longA) > 0) temp = 360 - temp;
	return temp;
	}
}

function great_circle(latfinish,lonfinish)
{
// convert coordinates to radians
	lats = DegToRad(-my_lat);
	latf = DegToRad(-latfinish);
	longs = DegToRad(my_lon);
	longf = DegToRad(lonfinish);

// calculate distance and bearing
	var kilom = round_decimals(GreatCircleDist(lats,longs,latf,longf),0);
	distance = round_decimals(kilom * 0.6214,0);
	bearing = round_decimals(GreatCircleBearing(lats,longs,latf,longf),0);
	long_path = parseFloat(bearing) - 180;
	if (long_path < 0) {long_path = long_path + 360};
}

function gcdistance(latstart,lonstart,latfinish,lonfinish)
{
// convert coordinates to radians
	lats = DegToRad(-latstart);
	latf = DegToRad(-latfinish);
	longs = DegToRad(lonstart);
	longf = DegToRad(lonfinish);

// calculate distance and bearing
	var kilom = round_decimals(GreatCircleDist(lats,longs,latf,longf),0);
	distance = round_decimals(kilom * 0.6214,0);//m 
	bearing = round_decimals(GreatCircleBearing(lats,longs,latf,longf),0);
	long_path = parseFloat(bearing) - 180;
	if (long_path < 0) {long_path = long_path + 360};
}
