﻿//elipsoide de Hayford: Elipsoide de revolución definido por los parámetros: 
//a=6378388 m 
//b=6356911.946 m 
//Aplanamiento=1:297 
//En España se ha adoptado como datum horizontal o elipsoide de referencia con datum Potsdam. 

var hayford=new Array(2)
hayford.e2=0.0067681703
hayford.c=6399936.609

function calcularBsubPhi(phi)
{
	var A1,A2,J2,J4,J6,alpha,beta,gamma
	var cos2phi=Math.pow(Math.cos(phi),2)
	A1=Math.sin(2*phi)
	A2=A1*cos2phi
	J2=phi+A1/2
	J4=(3*J2+A2)/4
	J6=(5*J4+A2*cos2phi)/3
	alpha=3/4*hayford.e2
	beta=5/3*Math.pow(alpha,2)
	gamma=35/27*Math.pow(alpha,3)
	return 0.9996*hayford.c*(phi-alpha*J2+beta*J4-gamma*J6)
}
function meridCentralHuso(huso)
{
	return 6*huso-183
}
function determHuso(lambda)
{
	var huso=(lambda/6)+31
	while(huso<1)
		huso+=60
	return parseInt(huso)
}
function geo2utm2(lat,lon,huso)
{
	var xi,A,n,nu,tseta,BsubPhi,deltaLambda,lambda0,lambda,phi,cos2phi,husoXY
	phi=lat*Math.PI/180
	lambda=lon*Math.PI/180
	husoXY=new Array(3)
	husoXY[0]=huso
	lambda0=meridCentralHuso(huso)*Math.PI/180
	deltaLambda=lambda-lambda0
	A=Math.cos(phi)*Math.sin(deltaLambda)
	xi=1/2*Math.log((1+A)/(1-A))
	n=Math.atan2(Math.tan(phi),Math.cos(deltaLambda))-phi
	cos2phi=Math.pow(Math.cos(phi),2)
	nu=hayford.c*0.9996/Math.pow((1.0+hayford.e2*cos2phi),0.5)
	tseta=hayford.e2/2*xi*xi*cos2phi
	BsubPhi=calcularBsubPhi(phi)
	husoXY[2]=n*nu*(1+tseta)+BsubPhi
	husoXY[1]=xi*nu*(1+tseta/3)+500000
	return husoXY
}
function geo2utm(lat,lon)
{
	return geo2utm2(lat,lon,determHuso(lon))
}
function utm2geo(huso,x,y)
{
	var phi,nu,a,b,tseta,xi,eta,senhXi,deltaLambda,t
	var cos2phi,BsubPhi,lat,lon,latLon,sumando1,sumando2,corchete,lambda0
	x-=500000
	phi=y/6366197.724/0.9996
	cos2phi=Math.pow(Math.cos(phi),2)
	nu=hayford.c*0.9996/Math.pow((1+hayford.e2*cos2phi),0.5)
	a=x/nu
	BsubPhi=calcularBsubPhi(phi)
	b=(y-BsubPhi)/nu
	tseta=hayford.e2*a*a/2*cos2phi
	xi=a*(1-tseta/3)
	eta=b*(1-tseta)+phi
	senhXi=(Math.exp(xi)-Math.exp(-xi))/2
	deltaLambda=Math.atan2(senhXi,Math.cos(eta))
	t=Math.atan(Math.cos(deltaLambda)*Math.tan(eta))
	sumando1=hayford.e2*cos2phi
	sumando2=3/2*hayford.e2*Math.sin(phi)*Math.cos(phi)*(t-phi)
	corchete=1+sumando1-sumando2
	lambda0=meridCentralHuso(huso)*Math.PI/180
	latLon=new Array(2)
	lat=phi+corchete*(t-phi)
	lon=deltaLambda+lambda0
	latLon[0]=lat*180/Math.PI
	latLon[1]=lon*180/Math.PI
	return latLon
}

function desgloseGeo(valor)
{
	valor=Math.abs(valor)
	var gra=Math.floor(valor)
	valor=(valor-gra)*60
	var min=Math.floor(valor)
	valor=(valor-min)*60
	var seg=Math.floor(valor)
	valor=Math.round((valor-seg)*1000)/1000
	valor=new String(valor).substring(2)
	while (valor.length<3)
	{valor += "0"}
	//return "<td width=26>"+gra+"°</td><td width=18>"+min+"'</td><td width=41>"+seg+"."+valor+"''</td><td width=20 align=center>"
	return "<td>"+gra+"°</td><td>"+min+"'</td><td>"+seg+"."+valor+"''</td><td>"
	//return (gra+"° "+min+"' "+seg+"."+valor+"''");
}

function mostrarCursor(e)
{
	cursorDentro=true
	//cursor(e)


	if (verRotuloUTM)
	{
		var UTMx=(factor*(cursorx-IMAGEN_x))+(new Number(xmin0))
		var UTMy=( factor*(IMAGEN_y+pixalto0-cursory) )+(new Number(ymin0))
		
		var geo=utm2geo(30,UTMx,0+UTMy)
		var utm=geo2utm(geo[0],geo[1])
		var huso=utm[0]
		UTMx=formatoNum(Math.round(utm[1]))
		UTMy=formatoNum(Math.round(utm[2]))

		if (formatoUTM)
		{
			capa_utm.innerText='UTM-'+huso+' N\nx='+UTMx+'\ny='+UTMy
		}
		else
		{
			var aux='<table cellspacing=0 cellpadding=0 class=fuenteTitulo><tr align=right>'+desgloseGeo(geo[0])
			aux += (geo[0]>0)?'N':'S';
			aux+='</td></tr><tr align=right>'+desgloseGeo(geo[1])
			aux += (geo[1]>0)?'E':'W';
			aux+='</td></tr></table>'
			capa_utm.innerHTML=aux+'<table cellspacing=0 cellpadding=0 class=fuenteTitulo><tr><td width=45 align=center>UTM-'+huso+'</td><td>x:</td><td align=right>'+UTMx+'</td></tr><tr><td align=center>ED-50</td><td>y:</td><td align=right>'+UTMy+'</td></tr></table>'
		}

		layObj_utm.visibility="visible"
	}


}
