var kEarthRadius = 6378000;
var kFlattening = 21000;
var kRadian = 0.017453292519943;
var kSin1Degree = Math.sin ( kRadian );

function PolarVector ( direction, distance ) {
	this.direction	= direction ? direction : 0.0;
	this.distance	= distance ? distance : 0.0;
}
GLatLng.prototype.earthRadius = function ( ) {
	return kEarthRadius - kFlattening * Math.sin ( this.latRadians() );
}
GLatLng.prototype.vectorFrom = function( other, previousDirection ) {
	if ( this.equals ( other ) )
		return new PolarVector ( ( previousDirection || 0.0 ), 0.0 );
	var deltaLatDeg = this.lat()  - other.lat();
	var deltaLonDeg = this.lng()  - other.lng();
	var radius = this.earthRadius();
	var distancePerDegreeLatitude = radius * kSin1Degree;
	var distancePerDegreeLongitude = distancePerDegreeLatitude * Math.cos ( this.latRadians() );
	var deltaLat = deltaLatDeg * distancePerDegreeLatitude;
	var deltaLon = deltaLonDeg * distancePerDegreeLongitude;
	var distance = Math.sqrt( deltaLat * deltaLat + deltaLon * deltaLon);
	var course	 = Math.asin ( deltaLat / distance ) / kRadian;
	if ( deltaLonDeg > 0.0 )
		course =  90.0 - course;
	else
		course = 270.0 + course;
	return new PolarVector ( course, distance );
}
function formatDegMinSec( degree, negativ, positiv, len ) {
	var hemisphere = ( degree < 0 ? negativ : positiv );
	degree = Math.abs(degree);
	var _deg = Math.floor(degree);
	var temp = ( degree - _deg ) * 60;
	var _min = Math.floor(temp);
	temp = ( temp - _min ) * 60;
	var _sec = Math.floor(temp);
	var deg = String(_deg);
	while ( deg.length < len ) { deg = '0' + deg; }
	var min = ( _min < 10 ? '0' + _min : String(_min) );
	var sec = ( _sec < 10 ? '0' + _sec : String(_sec) );
	return deg + '˚ ' + min + "' " + sec + '" ' + hemisphere;
}
GLatLng.prototype.formatDegMinSec = function ( ) {
		var result = { lat: '0', lon: '0' };
		result.lat = formatDegMinSec( this.lat(), 'S', 'N', 1 );
		result.lon = formatDegMinSec( this.lng(), 'W', 'E', 1 );
		return result;
}

var kDefaultDimension = 1;
var kMeterToKilometer = 0.001;
var kMeterToNauticalMiles = 0.0005399568;
var kMeterToStatuteMiles = 0.000621371192237;
var kMeterToFeet = 3.28083989501;
var kMeterPerSecondsToKilometerPerHour = 3.6;
var kMeterPerSecondsToKnots = 1.9438445;
var kMeterPerSecondsToMilesPerHour = 2.236942;
var kMeterPerSecondsToFtPerMinute = 196.85;

var kDimensions = [
	{	// 0 --> km, m, km/h, m/s
		distance:{	factor : kMeterToKilometer, dim : "km" },
		altitude:{	factor : kDefaultDimension, dim : "m" },
		hSpeed : {	factor : kMeterPerSecondsToKilometerPerHour, dim : "km/h" },
		vSpeed : {	factor : kDefaultDimension, dim : "m/s" }
	},
	{	// 1 -->  nm, ft, kts, fpm
		distance:{	factor : kMeterToNauticalMiles, dim : "nm" },
		altitude:{	factor : kMeterToFeet, dim : "ft" },
		hSpeed : {	factor : kMeterPerSecondsToKnots, dim : "kts" },
		vSpeed : {	factor : kMeterPerSecondsToFtPerMinute, dim : "fpm" }
	},
	{	// 2 --> mi, ft, mph, fpm
		distance:{	factor : kMeterToStatuteMiles, dim : "mi" },
		altitude:{	factor : kMeterToFeet, dim : "ft" },
		hSpeed : {	factor : kMeterPerSecondsToMilesPerHour, dim : "mph" },
		vSpeed : {	factor : kMeterPerSecondsToFtPerMinute, dim : "fpm" }
	},
	{	// 3 --> nm, ft, kts, kts
		distance:{	factor : kMeterToNauticalMiles, dim : "nm" },
		altitude:{	factor : kMeterToFeet, dim : "ft" },
		hSpeed : {	factor : kMeterPerSecondsToKnots, dim : "kts" },
		vSpeed : {	factor : kMeterPerSecondsToKnots, dim : "kts" }
	}
];

