function MolodenskijConverter(fromSurface, toSurface) {
	this.className = "MolodenskijConverter";
	
	fromOrientation = fromSurface.orientation;
	toOrientation = toSurface.orientation;
	this.deltaSemiMajor = fromSurface.semimajor - toSurface.semimajor;
	this.deltaFlattening = fromSurface.flattening - toSurface.flattening;
	this.rotation_x = toOrientation.rotation_x - fromOrientation.rotation_x;
	this.rotation_y = toOrientation.rotation_y - fromOrientation.rotation_y;
	this.rotation_z = toOrientation.rotation_z - fromOrientation.rotation_z;
	this.translation_x = toOrientation.translation_yz - fromOrientation.translation_yz;
	this.translation_y = toOrientation.translation_xz - fromOrientation.translation_xz;
	this.translation_z = toOrientation.translation_xy - fromOrientation.translation_xy;
	this.scaleFactor = toOrientation.refactor - toOrientation.refactor;
	//save Elipsoid for calculations...
	this.fromElipsoid = fromSurface;
	this.destElipsoid = toSurface;
	
	this.convert = function(myPoint) {
		var curvationRatio = this.fromElipsoid.CurvationRatio(myPoint);
		var grandNormal = this.fromElipsoid.GrandNormal(myPoint);
		var sinLongitude = Math.sin(myPoint.radians.longitude);
		var cosLongitude = Math.cos(myPoint.radians.longitude);
		var sinLatitude = Math.sin(myPoint.radians.latitude);
		var cosLatitude = Math.cos(myPoint.radians.latitude);
		var tanLatitude = Math.tan(myPoint.radians.latitude);
		var altitude = myPoint.altitude;
		var flattening = this.fromElipsoid.flattening;
		var translation_x = this.translation_x;
		var translation_y = this.translation_y;
		var translation_z = this.translation_z;
		var rotation_x	= this.rotation_x;
		var rotation_y	= this.rotation_y;
		var rotation_z	= this.rotation_z;
		var scaleFactor = this.scaleFactor;
		var deltaSemiMajor = this.deltaSemiMajor;
		var from_semiMajor = this.fromElipsoid.semimajor;
		var deltaFlattening = this.deltaFlattening;
		
		var tempVar = curvationRatio + altitude;
		var tempVar2 = Math.pow(from_semiMajor,2) / grandNormal + altitude;
		var tempVar6 = Math.pow(1 - flattening,2);
		var tempVar5 = (1 - tempVar6) * grandNormal;
		
		var tempVar3 = ( grandNormal + altitude ) * cosLatitude;
		var tempVar4 = (tempVar6 * grandNormal + altitude) / (grandNormal + altitude);
		
		var o1 = (sinLatitude * cosLongitude / tempVar) * translation_x;
		var o2 = (sinLatitude * sinLongitude / tempVar) * translation_y;
		var o3 = (cosLatitude / tempVar) * translation_z;
		var o4 = (tempVar2 / tempVar) * sinLongitude * rotation_x;
		var o5 = (tempVar2 / tempVar) * cosLongitude * rotation_y;
		var o6 = (tempVar5 / tempVar) * cosLatitude * sinLatitude * ( scaleFactor + deltaSemiMajor / from_semiMajor);
		var o7 = ((curvationRatio + tempVar6 * grandNormal) / tempVar) * cosLatitude * sinLatitude * ( deltaFlattening / (1 - flattening));
		var dLatitude = 	 o1+o2-o3+o4-o5-o6-o7;
		
		var dLongitude = 	sinLongitude / tempVar3 * translation_x - 
								cosLongitude / tempVar3 * translation_y - 
								tempVar4 * tanLatitude * cosLongitude * rotation_x - 
								tempVar4 * tanLatitude * sinLongitude * rotation_y + 
								rotation_z;
		
		var dAltitude =		- cosLatitude * cosLongitude * translation_x -
								cosLatitude * sinLongitude * translation_y -
								sinLatitude * translation_z + 
								tempVar5 * sinLatitude * cosLatitude * sinLongitude * rotation_x -
								tempVar5 * sinLatitude * cosLatitude * cosLongitude * rotation_y -
								tempVar2 * scaleFactor + 
								from_semiMajor / grandNormal * deltaSemiMajor -
								tempVar6 * grandNormal * Math.pow(sinLatitude, 2) * (deltaFlattening / (1 - flattening));
		
		var toLatitude = myPoint.radians.latitude + dLatitude;
		var toLongitude = myPoint.radians.longitude + dLongitude;
		var toAltitude = myPoint.altitude + dAltitude;
		
		//Angle longitude = new Angle(toLongitude);
		//Angle latitude = new Angle(toLatitude);
		//GeographicCoords newPoint = new GeographicCoords(destElipsoid,longitude,latitude,toAltitude);
								
		return new MapPoint({ radians: { latitude: toLatitude, longitude: toLongitude}, altitude: toAltitude });
	}
	
}
