
/* Global Variables
  -----------------------------------------------------*/
var radius;
var MAX_VAL = 4;
var MAXLONG = 2147483647.0;
var DBLLONG = 4.61168601e18;
var HALF_PI = (Math.PI*0.5);
var TWO_PI = (Math.PI*2.0);
var EPSLN = 1.0e-10;
var R2D = 57.2957795131;
var D2R = 1.745329251994328e-2;
var S2R	= 4.848136811095359e-6;
var CENTERLAT = 45.0000 * 3600 * S2R;
var CENTERLONG = -100.0000 * 3600 * S2R;

radius = 6370997.0;
function ConvertToDDMMSSEncoded(pak)
{
var conS;
var secs;
var secstr;
var degs;
var mins;
var minsStr;
var sgna;
var degDiff;

    sgna = " ";
    pak = pak * R2D;
    //alert('value to convert is: ' + pak);
    if (pak < 0.0)
        sgna = "-";
    conS = Math.abs(pak).toString();
    var posX;
    posX = conS.indexOf(".");
    degs = conS.substring(0, posX);
    //alert('degs contains: ' + degs);
    conS = conS.substring(posX, conS.length);
    //alert('whats left is: ' + conS);
    
    mins = (conS * 60).toString();
    posX = mins.indexOf(".");
    minsStr = mins.substring(0, posX);
    
    secstr = mins.substring(posX, mins.length);
    secs = Math.round(secstr * 60);
    if ((secs == "") || (secs == "0"))
        secs = "00";
    
   if (secs == 60)
   {
        minsStr = (minsStr * 1) + 1;
        secs = "00";
    }
   if ((minsStr == "") || (minsStr == "0"))
   {
        minsStr = "00";
   }
   if (minsStr == 60)
   {
        degs = (degs * 1) + 1;
        minsStr = "00";
    }
    if (sgna == "-")
      conS = (-1) * conS;
   
    if (((minsStr * 1) < 10) && ((minsStr * 1) > 0))
        minsStr = "0" + minsStr;
    
    if (((secs * 1) < 10) && ((secs * 1) > 0))
        secs = "0" + secs;
 
    var dchar;
    var mchar;
    var schar;
    dchar = ".";
    mchar = "-"; 
    schar = "_"; 
    var degStr;

    if ((degs * 1) > 180)
    {
      degDiff = degs - 180;
      degs = (180 - degDiff) * -1;
      degStr = degs + dchar + " " + minsStr + mchar + secs + schar;
    }
    else
    {
      degStr = degs + dchar + minsStr + mchar +  secs + schar;
    }
    
    return(degStr);
}
function ConvertToDDMMSS(pak)
{
var conS;
var secs;
var secstr;
var degs;
var mins;
var minsStr;
var sgna;
var degDiff;

    sgna = " ";
    pak = pak * R2D;
    //alert('value to convert is: ' + pak);
    if (pak < 0.0)
        sgna = "-";
    conS = Math.abs(pak).toString();
    var posX;
    posX = conS.indexOf(".");
    degs = conS.substring(0, posX);
    //alert('degs contains: ' + degs);
    conS = conS.substring(posX, conS.length);
    //alert('whats left is: ' + conS);
    
    mins = (conS * 60).toString();
    posX = mins.indexOf(".");
    minsStr = mins.substring(0, posX);
    
    secstr = mins.substring(posX, mins.length);
    secs = Math.round(secstr * 60);
    if ((secs == "") || (secs == "0"))
        secs = "00";
    
   if (secs == 60)
   {
        minsStr = (minsStr * 1) + 1;
        secs = "00";
    }
   if ((minsStr == "") || (minsStr == "0"))
   {
        minsStr = "00";
   }
   if (minsStr == 60)
   {
        degs = (degs * 1) + 1;
        minsStr = "00";
    }
    if (sgna == "-")
      conS = (-1) * conS;
   
    if (((minsStr * 1) < 10) && ((minsStr * 1) > 0))
        minsStr = "0" + minsStr;
    
    if (((secs * 1) < 10) && ((secs * 1) > 0))
        secs = "0" + secs;
 
    var dchar;
    var mchar;
    var schar;
    dchar = unescape('%B0');
    mchar = "'"; //String(1, 39);
    schar = '"'; String(1, 34);
    var degStr;

    if ((degs * 1) > 180)
    {
      degDiff = degs - 180;
      degs = (180 - degDiff) * -1;
      degStr = degs + dchar + " " + minsStr + mchar + " " + secs + "''";
    }
    else
    {
      degStr = degs + dchar + " " + minsStr + mchar + " " + secs + "''";
    }
    
    return(degStr);
}
/* Function to eliminate roundoff errors in asin
----------------------------------------------*/
function asinz (con)
{
 if (Math.abs(con) > 1.0)
   {
   if (con > 1.0)
     con = 1.0;
   else
     con = -1.0;
   }
 return(Math.asin(con));
}

/* Function to adjust a longitude angle to range from -180 to 180 radians
   added if statments 
  -----------------------------------------------------------------------*/
function adjust_lon(x) 
/* x is an Angle in radians			*/
{
var temp;
var count = 0;
for(;;)
  {
  if (Math.abs(x)<=Math.PI)
     break;
  else
  if ((Math.abs(x /Math.PI)) < 2)
     x = x-(sign(x) *TWO_PI);
  else
  if ((Math.abs(x / TWO_PI)) < MAXLONG)
     {
     x = x-(((x / TWO_PI))*TWO_PI);
     }
  else
  if ((Math.abs(x / (MAXLONG * TWO_PI))) < MAXLONG)
     {
     x = x-(((x / (MAXLONG * TWO_PI))) * (TWO_PI * MAXLONG));
     }
  else
  if ((Math.abs(x / (DBLLONG * TWO_PI))) < MAXLONG)
     {
     x = x-(((x / (DBLLONG * TWO_PI))) * (TWO_PI * DBLLONG));
     }
  else
     x = x-(sign(x) *TWO_PI);
  count++;
  if (count > MAX_VAL)
     break;
  }

return x;
}

/* Function to return the sign of an argument
  ------------------------------------------*/
function sign(x){ if (x < 0.0) return(-1); else return(1);}

function LamToGeo(x,y){

var sinLat;				 //         ' Sine of the center latitude
var cosLat;			     //      ' Cosine of the center latitude
sinLat = Math.sin(CENTERLAT);
cosLat = Math.cos(CENTERLAT);
var Rh = 0.0;  //
var z = 0.0;  //           ' Great circle dist from proj center to given point
var sin_z = 0.0;  //       ' Sine of z
var cos_z = 0.0;  //       ' Cosine of z
var temp = 0.0;  //        ' Re-used temporary variable
var lon = 0.0;  //         ' Longitude to return
var lat = 0.0;  //         ' Latitude to return

Rh = Math.sqrt(x * x + y * y);
temp = Rh / (2 * radius);
if (temp > 1) 
   return(' ');

z = 2 * asinz(temp);

sin_z = Math.sin(z);
cos_z = Math.cos(z);

lon = CENTERLONG;
if (Math.abs(Rh) > EPSLN) {
   lat = asinz(sinLat * cos_z + cosLat * sin_z * y / Rh);
   temp = Math.abs(CENTERLAT) - HALF_PI;
   if (Math.abs(temp) > EPSLN) {
       temp = cos_z - sinLat * Math.sin(lat)
       if (temp != 0) {
            var s;  //
            s = CENTERLONG + Math.atan2((x * sin_z * cosLat), (temp * Rh));
            lon = adjust_lon(CENTERLONG + Math.atan2((x * sin_z * cosLat), (temp * Rh)));
       }
   else if (CENTERLAT < 0) {
       lon = adjust_lon(CENTERLONG - Math.atan2(-x, y));
   }
   else
       lon = adjust_lon(CENTERLONG + Math.atan2(x, -y));
   }
else
   lat = CENTERLAT;
}

   var strcord;
   strcord = '';   
   strcord = ConvertToDDMMSS(lat) + ' North, ';
   strcord = strcord + ConvertToDDMMSS(lon) ;
   lon = (lon * 57.2957795131);
   if (lon < 0) 
     strcord = strcord + ' West';
   else
     strcord = strcord + ' East';
   return (strcord);
    
}
function geoToLam(lat, lon) {
//Function to convert Latitude and Longitude to Lamberts Azimuthal
//Coordinates
	//alert('lat is: ' + lat + ', long is: ' + lon);
	var sinCLat;
	var cosCLat;
	sinCLat = Math.sin(CENTERLAT);
	cosCLat = Math.cos(CENTERLAT);
	var x;
	var y;
	var deltaLong;	//     'Delta longitude (Given longitude - center
	var sinDeltaLong;  //  'Sine of the delta longitude
	var cosDeltaLong; 	// 'Cosine of the delta longitude
	var g;	//             ' temporary variable
	var ksp;	//         ' height above elipsiod
	var sinLat;
	var cosLat;
	var	lambertPntStr;

	lon = lon * D2R;	//convert to radians
	lat = lat * D2R;	//convert to radians
	lambertPntStr = ' ';
	sinLat = Math.sin(lat);
	cosLat = Math.cos(lat);
	deltaLong = adjust_lon(lon - CENTERLONG);
	sinDeltaLong = Math.sin(deltaLong);
	cosDeltaLong = Math.cos(deltaLong);

	g = parseFloat(sinCLat * sinLat) + parseFloat(cosCLat * cosLat * cosDeltaLong);
	if (g == -1) {
    	alert ('There was an error in the set up of the function');
	}
	ksp = radius * Math.sqrt((2 / (1 + parseFloat(g))),2);
	x = ksp * cosLat * sinDeltaLong;
	y = ksp * (parseFloat(cosCLat * sinLat) - parseFloat(sinCLat * cosLat * cosDeltaLong));
	lambertPntStr = x + ',' + y;
	return lambertPntStr;
}


function LamToGeoEncoded(x,y){

var sinLat;				 //         ' Sine of the center latitude
var cosLat;			     //      ' Cosine of the center latitude
sinLat = Math.sin(CENTERLAT);
cosLat = Math.cos(CENTERLAT);
var Rh = 0.0;  //
var z = 0.0;  //           ' Great circle dist from proj center to given point
var sin_z = 0.0;  //       ' Sine of z
var cos_z = 0.0;  //       ' Cosine of z
var temp = 0.0;  //        ' Re-used temporary variable
var lon = 0.0;  //         ' Longitude to return
var lat = 0.0;  //         ' Latitude to return

Rh = Math.sqrt(x * x + y * y);
temp = Rh / (2 * radius);
if (temp > 1) 
   return(' ');

z = 2 * asinz(temp);

sin_z = Math.sin(z);
cos_z = Math.cos(z);

lon = CENTERLONG;
if (Math.abs(Rh) > EPSLN) {
   lat = asinz(sinLat * cos_z + cosLat * sin_z * y / Rh);
   temp = Math.abs(CENTERLAT) - HALF_PI;
   if (Math.abs(temp) > EPSLN) {
       temp = cos_z - sinLat * Math.sin(lat)
       if (temp != 0) {
            var s;  //
            s = CENTERLONG + Math.atan2((x * sin_z * cosLat), (temp * Rh));
            lon = adjust_lon(CENTERLONG + Math.atan2((x * sin_z * cosLat), (temp * Rh)));
       }
   else if (CENTERLAT < 0) {
       lon = adjust_lon(CENTERLONG - Math.atan2(-x, y));
   }
   else
       lon = adjust_lon(CENTERLONG + Math.atan2(x, -y));
   }
else
   lat = CENTERLAT;
}

   var strcord;
   strcord = '';   
   strcord = ConvertToDDMMSSEncoded(lat) + 'North, ';
   strcord = strcord + ConvertToDDMMSSEncoded(lon) ;
   lon = (lon * 57.2957795131);
   if (lon < 0) 
     strcord = strcord + 'West';
   else
     strcord = strcord + 'East';
   return (strcord); 
}
