
var ngFunctionsPresent=true;var UNDEFINED_STR="undefined";var UTMEasting
var UTMNorthing
var UTMZone
var zoneNumber
var FOURTHPI=Math.PI/4;var DEG_2_RAD=Math.PI/180;var RAD_2_DEG=180.0/Math.PI;var BLOCK_SIZE=100000;var IS_NAD83_DATUM=true;var GRIDSQUARE_SET_COL_SIZE=8;var GRIDSQUARE_SET_ROW_SIZE=20;var EASTING_OFFSET=500000.0;var NORTHING_OFFSET=10000000.0;var k0=0.9996;var EQUATORIAL_RADIUS;var ECCENTRICTY_SQUARED;var ECC_PRIME_SQUARED;if(IS_NAD83_DATUM){EQUATORIAL_RADIUS=6378137.0;ECC_SQUARED=0.006694380023;}
else{EQUATORIAL_RADIUS=6378206.4
ECC_SQUARED=0.006768658;}
var ECC_PRIME_SQUARED=ECC_SQUARED/(1-ECC_SQUARED);var E1=(1-Math.sqrt(1-ECC_SQUARED))/(1+Math.sqrt(1-ECC_SQUARED));function getZoneNumber(lat,lon){lat=parseFloat(lat);lon=parseFloat(lon);if(lon>360||lon<-180||lat>90||lat<-90){alert('Bad input. lat: '+lat+' lon: '+lon);}
var lonTemp=(lon+180)-parseInt((lon+180)/360)*360-180;var zoneNumber=parseInt((lonTemp+180)/6)+1;if(lat>=56.0&&lat<64.0&&lonTemp>=3.0&&lonTemp<12.0){zoneNumber=32;}
if(lat>=72.0&&lat<84.0){if(lonTemp>=0.0&&lonTemp<9.0){zoneNumber=31;}
else if(lonTemp>=9.0&&lonTemp<21.0){zoneNumber=33;}
else if(lonTemp>=21.0&&lonTemp<33.0){zoneNumber=35;}
else if(lonTemp>=33.0&&lonTemp<42.0){zoneNumber=37;}}
return zoneNumber;}
function LLtoUTM(lat,lon,utmcoords,zone){lat=parseFloat(lat);lon=parseFloat(lon);if(lat>84.0||lat<-80.0){return(UNDEFINED_STR);}
if(lon>360||lon<-180||lat>90||lat<-90){alert('Bad input. lat: '+lat+' lon: '+lon);}
lonTemp=(lon+180)-parseInt((lon+180)/360)*360-180;latRad=lat*DEG_2_RAD;lonRad=lonTemp*DEG_2_RAD;if(!zone){zoneNumber=getZoneNumber(lat,lon);}
else{zoneNumber=zone}
lonOrigin=(zoneNumber-1)*6-180+3;lonOriginRad=lonOrigin*DEG_2_RAD;UTMZone=zoneNumber+""+UTMLetterDesignator(lat)+" ";N=EQUATORIAL_RADIUS/Math.sqrt(1-ECC_SQUARED*Math.sin(latRad)*Math.sin(latRad));T=Math.tan(latRad)*Math.tan(latRad);C=ECC_PRIME_SQUARED*Math.cos(latRad)*Math.cos(latRad);A=Math.cos(latRad)*(lonRad-lonOriginRad);M=EQUATORIAL_RADIUS*((1-ECC_SQUARED/4
-3*(ECC_SQUARED*ECC_SQUARED)/64
-5*(ECC_SQUARED*ECC_SQUARED*ECC_SQUARED)/256)*latRad
-(3*ECC_SQUARED/8+3*ECC_SQUARED*ECC_SQUARED/32
+45*ECC_SQUARED*ECC_SQUARED*ECC_SQUARED/1024)*Math.sin(2*latRad)+(15*ECC_SQUARED*ECC_SQUARED/256
+45*ECC_SQUARED*ECC_SQUARED*ECC_SQUARED/1024)*Math.sin(4*latRad)
-(35*ECC_SQUARED*ECC_SQUARED*ECC_SQUARED/3072)*Math.sin(6*latRad));UTMEasting=(k0*N*(A+(1-T+C)*(A*A*A)/6
+(5-18*T+T*T+72*C-58*ECC_PRIME_SQUARED)*(A*A*A*A*A)/120)
+EASTING_OFFSET);UTMNorthing=(k0*(M+N*Math.tan(latRad)*((A*A)/2+(5-T+9*C+4*C*C)*(A*A*A*A)/24
+(61-58*T+T*T+600*C-330*ECC_PRIME_SQUARED)*(A*A*A*A*A*A)/720)));utmcoords[0]=UTMEasting
utmcoords[1]=UTMNorthing
utmcoords[2]=zoneNumber}
function LLtoUSNG(lat,lon,precision){lat=parseFloat(lat);lon=parseFloat(lon);var coords=[]
LLtoUTM(lat,lon,coords)
var UTMEasting=coords[0]
var UTMNorthing=coords[1]
if(lat<0){UTMNorthing+=NORTHING_OFFSET;}
USNGLetters=findGridLetters(zoneNumber,UTMNorthing,UTMEasting);USNGNorthing=Math.round(UTMNorthing)%BLOCK_SIZE;USNGEasting=Math.round(UTMEasting)%BLOCK_SIZE;USNGNorthing=Math.floor(USNGNorthing/Math.pow(10,(5-precision)))
USNGEasting=Math.floor(USNGEasting/Math.pow(10,(5-precision)))
USNG=getZoneNumber(lat,lon)+UTMLetterDesignator(lat)+" "+USNGLetters+" ";for(i=String(USNGEasting).length;i<precision;i++){USNG+="0";}
USNG+=USNGEasting+" ";for(i=String(USNGNorthing).length;i<precision;i++){USNG+="0";}
USNG+=USNGNorthing;return(USNG);}
function UTMLetterDesignator(lat){lat=parseFloat(lat);if((84>=lat)&&(lat>=72))
letterDesignator='X';else if((72>lat)&&(lat>=64))
letterDesignator='W';else if((64>lat)&&(lat>=56))
letterDesignator='V';else if((56>lat)&&(lat>=48))
letterDesignator='U';else if((48>lat)&&(lat>=40))
letterDesignator='T';else if((40>lat)&&(lat>=32))
letterDesignator='S';else if((32>lat)&&(lat>=24))
letterDesignator='R';else if((24>lat)&&(lat>=16))
letterDesignator='Q';else if((16>lat)&&(lat>=8))
letterDesignator='P';else if((8>lat)&&(lat>=0))
letterDesignator='N';else if((0>lat)&&(lat>=-8))
letterDesignator='M';else if((-8>lat)&&(lat>=-16))
letterDesignator='L';else if((-16>lat)&&(lat>=-24))
letterDesignator='K';else if((-24>lat)&&(lat>=-32))
letterDesignator='J';else if((-32>lat)&&(lat>=-40))
letterDesignator='H';else if((-40>lat)&&(lat>=-48))
letterDesignator='G';else if((-48>lat)&&(lat>=-56))
letterDesignator='F';else if((-56>lat)&&(lat>=-64))
letterDesignator='E';else if((-64>lat)&&(lat>=-72))
letterDesignator='D';else if((-72>lat)&&(lat>=-80))
letterDesignator='C';else
letterDesignator='Z';return letterDesignator;}
function findSet(zoneNum){zoneNum=parseInt(zoneNum);zoneNum=zoneNum%6;switch(zoneNum){case 0:return 6;break;case 1:return 1;break;case 2:return 2;break;case 3:return 3;break;case 4:return 4;break;case 5:return 5;break;default:return-1;break;}}
function findGridLetters(zoneNum,northing,easting){zoneNum=parseInt(zoneNum);northing=parseFloat(northing);easting=parseFloat(easting);row=1;north_1m=Math.round(northing);while(north_1m>=BLOCK_SIZE){north_1m=north_1m-BLOCK_SIZE;row++;}
row=row%GRIDSQUARE_SET_ROW_SIZE;col=0;east_1m=Math.round(easting)
while(east_1m>=BLOCK_SIZE){east_1m=east_1m-BLOCK_SIZE;col++;}
col=col%GRIDSQUARE_SET_COL_SIZE;return lettersHelper(findSet(zoneNum),row,col);}
function lettersHelper(set,row,col){if(row==0){row=GRIDSQUARE_SET_ROW_SIZE-1;}
else{row--;}
if(col==0){col=GRIDSQUARE_SET_COL_SIZE-1;}
else{col--;}
switch(set){case 1:l1="ABCDEFGH";l2="ABCDEFGHJKLMNPQRSTUV";return l1.charAt(col)+l2.charAt(row);break;case 2:l1="JKLMNPQR";l2="FGHJKLMNPQRSTUVABCDE";return l1.charAt(col)+l2.charAt(row);break;case 3:l1="STUVWXYZ";l2="ABCDEFGHJKLMNPQRSTUV";return l1.charAt(col)+l2.charAt(row);break;case 4:l1="ABCDEFGH";l2="FGHJKLMNPQRSTUVABCDE";return l1.charAt(col)+l2.charAt(row);break;case 5:l1="JKLMNPQR";l2="ABCDEFGHJKLMNPQRSTUV";return l1.charAt(col)+l2.charAt(row);break;case 6:l1="STUVWXYZ";l2="FGHJKLMNPQRSTUVABCDE";return l1.charAt(col)+l2.charAt(row);break;}}
function UTMtoLL(UTMNorthing,UTMEasting,UTMZoneNumber,ret){var xUTM=parseFloat(UTMEasting)-EASTING_OFFSET;var yUTM=parseFloat(UTMNorthing);var zoneNumber=parseInt(UTMZoneNumber);var lonOrigin=(zoneNumber-1)*6-180+3;var M=yUTM/k0;var mu=M/(EQUATORIAL_RADIUS*(1-ECC_SQUARED/4-3*ECC_SQUARED*ECC_SQUARED/64-5*ECC_SQUARED*ECC_SQUARED*ECC_SQUARED/256));var phi1Rad=mu+(3*E1/2-27*E1*E1*E1/32)*Math.sin(2*mu)
+(21*E1*E1/16-55*E1*E1*E1*E1/32)*Math.sin(4*mu)
+(151*E1*E1*E1/96)*Math.sin(6*mu);var phi1=phi1Rad*RAD_2_DEG;var N1=EQUATORIAL_RADIUS/Math.sqrt(1-ECC_SQUARED*Math.sin(phi1Rad)*Math.sin(phi1Rad));var T1=Math.tan(phi1Rad)*Math.tan(phi1Rad);var C1=ECC_PRIME_SQUARED*Math.cos(phi1Rad)*Math.cos(phi1Rad);var R1=EQUATORIAL_RADIUS*(1-ECC_SQUARED)/Math.pow(1-ECC_SQUARED*Math.sin(phi1Rad)*Math.sin(phi1Rad),1.5);var D=xUTM/(N1*k0);var lat=phi1Rad-(N1*Math.tan(phi1Rad)/R1)*(D*D/2-(5+3*T1+10*C1-4*C1*C1-9*ECC_PRIME_SQUARED)*D*D*D*D/24+(61+90*T1+298*C1+45*T1*T1-252*ECC_PRIME_SQUARED-3*C1*C1)*D*D*D*D*D*D/720);lat=lat*RAD_2_DEG;var lon=(D-(1+2*T1+C1)*D*D*D/6+(5-2*C1+28*T1-3*C1*C1+8*ECC_PRIME_SQUARED+24*T1*T1)*D*D*D*D*D/120)/Math.cos(phi1Rad);lon=lonOrigin+lon*RAD_2_DEG;ret.lat=lat;ret.lon=lon;return;}
var UTMGzdLetters="NPQRSTUVWX";var USNGSqEast="ABCDEFGHJKLMNPQRSTUVWXYZ"
var USNGSqLetOdd="ABCDEFGHJKLMNPQRSTUV";var USNGSqLetEven="FGHJKLMNPQRSTUVABCDE";function USNGtoUTM(zone,let,sq1,sq2,east,north,ret){var zoneBase=[1.1,2,0,2.9,3.8,4.7,5.6,6.5,7.3,8.2,9.1,0,0.8,1.7,2.6,3.5,4.4,5.3,6.2,7.0,7.9];var segBase=[0,2,2,2,4,4,6,6,8,8,0,0,0,2,2,4,4,6,6,6];var eSqrs=USNGSqEast.indexOf(sq1);var appxEast=1+eSqrs%8;var letNorth="CDEFGHJKLMNPQRSTUVWX".indexOf(let);if(zone%2)
var nSqrs="ABCDEFGHJKLMNPQRSTUV".indexOf(sq2)
else
var nSqrs="FGHJKLMNPQRSTUVABCDE".indexOf(sq2);var zoneStart=zoneBase[letNorth];var appxNorth=Number(segBase[letNorth])+nSqrs/10;if(appxNorth<zoneStart)
appxNorth+=2;ret.N=appxNorth*1000000+Number(north)*Math.pow(10,5-north.length);ret.E=appxEast*100000+Number(east)*Math.pow(10,5-east.length)
ret.zone=zone;ret.letter=let;return;}
function USNGtoLL(usngStr_input,latlon){var usngp=new Object();parseUSNG_str(usngStr_input,usngp);var coords=new Object();USNGtoUTM(usngp.zone,usngp.let,usngp.sq1,usngp.sq2,usngp.east,usngp.north,coords)
if(usngp.let<'N'){coords.N-=NORTHING_OFFSET}
UTMtoLL(coords.N,coords.E,usngp.zone,coords)
latlon[0]=coords.lat
latlon[1]=coords.lon}
function parseUSNG_str(usngStr_input,parts)
{var j=0;var k;var usngStr=[];var usngStr_temp=[]
usngStr_temp=usngStr_input.toUpperCase()
var regexp=/%20/g
usngStr=usngStr_temp.replace(regexp,"")
regexp=/ /g
usngStr=usngStr_temp.replace(regexp,"")
if(usngStr.length<7){alert("This application requires minimum USNG precision of 10,000 meters")
return 0;}
parts.zone=usngStr.charAt(j++)*10+usngStr.charAt(j++)*1;parts.let=usngStr.charAt(j++)
parts.sq1=usngStr.charAt(j++)
parts.sq2=usngStr.charAt(j++)
parts.precision=(usngStr.length-j)/2;parts.east='';parts.north='';for(var k=0;k<parts.precision;k++){parts.east+=usngStr.charAt(j++)}
if(usngStr[j]==" "){j++}
for(var k=0;k<parts.precision;k++){parts.north+=usngStr.charAt(j++)}}
function isUSNG(inputStr){var j=0;var k;var usngStr=[];var strregexp
usngStr=inputStr.toUpperCase()
var regexp=/%20/g
usngStr=usngStr.replace(regexp,"")
regexp=/ /g
usngStr=usngStr.replace(regexp,"")
if(usngStr.length>15){return 0;}
strregexp=new RegExp("^[0-9]{2}[CDEFGHJKLMNPQRSTUVWX]$")
if(usngStr.match(strregexp)){alert("Input appears to be a UTM zone...more precision is required to display a correct result.")
return 0;}
strregexp=new RegExp("^[0-9]{2}[CDEFGHJKLMNPQRSTUVWX][ABCDEFGHJKLMNPQRSTUVWXYZ][ABCDEFGHJKLMNPQRSTUV]([0-9][0-9]){0,5}")
if(!usngStr.match(strregexp)){return 0;}
if(usngStr.length<7){alert(usngStr+" Appears to be a USNG string, but this application requires precision of at least 10,000 meters")
return 0;}
return usngStr;}
function isLatLngDM(inputStr){var j=0;var k;var dmStr=[];var strregexp
dmStr=inputStr.toUpperCase()
strregexp=new RegExp("^([0-9]{1,3})-([0-9]{1,2}(\.[0-9]*)?)([N|S]+)( *)\,( *)([0-9]{1,3})-([0-9]{1,2}(\.[0-9]*)?)([W|E]+) *")
if(dmStr.match(strregexp)){parts=strregexp.exec(dmStr.match(strregexp));var lat=parts[1]*1+(parts[2]/60);var lng=parts[7]*1+(parts[8]/60);if(parts[4]=='S'){lat*=-1;}
if(parts[10]=='W'){lng*=-1;}
return(new GLatLng(lat,lng))}
strregexp=new RegExp("^([0-9]{1,3})-([0-9]{1,2}(\.[0-9]*)?)([W|E]+)( *)\,( *)([0-9]{1,3})-([0-9]{1,2}(\.[0-9]*)?)([N|S]+) *")
if(dmStr.match(strregexp)){parts=strregexp.exec(dmStr.match(strregexp));var lng=parts[1]*1+(parts[2]/60);var lat=parts[7]*1+(parts[8]/60);if(parts[4]=='W'){lng*=-1;}
if(parts[10]=='S'){lat*=-1;}
return(new GLatLng(lat,lng))}
return 0;}
function LLtoMGRS(lat,lon,precision)
{var mgrs_str="";var usng_str=LLtoUSNG(lat,lon,precision);var regexp=/ /g
mgrs_str=usng_str.replace(regexp,"")
return(mgrs_str);}
function GUsngtoLL(str){var latlng=[]
USNGtoLL(str,latlng)
return(new GLatLng(latlng[0],latlng[1]))}
