function rds2bessel(rds) {
	// Constanten
	var x0 = 155000.0;
	var y0 = 463000.0;
	var k = .9999079;
	var bigr = 6382644.571;
	var m = .003773953832;
	var n = 1.00047585668;
	var lambda0 = Math.PI * .029931327161111111;
	var phi0 = Math.PI * .28975644753333335;
	var l0 = Math.PI * .029931327161111111;
	var b0 = Math.PI * .28956165138333334;
	var e = .08169683122;
	var a = 6377397.155;

	// Start
	var d__1 = rds.x - x0;
	var d__2 = rds.y - y0;
	var r = Math.sqrt(d__1 * d__1 + d__2 * d__2);

	if (r) {
		var sa = (rds.x - x0) / r;
		var ca = (rds.y - y0) / r;
	} else {
		var sa = 0.0;
		var ca = 0.0;
	}

	var psi = Math.atan2(r, k * 2. * bigr) * 2.;
	var cpsi = Math.cos(psi);
	var spsi = Math.sin(psi);
	var sb = ca * Math.cos(b0) * spsi + Math.sin(b0) * cpsi;
	d__1 = sb;
	var cb = Math.sqrt(1. - d__1 * d__1);
	var b = Math.acos(cb);
	var sdl = sa * spsi / cb;
	var dl = Math.asin(sdl);
	var lambda = dl / n + lambda0;
	var w = Math.log(Math.tan(b / 2. + (Math.PI / 4)));
	var q = (w - m) / n;
	var phiprime = Math.atan(Math.exp(q)) * 2. - (Math.PI / 2);

	for (i = 1; i <= 4; ++i) {
		dq = e / 2. * Math.log((e * Math.sin(phiprime) + 1.) / (1. - e * Math.sin(phiprime)));
		phi = Math.atan(Math.exp(q + dq)) * 2. - (Math.PI/ 2);
		phiprime = phi;
	}

	lambda = lambda / Math.PI * 180;
	phi = phi / Math.PI * 180;
	return new GPoint(phi, lambda);
}

function bessel2gps(bessel) {
	var dphi   = bessel.x - 52.0;
	var dlam   = bessel.y - 5.0;
	var phicor = (-96.862 - dphi * 11.714 - dlam * .125) * 1e-5;
	var lamcor = (dphi * .329 - 37.902 - dlam * 14.667) * 1e-5;
	var phiwgs = bessel.x + phicor;
	var lamwgs = bessel.y + lamcor;
	return new GLatLng(phiwgs, lamwgs);
}

function bessel2rds(bessel) {
	// Constanten
	var x0 = 155000.0;
	var y0 = 463000.0;
	var k = .9999079;
	var bigr = 6382644.571;
	var m = .003773953832;
	var n = 1.00047585668;
	var lambda0 = Math.PI * .029931327161111111;
	var phi0 = Math.PI * .28975644753333335;
	var l0 = Math.PI * .029931327161111111;
	var b0 = Math.PI * .28956165138333334;
	var e = .08169683122;
	var a = 6377397.155;

	// Start
	var phi = bessel.x / 180.0 * Math.PI;
	var lambda = bessel.y / 180.0 * Math.PI;
  	var qprime = Math.log(Math.tan(phi / 2.0 + (Math.PI / 4)));
  	var dq = e / 2.0 * Math.log((e * Math.sin(phi) + 1.0) / (1.0 - e * Math.sin(phi)));
	var q = qprime - dq;
	var w = n * q + m;
	var b = Math.atan(Math.exp(w)) * 2.0 - (Math.PI / 2);
	var dl = n * (lambda - lambda0);

	// Computing 2nd power
	var d__1 = Math.sin((b - b0) / 2.0);
	// Computing 2nd power
  	var d__2 = Math.sin(dl / 2.0);
  	var s2psihalf = d__1 * d__1 + d__2 * d__2 * Math.cos(b) * Math.cos(b0);
	var cpsihalf = Math.sqrt(1.0 - s2psihalf);
	spsihalf = Math.sqrt(s2psihalf);
	var tpsihalf = spsihalf / cpsihalf;
	var spsi = spsihalf * 2.0 * cpsihalf;
	var cpsi = 1.0 - s2psihalf * 2.0;
	var sa = Math.sin(dl) * Math.cos(b) / spsi;
	var ca = (Math.sin(b) - Math.sin(b0) * cpsi) / (Math.cos(b0) * spsi);
  	var r = k * 2.0 * bigr * tpsihalf;

	// Resultaat
  	return new GPoint(r * sa + x0, r * ca + y0);
}

function gps2bessel(gps) {
	var dphi   = gps.lat() - 52.0;
	var dlam   = gps.lng() - 5.0;
	var phicor = (-96.862 - dphi * 11.714 - dlam * .125) * 1e-5;
	var lamcor = (dphi * .329 - 37.902 - dlam * 14.667) * 1e-5;
	var phibes = gps.lat() - phicor;
	var lambes = gps.lng() - lamcor;
	return new GPoint(phibes, lambes);
}

// Extend GLatLng

GLatLng.prototype.toRDSxy = function() {
	if (!this.myRDS) {
		var rds = bessel2rds(gps2bessel(this));
		this.myRDS = rds ? new GPoint(rds.x / 1000, rds.y / 1000) : null;
	}
	return this.myRDS;
}

GLatLng.prototype.rdx = function() {
	var rds = this.toRDSxy();
	return rds ? rds.x : null;
}

GLatLng.prototype.rdy = function() {
	var rds = this.toRDSxy();
	return rds ? rds.y : null;
}

// Extend GPoint

GPoint.prototype.toLatLng = function() {
	if (!this.myLatLng) {
		if (this.x < 1000 && this.y < 1000) {
			var p = new GPoint(this.x * 1000, this.y * 1000);
		} else {
			var p = this;
		}
		this.myLatLng = bessel2gps(rds2bessel(p));
	}
	return this.myLatLng;
}

GPoint.prototype.lat = function() {
	var gps = this.toLatLng();
	return gps ? gps.lat() : null;
}

GPoint.prototype.lng = function() {
	var gps = this.toLatLng();
	return gps ? gps.lng() : null;
}


