﻿function formatnumber(aaaa, np){
var pot=Math.pow(10,np);
var ss=signo(aaaa);
aaaa=Math.floor(Math.abs(aaaa*pot)+0.5);
aaaa=aaaa/pot*ss;
return aaaa;
}

function signo(aaaa){
if (aaaa < 0) return -1;
if (aaaa == 0) return 0;
if (aaaa > 0) return 1;
}

function arco(aa, ff){
var n, pii, fi, n2, n4, n3;
pii = 3.141592653589793;
fi = 90 * pii / 180;
n = ff / (2 - ff);
n2 = n * n;
n3 = n2 * n;
n4 = n2 * n2;
a0 = 1 + n2 / 4 + n4 / 64;
arc = aa / (1 + n) * (a0 * fi);
return arc;
}
////DATOS DE ENTRADA COORDENADAS X (norte) e Y (este) EN ESTE CASO PASADOS COMO PARÁMETROS
function gk2geo(x , y) {
var xplana = x
var yplana = y
//var desp_latitudinal = 10000000;
var desp_latitudinal = 10001965.73;
var desp_longitudinal = 500000;
//var desp_longitudinal = 2500000;
var piii = 3.141592653589793;
var b=" ";
//Cambiar de acuerdo a la faja faja 3 = 3000000, etc.
//var faja = 5000000
var faja=2500000;
///Cambiar según corresponda-------------------------
//PARA WGS84
var a=298.257223563;
var e=6378137;
//f = 0,00335281066433;
//f=0,0033528106647474807198455286185206;
//PARA CAMPO INCHAUSPE	
//var a=298.257222101;
//var e=6378137;
//f = 0.003367465
///--------------------------------------------------
var k0 = 1.0;
var f =1/a;
//alert (f);
//xxx = FALSO NORTE
var xxx = arco(e,f);
//alert (xxx);
xxx = xxx - desp_latitudinal;
yplana = yplana - faja;
xplana = xplana - xxx - desp_latitudinal;
mc = -60;
//mc=-69;
e2 = 2 * f - f * f;
n = f / (2 - f);
n2 = n * n;
n3 = n2 * n;
n4 = n3 * n;
a0 = 1 + n2 / 4 + n4 / 64;
a2 = 3 / 2 * (n - n3 / 8);
a4 = 15 / 16 * (n2 - n4 / 4);
a6 = 35 / 48 * n3;
a8 = 315 / 512 * n4;
fif = xplana / k0 * (1 + n) / e / a0;
fif0 = fif;

for (i = 1; i<=6; i++) {

ffif = -a2 * Math.sin(2 * fif) + a4 * Math.sin(4 * fif) - a6 * Math.sin(6 * fif) + a8 * Math.sin(8 * fif);

fif = fif0 - ffif / a0;

}

t = Math.tan(fif);
t2 = t * t;
t4 = t2 * t2;

eta2 = e2 / (1 - e2) * Math.pow(Math.cos(fif) , 2);
eta4 = eta2 * eta2;

u = Math.sqrt(1 - e2 * Math.pow(Math.sin(fif) , 2));
nn = e / u;

ykn = (yplana - desp_longitudinal) / k0 / nn;
ykn2 = ykn * ykn;
ykn3 = ykn2 * ykn;
ykn4 = ykn3 * ykn;
ykn5 = ykn4 * ykn;
ykn6 = ykn5 * ykn;


fi1 = -t / 2 * (1 + eta2) * ykn2;
fi2 = t / 24 * (5 + 3 * t2 + 6 * eta2 - 6 * eta2 * t2 - 3 * eta4 - 9 * t2 * eta4) * ykn4;
fi3 = -t / 720 * (61 + 90 * t2 + 45 * t4 + 107 * eta2 - 162 * t2 * eta2 - 45 * t4 * eta2) * ykn6;
fir = fif + fi1 + fi2 + fi3;

long1 = ykn3 / 6 * (1 + 2 * t2 + eta2);
longi2 = ykn5 / 120 * (5 + 28 * t2 + 24 * t4 + 6 * eta2 + 8 * t2 * eta2);
longr = (ykn - long1 + longi2) / Math.cos(fif);

fi0 = fir * 180 / piii;
longi = longr * 180 / piii + eval(mc);

fgrados = Math.floor(Math.abs(fi0))*signo(fi0);
fmin = Math.floor(Math.abs(fi0-fgrados)*60);
fseg = (Math.abs(fi0)-Math.abs(fgrados)-fmin/60)*3600;
fseg = fseg.toFixed(1)
if(fmin < 10){
	fmin = "0" + fmin;
}
if(fseg < 10){
	fseg = "0" + fseg;
}

lgrados=Math.floor(Math.abs(longi))*signo(longi);
lmin=Math.floor(Math.abs(longi-lgrados)*60);
lseg=(Math.abs(longi)-Math.abs(lgrados)-lmin/60)*3600;
lseg = lseg.toFixed(1)
if(lmin < 10){
	lmin = "0" + lmin;
}
if(lseg < 10){
	lseg = "0" + lseg;
}



coord = "Lat: " + fgrados + "° "+ fmin +"' " + fseg + "\  - Lon: "+ lgrados + "° "+ lmin +"' " + lseg + "\"";
/* + "\""+
        "\nLongitud :"+long.value+"° "+lonm.value+"' "+lons.value+"\"";		*/
////DATO DE SALIDA COORD... FIJATE SI TE CONVIENE EL DATO TODO EN UNO O POR SEPARADO...
//alert(coord);
return coord;
}

function calcularLatLon(X,Y) {


// ELIPSOIDE WGS84



var a = 6378137;
//VENIA DEL IGM var invf = 298.2572236;
var invf = 298.257223563;
var f = parseFloat( 1 / invf);
var e2 = parseFloat( 2*f - Math.pow(f,2) );
var ep2 = parseFloat( e2 / (1 - e2) );
var Q = parseFloat( a*(1 - e2/4 - 3*Math.pow(e2,2)/64 - 5*Math.pow(e2,3)/256)*Math.PI/2 );
var ama = parseFloat( X - Q );
/* VENIA DEL IGM
var n = parseInt( Y / 1000000 );
var y = parseFloat( Y - n*1000000 - 500000 );
*/
var n = parseInt( Y / 10001965.73 );
var y = parseFloat( Y - n*10001965.73 - 2500000 );


var L0 = parseFloat ( (3*n - 69) * Math.PI / 180 );
var a0 = 0.998324298;
var a2 = 0.002514607;
var a4 = 0.00000263905;
var a6 = 0.00000000341805;
var B11 = parseFloat( ama / (a0*a) );
var B12 = parseFloat( B11 + a2*Math.sin(2*B11)/a0 - a4*Math.sin(4*B11)/a0 + a6*Math.sin(6*B11)/a0 );
var B13 = parseFloat( B11 + a2*Math.sin(2*B12)/a0 - a4*Math.sin(4*B12)/a0 + a6*Math.sin(6*B12)/a0 );
var B14 = parseFloat( B11 + a2*Math.sin(2*B13)/a0 - a4*Math.sin(4*B13)/a0 + a6*Math.sin(6*B13)/a0 );
var B15 = parseFloat( B11 + a2*Math.sin(2*B14)/a0 - a4*Math.sin(4*B14)/a0 + a6*Math.sin(6*B14)/a0 );
var B16 = parseFloat( B11 + a2*Math.sin(2*B15)/a0 - a4*Math.sin(4*B15)/a0 + a6*Math.sin(6*B15)/a0 );
var B17 = parseFloat( B11 + a2*Math.sin(2*B16)/a0 - a4*Math.sin(4*B16)/a0 + a6*Math.sin(6*B16)/a0 );
var B18 = parseFloat( B11 + a2*Math.sin(2*B17)/a0 - a4*Math.sin(4*B17)/a0 + a6*Math.sin(6*B17)/a0 );
var B19 = parseFloat( B11 + a2*Math.sin(2*B18)/a0 - a4*Math.sin(4*B18)/a0 + a6*Math.sin(6*B18)/a0 );
var B10 = parseFloat( B11 + a2*Math.sin(2*B19)/a0 - a4*Math.sin(4*B19)/a0 + a6*Math.sin(6*B19)/a0 );
var N1 = parseFloat( a / Math.sqrt( 1 - e2 * Math.pow(Math.sin(B10),2) ) );
var M1 = parseFloat( a*(1 - e2) / ( Math.pow(1 - e2 * Math.pow(Math.sin(B10),2),1.5) ) );
var t1 = parseFloat( Math.tan(B10) );
var eta1c = parseFloat( ep2*Math.pow( Math.cos(B10),2) );
var Bpt = parseFloat( Math.pow(y,2)*t1/(2*N1*M1) );
var Bst = parseFloat( Math.pow(y,4)*t1*(5 + 3*Math.pow(t1,2) + eta1c - 9*Math.pow(t1,2)*eta1c) / (24*Math.pow(N1,3)*M1) );
var Btt = parseFloat( Math.pow(y,6)*t1*(61 + 90*Math.pow(t1,2) + 45*Math.pow(t1,4)) / (720*Math.pow(N1,5)*M1) );
var LAT = parseFloat( B10-Bpt+Bst-Btt );
var Lpt = parseFloat( y / (N1*Math.cos(B10)) );
var Lst = parseFloat( Math.pow(y,3) * (1 + 2*Math.pow(t1,2) + eta1c ) / ( 6*Math.pow(N1,3)*Math.cos(B10)) );
var Ltt = parseFloat( Math.pow(y,5) * (5 + 28*Math.pow(t1,2) + 24*Math.pow(t1,4)) / (120*Math.pow(N1,5)*Math.cos(B10)) );
var LON = parseFloat( L0+Lpt-Lst+Ltt );

var latitud = LAT * 180 / Math.PI ;
var longitud = LON * 180 / Math.PI ;

fgrados = Math.floor(Math.abs(latitud))*signo(latitud);
fmin = Math.floor(Math.abs(latitud-fgrados)*60);
fseg = (Math.abs(latitud)-Math.abs(fgrados)-fmin/60)*3600;
fseg = fseg.toFixed(1)
if(fmin < 10){
	fmin = "0" + fmin;
}
if(fseg < 10){
	fseg = "0" + fseg;
}

lgrados=Math.floor(Math.abs(longitud))*signo(longitud);
lmin=Math.floor(Math.abs(longitud-lgrados)*60);
lseg=(Math.abs(longitud)-Math.abs(lgrados)-lmin/60)*3600;
lseg = lseg.toFixed(1)
if(lmin < 10){
	lmin = "0" + lmin;
}
if(lseg < 10){
	lseg = "0" + lseg;
}


//return "Lat: "+latitud+" \ - Lon: "+longitud;
return "Lat: " + fgrados + "° "+ fmin +"' " + fseg + "\  - Lon: "+ lgrados + "° "+ lmin +"' " + lseg + "\"";

}