 //***********************************************************************
// include/convert_util.js
// Copyright LandNet Corporation, 2006
//***********************************************************************
function UTMUtil(wx, wy, zn)
{
	//Convert UTM to LatLon
	var LatLonArr=utm2latlon(wx, wy, zn);
		var nlat=LatLonArr[0];
		var nlon=LatLonArr[1];
	
	//Convert LatLon to UTM
	var UTMArr=latlon2utm(nlat, nlon);
		var nwx=UTMArr[0];
		var nwy=UTMArr[1];
		var nzn=UTMArr[2];
		
	//Return new array
	var UTMUtilArr=new Array();
		UTMUtilArr[0]=nwx;
		UTMUtilArr[1]=nwy;
		UTMUtilArr[2]=nzn;	
	return UTMUtilArr;
}

//Convert UTM to LatLon
function utm2latlon(wx, wy, zn)
{	
	utmNorthing=wy;
	utmEasting=wx;
	utmZone=zn;
	                
	var   k0 = 0.9996;
	var   a = 6378137;
	var   eccSquared = 0.00669438;
	var   eccPrimeSquared;
	var   e1 = parseFloat((1.0-Math.sqrt(1.0-eccSquared))/(1.0+Math.sqrt(1.0-eccSquared)));
	var   N1, T1, C1, R1, D, M;
	var   lngOrigin;
	var   mu, phi1, phi1Rad;
	var   x, y;
	var   zoneNumber;
	var rad2deg = parseFloat(180.0 / Math.PI);

	x = utmEasting - 500000.0; //remove 500,000 meter offset for longitude
	y = utmNorthing;

	zoneNumber = utmZone;
	             
	lngOrigin = (zoneNumber - 1)*6 - 180 + 3;  //+3 puts origin in middle of zone

	eccPrimeSquared = (eccSquared)/(1-eccSquared);

	M = y / k0;
	mu = M/(a*(1-eccSquared/4-3*eccSquared*eccSquared/64-5*eccSquared*eccSquared*eccSquared/256));

	phi1Rad = parseFloat(mu    + (3.0*e1/2.0-27.0*e1*e1*e1/32.0)*Math.sin(2.0*mu) 
	                  + (21.0*e1*e1/16.0-55.0*e1*e1*e1*e1/32.0)*Math.sin(4.0*mu)
	                  +(151.0*e1*e1*e1/96.0)*Math.sin(6.0*mu));
	phi1 = phi1Rad*rad2deg;

	N1 = parseFloat(a/Math.sqrt(1-eccSquared*Math.sin(phi1Rad)*Math.sin(phi1Rad)));
	T1 = parseFloat(Math.tan(phi1Rad)*Math.tan(phi1Rad));
	C1 = parseFloat(eccPrimeSquared*Math.cos(phi1Rad)*Math.cos(phi1Rad));
	R1 = parseFloat(a*(1.0-eccSquared)/Math.pow(1.0-eccSquared*Math.sin(phi1Rad)*Math.sin(phi1Rad), 1.5));
	D = x/(N1*k0);
	                
	lat = parseFloat(phi1Rad - (N1*Math.tan(phi1Rad)/R1)*
	              (D*D/2.0-
	               (5.0+3.0*T1+10.0*C1-4.0*C1*C1-
	                9.0*eccPrimeSquared)*D*D*D*D/24.0
	               +(61.0+90.0*T1+298.0*C1+45.0*T1*T1-
	                 252.0*eccPrimeSquared-3.0*C1*C1)*D*D*D*D*D*D/720.0));                

	lat = lat * rad2deg;

	lng = parseFloat((D-(1.0+2.0*T1+C1)*D*D*D/6.0+
	                (5.0-2.0*C1+28.0*T1-3.0*C1*C1+
	                 8.0*eccPrimeSquared+24.0*T1*T1)
	                *D*D*D*D*D/120.0)/Math.cos(phi1Rad));                                                
	            
	lng = lngOrigin + lng * rad2deg;
	
	var LatLonArr=new Array();
		LatLonArr[0]=lat;
		LatLonArr[1]=lng;	
	return LatLonArr;
}

//Convert LatLon to UTM
function latlon2utm(lat, lng)
{
	Lat=lat;
	Long=lng;
		
	with (Math)
	{
		Deg2Rad=PI/180.0;

		F0=0.9996;
		A1=6378137.0*F0;
		B1=6356752.3142*F0;
		K0=0;
		N0=0;
		E0=500000;

		N1=(A1-B1)/(A1+B1);
		N2=N1*N1; N3=N2*N1;
		E2=((A1*A1)-(B1*B1))/(A1*A1);

		K=Lat*Deg2Rad; L=Long*Deg2Rad;
		SINK=sin(K); COSK=cos(K); TANK=SINK/COSK; TANK2=TANK*TANK;
		COSK2=COSK*COSK; COSK3=COSK2*COSK;
		K3=K-K0; K4=K+K0;

		Merid=floor((Long)/6)*6+3;
		if ((Lat>=72) && (Long>=0))
		{
			if (Long<9) Merid=3; else if (Long<21) Merid=15; else if (Long<33) Merid=27; else if (Long<42) Merid=39;
		}
		if ((Lat>=56) && (Lat<64))
		{
			if ((Long>=3) && (Long<12)) Merid=9;
		}
		MeridWest=Merid<0;
		if (MeridWest) {MeridValue="W";} else {MeridValue="E";}
		MeridianForm=abs(Merid);
		L0=Merid*Deg2Rad;
			
		J3=K3*(1+N1+1.25*(N2+N3));
		J4=sin(K3)*cos(K4)*(3*(N1+N2+0.875*N3));
		J5=sin(2*K3)*cos(2*K4)*(1.875*(N2+N3));
		J6=sin(3*K3)*cos(3*K4)*35/24*N3;
		M=(J3-J4+J5-J6)*B1;

		Temp=1-E2*SINK*SINK;
		V=A1/sqrt(Temp);
		R=V*(1-E2)/Temp;
		H2=V/R-1.0;

		P=L-L0; P2=P*P; P4=P2*P2;
		J3=M+N0;
		J4=V/2*SINK*COSK;
		J5=V/24*SINK*(COSK3)*(5-(TANK2)+9*H2);
		J6=V/720*SINK*COSK3*COSK2*(61-58*(TANK2)+TANK2*TANK2);
		North=J3+P2*J4+P4*J5+P4*P2*J6;
			   
		J7=V*COSK;
		J8=V/6*COSK3*(V/R-TANK2);
		J9=V/120*COSK3*COSK2;
		J9=J9*(5-18*TANK2+TANK2*TANK2+14*H2-58*TANK2*H2);
		East=E0+P*J7+P2*P*J8+P4*P*J9;
		IEast=round(East); INorth=round(North);
			
		Easting=IEast;
		Northing=INorth;

		EastStr=""+abs(IEast); NorthStr=""+abs(INorth);
		while (EastStr.length<7) EastStr="0"+EastStr;
		while (NorthStr.length<7) NorthStr="0"+NorthStr;
		GR100km=eval(EastStr.substring(1,2)+NorthStr.substring(1,2));

		LongZone=(Merid-3)/6+31;
		if (LongZone % 1 != 0)
		{
			GR="false";
		}	
		else
		{
			if (IEast<100000 || Lat<-80 || IEast>899999 || Lat>=84)
			{
				GR="false";
			}	
			else
		    {
				Pos=round(Lat/8-0.5)+10+2;

				Pos=round(abs(INorth)/100000-0.5);
				while (Pos>19) Pos=Pos-20;
							
				if (LongZone % 2 == 0)
				{ 
					Pos=Pos+5; if (Pos>19) Pos=Pos-20; 
				}
				Pos=GR100km/10-1;
				P=LongZone; 
				while (P>3) P=P-3;
				Pos=Pos+((P-1)*8);

				Zone=LongZone;
		    }
		}
	}

	wx = Easting;
	wy = Northing;
	zn = Zone;
	
	var UTMArr=new Array();
		UTMArr[0]=wx;
		UTMArr[1]=wy;
		UTMArr[2]=zn;
	return UTMArr;
}
function feet2meters(ft)
{
	var m=ft*0.3048;
	return m;
}
function miles2meters(ml)
{
	var m=ml*1609.344;
	return m;
}
function meters2feet(m)
{
	var ft=m*3.2808399;
	return ft;
}
function meters2miles(m)
{
	var ml=m*0.000621371192;
	return ml;
}
function feet2miles(ft)
{
	var ml=ft/5280;
	return ml;
}
function miles2feet(ml)
{
	var ft=ml*5280;
	return ft;
}
function acres2sqmeters(ac)
{
	var sqm=ac*4046.85642;
	return sqm;
}
function sqmeters2hectares(sqm)
{
	var hc=sqm/10000;
	return hc;
}