
//gms
var ggg, minutos, segundos;
//xyzla
var lat, lon, h;
//mercator
var xx, yy, mc;

function borrar() {

nro1.salida.value="";

}

function info() {
nro1.salida.value+="\n\n";
nro1.salida.value+="SYS1SYS.htm\n\n";
nro1.salida.value+="Transformación de coordenadas geodésicas\n";
nro1.salida.value+="entre distintos sistemas y marcos de referencia.\n";
nro1.salida.value+="Autor: J.L.Hormaechea\n";
nro1.salida.value+="Versión HTML - JavaScript - julio 2002\n";
nro1.salida.value+="Corregido para Firefox    - mayo 2007\n";
nro1.salida.value+="E-mail: jlhor@earg.gov.ar\n\n";


}

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 gms(gra) {

ggg=Math.floor(Math.abs(gra));
signos=signo(gra);
minutos=Math.floor((Math.abs(gra)-ggg)*60);
segundos=(Math.abs(gra)-ggg)*3600-minutos*60;
ggg=ggg*signos;

}


function xyzfila (a, ff, x, y, z) {
//
// Pasa de    X Y Z    a    Fi, Lambda y h
//
//
//
//


ff = 1 / ff;
var e2 = 2 * ff - ff * ff;
var xk = 180 / 3.141592653589793;

var xd6 = 60;
var xd36 = 3600;


//     PASAJE DE RECTANGULARES A GEOGRAFICAS

//
//

var zlat, n, zdxs, dif, zd0;

var ydx = y / x;
// xlat ==> Longitud
var xlat = Math.atan(ydx) * xk;                     
var xs = x * x + y * y;
var xs = Math.sqrt(xs);
var zdxs = 1 / (1 - e2) * z / xs;
var zd0 = zdxs;

do {
zlat = Math.atan(zdxs);
n = a / Math.sqrt(1 - e2 * Math.pow(Math.sin(zlat) , 2));
zdxs = (1 + e2 * n * Math.sin(zlat) / z) * z / xs;
dif = Math.abs(zd0 - zdxs);
zd0 = zdxs;
} while (dif > .0000000001);

// zlat ==> Latitud
zlat = Math.atan(zdxs) * xk;                    

h = x / (Math.cos(zlat / xk) * Math.cos(xlat / xk)) - n;
lat = zlat;
lon = xlat;

}

function mercator(aaa, ff, fir, longr) {

//   Obtiene coordenadas Easting y Norting  UTM
//   a partir de Lat/Lon geodesicas
//   para elipsoide WGS84 o Internacional 1924
//   Elige la faja por proximidad
//
//   Autor: J.L.Hormaechea
//   abril 1994.
//
//   Modificacion: elige faja por proximidad (nov 1995)
//   si Meridiano Central = 0

var x0 = 500000;
var y0 = 10000000;
var pii = 3.141592653589793;

// semi ancho faja G-K  (nov 1995)
var g15 = 1.5 * pii / 180;

var falsonor = arco(aaa, ff);
var falsonor = falsonor - y0;

//
//Elige faja por proximidad si mc =0

signol=signo(longr);

var mcr=0;

if (nro1.mca.checked) {

for(i = 0; i<=60;i++){
           mcfaj = i * 3 * pii / 180;
          if (mcfaj - Math.abs(longr) < g15)  mcr = mcfaj * signol;
}
}


if (!nro1.mca.checked) mcr=mc*pii/180;
if (nro1.mca.checked) {
mc=mcr*180/pii; nro1.medcen.value=formatnumber(mc,5);
}

// fin elige faja  mcr sale en radianes


longr = longr - mcr;


k0 = 1;

var e2 = 2 * ff - ff * ff;
var e = Math.sqrt(e2);


var n = ff / (2 - ff);

var n2 = n * n;
var n3 = n2 * n;
var n4 = n3 * n;

var a0 = 1 + n2 / 4 + n4 / 64;
var a2 = 1.5 * (n - n3 / 8);
var a4 = 15 / 16 * (n2 - n4 / 4);
var a6 = 35 / 48 * n3;
var a8 = 315 / 512 * n4;

var nn = aaa / (Math.sqrt(1 - e2 * Math.pow(Math.sin(fir) , 2)));
var mm = aaa * (1 - e2) / Math.pow(Math.sqrt(1 - e2 * Math.pow(Math.sin(fir) , 2)), 3);

var t = Math.tan(fir);
var t2 = t * t;
var t4 = t2 * t2;

var eta2 = e2 / (1 - e2) * Math.pow(Math.cos(fir) , 2);

var fia = Math.abs(fir);
var s = aaa / (1 + n) * (a0 * fir - a2 * Math.sin(2 * fir) + a4 * Math.sin(4 * fir) - a6 * Math.sin(6 * fir) + a8 * Math.sin(8 * fir));

var tx1 = longr * Math.cos(fir);
var tx2 = Math.pow(longr * Math.cos(fir), 3) * (1 - t2 + eta2) / 6;
var tx3 = Math.pow(longr * Math.cos(fir), 5) * (5 - 18 * t2 + t4 + 14 * eta2 - 58 * t2 * eta2) / 120;


var ty1 = s / nn;
var ty2 = Math.pow(longr, 2) * Math.sin(fir) * Math.cos(fir) / 2;
var ty3 = Math.pow(longr, 4) * Math.sin(fir) * Math.pow(Math.cos(fir), 3) * (5 - t2 + 9 * eta2 + 4 * eta2 * eta2) / 24;
var ty4 = Math.pow(longr, 6) * Math.sin(fir) * Math.pow(Math.cos(fir), 5) * (61 - 58 * t2 + t4 + 270 * eta2 - 30 * t2 * eta2) / 720;

xx = (tx1 + tx2 + tx3) * k0 * nn + x0;
yy = (ty1 + ty2 + ty3 + ty4) * k0 * nn + y0 + falsonor;


}


function arco(a, f) {

var pii = 3.141592653589793;

var fi = 90 * pii / 180;


var n = f / (2 - f);
var n2 = n * n;
var n3 = n2 * n;
var n4 = n2 * n2;

var a0 = 1 + n2 / 4 + n4 / 64;
var a2 = 3 / 2 * (n - n3 / 8);
var a4 = 15 / 16 * (n2 - n4 / 4);
var a6 = 35 / 48 * n3;
var a8 = 315 / 512 * n4;

var arcoo = a / (1 + n) * (a0 * fi - a2 * Math.sin(2 * fi) + a4 * Math.sin(4 * fi) - a6 * Math.sin(6 * fi) + a8 * Math.sin(8 * fi));

return arcoo;
}


function transf() {

//
//  Transforma coordenadas entre diferentes sistemas
//  partiendo de geográficas geodésicas
//
//  geo -> cartesianas -> dx dy dz -> cartesianas -> geodesicas
//
//  Permite definier DX DY DZ y los parametros de los elipsoides
//  inicial y final.
//
//  Realizado a partir del WGS84_IN
//
//  abril de 2000
//
//  Autor: José Luis Hormaechea
//
//  version HTML y JavaScript: junio 2001 (J.L.H.)
//



//ent = new String("");

f = new Array(11);
a = new Array(11);
dx = new Array(11);
dy = new Array(11);
dz = new Array(11);
sis = new Array(11);
conv = new Array(11);

elip1 = new Array(11);
elip2 = new Array(11);



var break1="<br>";
var break2="<br><br>";
var break3="<br><br><br>";

var b="  ";

var pii = 3.141592653589793;

var nrosi = 2;


//  Meridiano Central (si mc=0 elige por proximidad);

mc = nro1.medcen.value;


//WGS84

f[1] = 1 / 298.257223563;
a[1] = 6378137;
sis[1] = "WGS84";

//INTERNACIONAL

f[2] = 1 / 297;
a[2] = 6378388;
sis[2] = "INTERNACIONAL";


k = pii / 180;

// nro de juegos deparametros

nrosin = 9;

conv[1] = "WGS84 a Inchauspe (DMA)"
 dx[1] = 148;
 dy[1] = -136;
 dz[1] = -90;
 elip1[1]=1;
 elip2[1]=2;

conv[2] = "Inchauspe a WGS84 (DMA)"
 dx[2] = -148;
 dy[2] = 136;
 dz[2] = 90;
 elip1[2]=2;
 elip2[2]=1;

conv[3] = "MMS A POSGAR"
 dx[3] = -78.1;
 dy[3] = 101.6;
 dz[3] = 133.3;
 elip1[3]=2;
 elip2[3]=1;

conv[4] = "POSGAR A MMS"
 dx[4] = 78.1;
 dy[4] = -101.6;
 dz[4] = -133.3;
 elip1[4]=1;
 elip2[4]=2;

conv[5] = "POSGAR a ITRF97 en TdF"
 dx[5] = .645;
 dy[5] = -1.091;
 dz[5] = -.28;
 elip1[5]=1;
 elip2[5]=1;

conv[6] = "POSGAR A Hito XVIII"
 dx[6] = -18.2;
 dy[6] = -190.7;
 dz[6] = -100.9;
 elip1[6]=1;
 elip2[6]=2;

conv[7] = "Hito XVIII a POSGAR"
 dx[7] = 18.2;
 dy[7] = 190.7;
 dz[7] = 100.9;
 elip1[7]=2;
 elip2[7]=1;

conv[8] = "POSGAR a MM Norte"
 dx[8] = 9.5;
 dy[8] = -122.9;
 dz[8] = -138.2;
 elip1[8]=1;
 elip2[8]=2;

conv[9] = "MM Norte a POSGAR"
 dx[9] = -9.5;
 dy[9] = 122.9;
 dz[9] = 138.2;
 elip1[9]=2;
 elip2[9]=1;


//   Fija Parametros de Transformacion

var kpar = Math.abs(nro1.cc.value);

if (kpar > nrosin) kpar=nrosin;

if (kpar > 0) {
        nro1.ppt.value=conv[kpar];
        nro1.pdx.value=dx[kpar];
        nro1.pdy.value=dy[kpar];
        nro1.pdz.value=dz[kpar];
        is1=elip1[kpar];
        is2=elip2[kpar]; 
        nro1.semieje1.value=a[is1];
        nro1.aplanai1.value=1/f[is1];
        nro1.sistema1.value=sis[is1];
        nro1.semieje2.value=a[is2];
        nro1.aplanai2.value=1/f[is2];
        nro1.sistema2.value=sis[is2];
  
        };   


if (kpar == 0) {

is1=1;
is2=2;
f[1] = 1 / nro1.aplanai1.value;
a[1] = nro1.semieje1.value;
sis[1] = nro1.sistema1.value;
f[2] = 1 / nro1.aplanai2.value;
a[2] = nro1.semieje2.value;
sis[2] = nro1.sistema2.value;
 
dx[kpar] = Math.abs(nro1.pdx.value)*signo(nro1.pdx.value);
dy[kpar] = Math.abs(nro1.pdy.value)*signo(nro1.pdy.value);
dz[kpar] = Math.abs(nro1.pdz.value)*signo(nro1.pdz.value);
       
}

var fg = nro1.fig.value;

if (Math.abs(fg) <= 90) { 

var fm = nro1.fim.value;
var fs = nro1.fis.value;

//longitud:

var lg = nro1.lag.value;
var lm = nro1.lam.value;
var ls = nro1.las.value;
var h1 = Math.abs(nro1.hh.value)*signo(nro1.hh.value);

var fir = (Math.abs(fg) + fm / 60 + fs / 3600) * k * signo(fg);
var longi = (Math.abs(lg) + lm / 60 + ls / 3600) * signo(lg) * k;

var e2 = 2 * f[is1] - f[is1] * f[is1];

var n = a[is1] / Math.sqrt(1 - e2 * Math.pow(Math.sin(fir) , 2));

var xwgs84 = (n + h1) * Math.cos(fir) * Math.cos(longi);
var ywgs84 = (n + h1) * Math.cos(fir) * Math.sin(longi);
var zwgs84 = (n * (1 - e2) + h1) * Math.sin(fir);

mercator(a[is1], f[is1], fir, longi);
xgk84=xx; ygk84=yy;

var x69 = xwgs84 + dx[kpar];
var y69 = ywgs84 + dy[kpar];
var z69 = zwgs84 + dz[kpar];


//CALL xyzfila(6378388#, 297#, x69, y69, z69, lat69, lon69, h69)

var lat69=0; var lon69=0; var h69=0;
xyzfila(a[is2], 1 / f[is2], x69, y69, z69);
lat69=lat; lon69=lon; h69=h;

la69 = lat69; lo69 = lon69; ggg=0; minutos=0; segundos=0;

gms(la69);

nro1.lig.value = ggg ;
nro1.lim.value = minutos ;
nro1.lis.value = formatnumber(segundos,5);

gms(lo69);

nro1.log.value = ggg ;
nro1.lom.value = minutos;
nro1.los.value = formatnumber(segundos,5);
nro1.hhf.value = formatnumber(h69, 4);

lat69 = lat69 * pii / 180;
lon69 = lon69 * pii / 180;

mercator(a[is2], f[is2], lat69, lon69)
xgk69=xx; ygk69=yy;

//determinacion de faja

fajan = (eval(nro1.medcen.value) + 75)/ 3;
if (Math.floor(fajan)==fajan) {
        xgk84=fajan*1000000 + xgk84;
        xgk69=fajan*1000000 + xgk69;
}


nro1.sisi.value= sis[is1];
nro1.xgeo.value= formatnumber(xwgs84,3);
nro1.ygeo.value= formatnumber(ywgs84,3);
nro1.zgeo.value= formatnumber(zwgs84,3);
nro1.sisf.value = sis[is2];
nro1.xgeof.value = formatnumber(x69,3);
nro1.ygeof.value = formatnumber(y69,3);
nro1.zgeof.value = formatnumber(z69,3);

nro1.xgk.value = formatnumber(ygk84,4);
nro1.ygk.value = formatnumber(xgk84,4);
nro1.xgkf.value = formatnumber(ygk69,4);
nro1.ygkf.value = formatnumber(xgk69,4);





if (nro1.inic.checked) {


nro1.salida.value+="\n\n";

if (nro1.sisc.checked) {

nro1.salida.value+= sis[is1]+" - " +nro1.cc.value+"\n";

}

if (nro1.geoc.checked) {

nro1.salida.value+=nro1.fig.value+b;
nro1.salida.value+=nro1.fim.value+b;
nro1.salida.value+=nro1.fis.value+b;
nro1.salida.value+=nro1.lag.value+b;
nro1.salida.value+=nro1.lam.value+b;
nro1.salida.value+=nro1.las.value+b+b;
nro1.salida.value+=nro1.hh.value+b;

}

if (nro1.recc.checked) {

nro1.salida.value+=formatnumber(xwgs84,3)+b;
nro1.salida.value+= formatnumber(ywgs84,3)+b;
nro1.salida.value+= formatnumber(zwgs84,3)+b+b;

}

if (nro1.plac.checked) {

nro1.salida.value+= formatnumber(ygk84,4)+b;
nro1.salida.value+= formatnumber(xgk84,4)+b+b;

if (nro1.altc.checked) nro1.salida.value+=nro1.hh.value+b;


}


nro1.salida.value+= "\n";


}


if (nro1.finc.checked) {


if (nro1.sisc.checked) {

nro1.salida.value+= sis[is2]+"\n";

}

if (nro1.geoc.checked) {

nro1.salida.value+=nro1.lig.value+b;
nro1.salida.value+=nro1.lim.value+b;
nro1.salida.value+=nro1.lis.value+b;
nro1.salida.value+=nro1.log.value+b;
nro1.salida.value+=nro1.lom.value+b;
nro1.salida.value+=nro1.los.value+b+b;
nro1.salida.value+=nro1.hhf.value+b+b;

}

if (nro1.recc.checked) {

nro1.salida.value+= formatnumber(x69,3)+b;
nro1.salida.value+= formatnumber(y69,3)+b;
nro1.salida.value+= formatnumber(z69,3)+b+b;

}

if (nro1.plac.checked) {


nro1.salida.value+= formatnumber(ygk69,4)+b;
nro1.salida.value+= formatnumber(xgk69,4)+b+b;

if (nro1.altc.checked) nro1.salida.value+=nro1.hhf.value+b+b;

}


nro1.salida.value+= "\n";

}


}
}