/* trans.js, (c) 2006 Kristian Peters
 *
 * this code is based on KoordTrans JS v0.2 by Michael Loesler
 * see ''http://www.derletztekick.com/service/Kartenservice'' for more
 * details
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; under version 2 of the License. */



/* math constants */
var pi = Math.PI;
var rho = 180 / pi;

/* Bessel constants */
var e2 = 0.0067192188;  
var c = 6398786.849;

/* standard definitions */
var zoomlevel = 14;

/* initialize map */
var map = null;



function bround(num, dig) {
	var digit = Math.pow(10, dig); 
	num *= digit;
	num = Math.round(num);
	num /= digit;
	return num;
}

function bar(length) {
	return Math.round(length/3);
}



function utm2gk(initcard) {
	var latdec = document.getElementById("latitude").value;
	var londec = document.getElementById("longitude").value;

	latdec = latdec.replace(/\,/g, ".");
	latdec = parseFloat(latdec);

	londec = londec.replace(/\,/g, ".");
	londec = parseFloat(londec);
		
	if (!isNaN(londec) && !isNaN(latdec)) {
		/* actual conversion */
		var sy = bar(londec);
		var bf = latdec / rho;
		var g = 111120.61962 * latdec - 15988.63853 * Math.sin(2 * bf) + 16.72995 * Math.sin(4 * bf) - 0.02178 * Math.sin(6 * bf) + 0.00003 * Math.sin(8 * bf);
		var co = Math.cos(bf);
		var g2 = e2 * (co * co);
		var g1 = c / Math.sqrt(1 + g2);
		var t = Math.sin(bf) / Math.cos(bf);
		var dl = londec - sy * 3;
		var fa = co * dl / rho;
		var hw = g + (fa * fa * t * g1 / 2)  + (fa * fa * fa * fa * t * g1 * (5 - t * t + 9 * g2) / 24);
		var rm = (fa * g1) + (fa * fa * fa * g1 * (1 - t * t + g2) / 6) + (fa * fa * fa * fa * fa * g1 * (5 - 18 * t * t * t * t * t * t) / 120);
		var rw = rm + (sy * 1000000) + 500000;

		/* update map */
		if (initcard) map.setCenter(new GLatLng(latdec, londec), zoomlevel);

		/* update gauss-krueger values */
		document.getElementById("hochwert").value = bround(hw,2);
		document.getElementById("rechtswert").value = bround(rw,2);
	}
	return false;
}



function gk2utm() {
	var hw = document.getElementById("hochwert").value;
	var rw = document.getElementById("rechtswert").value;
	var mKen = rw.substr(0, 1);

	hw = hw.replace(/\,/g, ".");
	hw = parseFloat(hw);

	rw = rw.replace(/\,/g, ".");
	rw = parseFloat(rw);

	mKen = parseInt(mKen);

	if (!isNaN(rw) && !isNaN(hw) && !isNaN(mKen)) {
		/* actual conversion */
		var rm = rw - mKen * 1000000 - 500000;
		var bI = hw / 10000855.7646;
		var bII = bI * bI;
		var bf = 325632.08677 * bI * ((((((0.00000562025 * bII - 0.00004363980) * bII + 0.00022976983) * bII - 0.00113566119) * bII + 0.00424914906) * bII - 0.00831729565) * bII + 1);
		bf = bf / 3600 / rho;
		var co = Math.cos(bf);
		var g2 = e2 * (co * co);
		var g1 = c / Math.sqrt(1 + g2);
		var t = Math.tan(bf);
		var fa = rm / g1;
		var gb = bf - (fa * fa * t * (1 + g2) / 2) + (fa * fa * fa * fa * t * (5 + 3 * t * t + 6 * g2 - 6 * g2 * t * t) / 24);
		gb = gb * rho;
		var dl = fa - (fa * fa * fa * (1 + 2 * t * t + g2) / 6) + (fa * fa * fa * fa * fa * (1 + 28 * t * t + 24 * t * t * t * t) / 120);
		var gl = dl * rho / co + mKen * 3;

		/* update map */
		map.setCenter(new GLatLng(gb, gl), zoomlevel);

		/* update gauss-krueger values */
		document.getElementById("latitude").value = bround(gb,6);
		document.getElementById("longitude").value = bround(gl,6);	
	}	
	return false;
}



function initmap() {
	if (GBrowserIsCompatible() && document.getElementById) {
		document.getElementById("formular").style.display = "inline";
		var htmlEl = document.getElementById("map");
		htmlEl.style.border = "solid 1px #663737";

		try {
			map = new GMap2(htmlEl);

			/* add control-overlays */
			map.addControl(new GMapTypeControl());
			map.addControl(new GLargeMapControl());
			map.addControl(new GScaleControl());

			/* do things after moving ends */
			GEvent.addListener(map, "moveend", function() {
				var center = map.getCenter();
				document.getElementById("latitude").value = bround(center.y,6);
				document.getElementById("longitude").value = bround(center.x,6);
				utm2gk(false);
			});

			/* update map */
			map.setCenter(new GLatLng(54.136405, 12.028824), zoomlevel, G_NORMAL_MAP);
			/* info window */
			/*
			map.addOverlay(new GMarker(new GLatLng(54.138000, 12.028920)));

			var marker = new GMarker(new GLatLng(54.138000, 12.028920));
			GEvent.addListener(marker, "click", function() {
				marker.openInfoWindowHtml("<div style='text-align: left;'><b>Information:<\/b><br>Home of Korseby<\/div>");
			});
			map.addOverlay(marker);
			*/
		}catch(e) { }
	} else {
		var htmlEl = document.getElementById("map");
		htmlEl.appendChild(document.createTextNode("Your Browser does not support Google Maps."));
	}
}

