/*
Berechnung von Rechtswerten, Hochwerten, TK25 Blatt und Gitterstreifen
-----------------------------------------------------------------------------------
Eingabe ist rechts1, hoch1 - alle anderen Werte sind Ausgabeqwerte
rechts2, hoch2 - R/H fuer 2. Gitterstreifen
rechts3, hoch3 - R/H fuer 3. Gitterstreifen
gitter         - Gitterstreifen
tknr           - TK25 Blattnummer

Returnwert ist Fehler
0 - alles ok
1 - Rechtswert nicht im gueltigen Bereich
2 - Laenge oder Breite oder Gitter nicht im gueltigen Bereich
3 - Punkt liegt nicht im Gitter 2, 3
4 - TK Nummer nicht im gueltigen Bereich

History:
AUG 06 - N. Puente - JavaScript / PHP
MAR 96 - A.Staerk, HLfB - PL/SQL
OCT 95 - J.Krzyzanowski, GLA RhPf - Visual Basic
JUL 94 - J.Krzyzanowski, GLA RhPf - Access Basic
--     93 - A.Dietz - C
--     92 - LVA Koblenz - FORTRAN
-----------------------------------------------------------------------------------
*/

//Variablendeklaration und Initialisierung

function koordinatenumrechnung(rechts1, hoch1) {
	var a = 6377397.155076;
	var anul = 111120.61962;
	var a1 = -15988.63853;
	var a2 = 16.72995;
	var a3 = -0.02178;
	var a4 = 0.00003;
	var b;
	var ho = hoch1;
	var bf = ho / anul;
	var co;
	var ez;
	var eqdr = 0.006674372230614;
	var estqdr;
	var etaqdr;
	var eta4;
	var fehler = 0;
	var g;
	var gitter = 0;
	var ho2 = 0.0;
	var ho3 = 0.0;
	var kl;
	var kla;
	var kz;
	var lcdr;
	var lcdr1;
	var l;
	var n;
	var re = rechts1;
	var re2 = 0.0;
	var re3 = 0.0;
	var ro = 57.29577951308232;
	var si;
	var t;
	var te;
	var tknr = 0;
	var tq;
	var t4;
	var yy;
	var yn;
	var yn2;
	var tkl;
	var tkb;
	var tkltemp;
	var tkbtemp;
	var ez;

	for(i=0; ;i++){
		g = anul * bf + a1 * Math.sin(bf * 2.0 / ro)
			+ a2 * Math.sin(bf * 4.0 / ro)
			+ a3 * Math.sin(bf * 6.0 / ro)
			+ a4 * Math.sin(bf * 8.0 / ro);
		te = Math.abs(ho - g);
		bf = bf + (ho - g) / anul;
		if(te <= 0.000005)break;
	}

	// Calculate
	kz = re / 1000000.0;
	ez = Math.floor(kz);

	kz  = ez;
	si = Math.sin(bf / ro);
	co = Math.cos(bf / ro);
	t = si / co;

	n = a / Math.sqrt(1 - eqdr * Math.pow(si, 2));
	estqdr = eqdr / (1 - eqdr);
	etaqdr = estqdr * Math.pow(co, 2);
	yy = re - (kz + 0.5) * 1000000.0;

	//Rechtswert nicht im gueltigen Bereich
	if(Math.abs(yy) > 250000)fehler = 1;

	// Berechnung von Breite und Laenge
	tq = Math.pow(t, 2);
	yn2 = Math.pow(yy, 2) / Math.pow(n, 2);
	kl = 1.0 + etaqdr;
	b = bf - ro / 2. * yn2 * t * kl;
	l = kz * 3.0 + ro / n / co * yy;
	kl = 1.0 + 2.0 * tq + etaqdr;
	l = l - ro / 6.0 * yn2 * yy / n / co * kl;
	yn = Math.pow(yn2, 2);
	eta4 = Math.pow(etaqdr, 2);
	t4 = Math.pow(tq, 2);
	kl = 5.0 + 3.0 * tq + 6.0 * etaqdr - 6.0 * tq * etaqdr - 3.0 * eta4 - 9.0 * tq * eta4;
	b = b + ro / 24.0 * yn * t * kl;
	kl = 5.0 + 28.0 * tq + 24.0 * t4 + 6.0 * etaqdr + 8.0 * tq * etaqdr;
	l = l + ro / 120.0 * yn * yy / n / co * kl;
	yn = yn2 * yn;
	kl = 61.0 + 90.0 * tq + 45.0 * t4 + 107.0 * etaqdr - 162.0 * tq * etaqdr - 45.0 * t4 * etaqdr;
	b = b - ro / 720.0 * yn * t * kl;
	kl = 61.0 + 662.0 * tq + 1320.0 * t4 + 720.0 * t4 * tq;
	l = l - ro / 5040.0 * yn * yy / n / co * kl;
	yn = yn2 * yn;
	kl = 1385.0 + 3633.0 * tq + 4095.0 * t4 + 1575.0 * t4 * tq;
	b = b + ro / 40320.0 * yn * t * kl;

	// Laenge oder Breite oder Gitter nicht im gueltigen Bereich
	if((Math.abs(b) > 90.0) || (Math.abs(l) > 360.0) || (kz > 121.0))fehler = 2;
	
	rfactor = 2;
	px = roundN(l, rfactor);
    py = roundN(b, rfactor);
	
	var mapCoords = ' Länge: '+px+' Breite: '+py;
    window.status = mapCoords;

}
