/**
 * @author apellet
 */
function distance ( latlng1, latlng2 )
{
	var R = 6371; // km
	var dLat = (latlng2.lat() - latlng1.lat() ).toRad();
	var dLon = (latlng2.lng() - latlng1.lng() ).toRad(); 
	var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    	    Math.cos(latlng1.lat().toRad()) * Math.cos(latlng2.lat().toRad()) * 
        	Math.sin(dLon/2) * Math.sin(dLon/2); 
	var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
	var d = R * c;
	return d;
}
Number.prototype.toRad = function() {  // convert degrees to radians
  return this * Math.PI / 180;
}
Number.prototype.toDeg = function() {  // convert radians to degrees (signed)
  return this * 180 / Math.PI;
}

Number.prototype.toBrng = function() {  // convert radians to degrees (as bearing: 0...360)
  return (this.toDeg()+360) % 360;
}

function virtualRectangle ( center, detour )
{
	var bounds = new GLatLngBounds();
	var circleRadius = Math.sqrt( Math.pow( detour, 2 ) * 2);
	//console.log ( circleRadius );
	var rectanglePoints = Array();
	var rectangle = null;
	
	with (Math) 
	{
		var d = circleRadius/6378.8;	// radians
	
		var lat1 = (PI/180)* center.lat(); // radians
		var lng1 = (PI/180)* center.lng(); // radians

		for (var a = 45 ; a < 360 ; a+=90 )
		{
			var tc = (PI/180)*a;
			var y = asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc));
			var dlng = atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(y));
			var x = ((lng1-dlng+PI) % (2*PI)) - PI ; // MOD function
			var point = new GLatLng(parseFloat(y*(180/PI)),parseFloat(x*(180/PI)));
			rectanglePoints.push(point);
			bounds.extend ( point );
		}
		
		if ( drawRect == true )
		{
			rectanglePoints.push(rectanglePoints[0]);		
			if (d < 1.5678565720686044)
			{
				rectangle = new GPolygon(rectanglePoints, '#000000', 2, 1, '#000000', 0.25);	
			}
			else
			{
				rectangle = new GPolygon(rectanglePoints, '#000000', 2, 1);	
			}
			GEvent.addListener ( rectangle, "click", function(){
				//console.log ( arguments );
				map_click(arguments[0]);
			} );
			
			map.addOverlay(rectangle);  
			
		}

	}
	return bounds;
}

