window.addEvent('domready', function() {
  init();	
  window.onresize = function(){resize();}	
  resize();														 
});

var snapper;
var updateRate = 10000;
var page = new Object();

function init(){
  runMap();
  $('paneltoggle').addEvent('click', function(){togglePanel();});
  //requestPosition();
  //requestPosition.periodical(updateRate);
  //updateTwitter.periodical(60000);
  requestSuccess("58.643864 -3.070667 0 14:54:04 50.0655 -5.714 125644 6");
  GEvent.addListener(map, 'click', mapClick);
  GEvent.addListener(map, 'mousemove', mouseMoving);

 $("eta-time").set("html", "15:54:04");
 $("eta-day").set("html", "Sun");

  document.addEvent("mousemove", function(e){ 
    if(e) page = e.page; 
    else {
      page.x = event.clientX;
      page.y = event.clientY;
     }
  });

  $('etahover').set("opacity", 0.85);
}

function mapClick(overlay, latlng) {
  // map clicked on
}

var closestETA;
var dist; 
var goCalculate = true;
var waiting = false;

var days = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
var start_day;
var end_day;

function setCalculate(){
	goCalculate = true;
}

var eta_distance;
var position;
var headerSize = 0;
var tracktitleSize = 0;
var current_distance;
var sector_distance;
var arrived;
		
var dy;
var dx;
var eta_total_seconds;
var complete_seconds;
var dayCount;

function mouseMoving(latlng) {
  // mouse moved on route

  //document.getElementById("debug").innerHTML += "<br /> "+page.x;

  if(snapper && goCalculate){
    //document.getElementById("debug").innerHTML = snapper.getDistAlongRoute().toFixed(0) + " meters from start at " + latlng.toUrlValue();
    goCalculate = false;
    waiting = false;
		
    setCalculate.delay(40);
    closestETA = snapper.getClosestLatLng(latlng);
    eta_distance      = (snapper.getDistAlongRoute(closestETA)/total_poly)* total_distance;	
		
    position = map.fromLatLngToContainerPixel(closestETA);
    headerSize = 0;
    tracktitleSize = 0;
		
    if(document.getElementById("header") != undefined) headerSize = parseInt($('header').offsetHeight);
    if(document.getElementById("tracktitle") != undefined) tracktitleSize = parseInt($('tracktitle').offsetHeight);
    
    if(nav_marker) current_distance = (snapper.getDistAlongRoute(nav_marker.getPoint())/total_poly)* total_distance;
    else current_distance = 0;
		
    if(eta_distance > current_distance){ sector_distance = intoMiles(eta_distance - current_distance);  arrived = false; }
    else{ sector_distance = eta_distance; arrived = true; }

   //$('debug').set("html", eta_distance+" "+current_distance);

    if(page){
    
      dy = page.y - (position.y + headerSize + tracktitleSize);
      dx = page.x - position.x;
      dist = Math.sqrt((dy*dy)+(dx*dx));

      if(dist <= 30 && current_speed > 0 && !arrived && sector_distance > 0){
        $('etahover').setStyle("display", "block");

			  if(!arrived){

          eta_total_seconds = (sector_distance / current_speed) * 60 * 60;
          if(current_speed != 0){
            //$('etatime').set("html", formatTime(eta_total_seconds)); 
						
						complete_seconds = parseInt(eta_total_seconds)+parseInt(time_seconds);
            complete_seconds += 3600;
						var hours=Math.floor(complete_seconds/3600);
						end_day = start_day;
						
						dayCount = 0;
						while(hours > 23){
							hours -= 24;
							if(end_day <= 5) end_day++;
							else end_day = 0;
							dayCount++;
							if(dayCount == 30) break;
						}
						
						$('etatime').set("html", formatTime(complete_seconds - (dayCount*(3600*24)))); 
						// $('etatimeday').set("html", days[end_day]);
                                                $('etatimeday').set("html", "Sun");
						
            $('debug').set("html", closestETA.lat()+" "+closestETA.lng());
          } else $('etatime').set("html", "Arrived");   
			 
          $('etahover').setPosition({x: (position.x+40), y: (position.y-40+headerSize+tracktitleSize)});
          if(closest_marker) closest_marker.show();
          updateClosestPoint();
			 
        } else {
			    $('etahover').setStyle("display", "none"); 
          if(closest_marker) closest_marker.hide();
        }	
		  }
    }
  } else {
		if(!waiting){ 
		  waiting = true; 
      if(mouseMoving){mouseMoving(latlng);}
    }
	}
}


var show_snapped = true;
var closest_marker;
var marker_creating = false;
var marker_loaded = false;

function updateClosestPoint(){
  if(marker_loaded) closest_marker.setPoint(closestETA);
  else if(!marker_creating) {
    marker_creating = true;
    var closest_point =snapper.getClosestLatLng(closestETA);
    var nav_icon = new GIcon();	
    var image = new Image();
    image.src = "/images/highlightPosition.gif";
  
    image.onload = function(){
      nav_icon.image = image.src;
      nav_icon.iconSize = new GSize(14, 14);
      nav_icon.iconAnchor = new GPoint(7, 7);	
      nav_icon.infoWindowAnchor = new GPoint(10, 0);
      closest_marker = new GMarker(closest_point, nav_icon, true);				
      map.addOverlay(closest_marker);		
      marker_loaded = true;
    }		
  }
}



// total distance of 842miles
var total_distance = 1355067.65;

// 76 miles
//var total_distance = 122310.144;

var total_poly = 0;
var distance_along_route = 0;

var request;

function requestPosition(){
   request = new Request({method: 'post', url: '/events/getPosition', onComplete: function(response) {requestSuccess(response);} }).send();  
}

function updateTwitter(){
  request = new Request({method: 'post', url: '/events/endtoendtwitter', onComplete: function(response) { $('twitter-feed').set("html", response); } }).send();  
}

var nav_lat;
var nav_lon;
var nav_accuracy;
var nav_marker;
var nav_map;

var prev_lat;
var prev_lon;
var time_taken;
var prev_point;

var actual_marker;
var nav_marker_creating = false;
var nav_marker_loaded = false;
var actual_marker_creating = false;
var actual_marker_loaded = false;

function toggleSnappy(){
  if(nav_marker_loaded){
    var thePoint;
    if(show_snapped)  thePoint = snapper.getClosestLatLng(new GLatLng(nav_lat, nav_lon));
    else thePoint = new GLatLng(nav_lat, nav_lon);
    nav_marker.setPoint(thePoint);
  }
}

function requestSuccess(string) {

  if(string != ""){

  var response = string.split(" ");

  // Extract location data
  nav_lat     = response[0];
  nav_lon     = response[1];

  prev_lat    = response[4];
  prev_lon    = response[5];
  time_taken  = response[6];
  start_day   = response[7];
  
  var thePoint;
  if(show_snapped)  thePoint = snapper.getClosestLatLng(new GLatLng(nav_lat, nav_lon));
  else thePoint = new GLatLng(nav_lat, nav_lon);


  if(nav_marker_loaded) nav_marker.setPoint(thePoint);
  else if(!nav_marker_creating) {
    nav_marker_creating = true;	
    var nav_point = thePoint;
    var nav_icon = new GIcon();	
    var image = new Image();
    image.src = "/assets/php/image.php?label=HotChillee";
  
    image.onload = function(){
      nav_icon.image = image.src;
      nav_icon.iconSize = new GSize(image.width, image.height);
      nav_icon.iconAnchor = new GPoint(image.width / 2, image.height);	
      nav_icon.infoWindowAnchor = new GPoint(0, 0);
      nav_marker = new GMarker(nav_point, nav_icon, true);				
      map.addOverlay(nav_marker);
      nav_marker_loaded = true;		
    }		
  }

/*

  if(actual_marker_loaded) actual_marker.setPoint(new GLatLng(nav_lat, nav_lon));
  else if(!actual_marker_creating) {
    actual_marker_creating = true;
    var nav_point =new GLatLng(nav_lat, nav_lon);
    var nav_icon = new GIcon();	
    var image2 = new Image();
    image2.src = "/assets/php/image.php?label=Rob";
  
    image2.onload = function(){
      nav_icon.image = image2.src;
      nav_icon.iconSize = new GSize(image2.width, image2.height);
      nav_icon.iconAnchor = new GPoint(image2.width / 2, image2.height);	
      nav_icon.infoWindowAnchor = new GPoint(0, 0);
      actual_marker = new GMarker(nav_point, nav_icon, true);				
      map.addOverlay(actual_marker);		
      actual_marker_loaded = true;
    }		
  }

*/


 

  if(nav_marker) distance_along_route = snapper.getDistAlongRoute(nav_marker.getPoint());
  prev_point = snapper.getClosestLatLng(new GLatLng(prev_lat, prev_lon));

  prev_distance_along_route = snapper.getDistAlongRoute(prev_point);

  // $('debug').set("html", $('debug').get("html")+"<br />prev: "+snapper.getClosestLatLng(new GLatLng(prev_lat, prev_lon)));
  // $('debug').set("html", $('debug').get("html")+"<br />current: "+nav_marker.getPoint());
   
  if(following) centreOnMarker(); 
  updateStats(response[3]);
 
  }

}

var current_speed;
var prev_distance_along_route;
var time_seconds;
var record_attempt;

function updateStats(update_time){

  var time_split   = update_time.split(':');
  time_seconds = parseInt(time_split[0]*3600) + parseInt(time_split[1] * 60) + parseInt(time_split[2]);

  //var dist = calcDistance(nav_marker.getPoint().lat(), nav_marker.getPoint().lng(), prev_point.lat(), prev_point.lng());

  var distance_finish = intoMiles((total_distance - ((distance_along_route/total_poly) * total_distance)));
  var distance_start = intoMiles((distance_along_route/total_poly) * total_distance);

  // Now doing average speed along entire route, so we only need current total distance
  var dist = (distance_along_route/total_poly) * total_distance;

  if(dist != 0) current_speed = roundNumber((dist / time_taken)/0.44704,2);

  var eta_total_seconds = (distance_finish / current_speed) * 60 * 60;
  record_attempt = (842 / current_speed) * 60 * 60;

  
/*
  $('display_last-update').set("html", formatTime(time_seconds+3600));
  $("distance_to_finish").set("html", distance_finish);
  $("distance_from_start").set("html", distance_start);
  $("current_speed").set("html", current_speed);
  if(current_speed > 0) $("eta").set("html", formatTime(record_attempt));
*/

  $('display_last-update').set("html", formatTime(time_seconds+3600));
  $("distance_to_finish").set("html", "0");
  $("distance_from_start").set("html", "842");
  $("current_speed").set("html", "24.13");
  $("eta").set("html", "34:54:04");

	var complete_seconds = parseInt(eta_total_seconds)+parseInt(time_seconds);
        complete_seconds += 3600;
	var hours=Math.floor(complete_seconds/3600);
	end_day = start_day;
	
	var dayCount = 0;
	while(hours > 23){
		hours -= 24;
		if(end_day <= 5) end_day++;
		else end_day = 0;
		dayCount++;
		if(dayCount == 30) break;
	}
	
        //if(current_speed > 0) $("eta-time").set("html", formatTime(complete_seconds - (dayCount*(3600*24))));
	//if(current_speed > 0) $("eta-day").set("html", days[end_day]);
if(current_speed > 0) $("eta-time").set("html", "15:54:04");
if(current_speed > 0) $("eta-day").set("html", "Sun");
	
	
	
  $('elapsed-time').set("html", formatTime(time_taken));  

  //$('debug').set("html", $('debug').get("html")+"<br />"+complete_seconds+" "+dayCount*3600+" "+(complete_seconds-(dayCount*3600*24)));

}

function roundNumber(num, dec) {
  var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
  return result;
}

function intoMiles(number){
  return Math.round(number / 1609.344, 2);
}

var following = false;

function formatTime(a){
  var hours=Math.floor(a/3600);
  var minutes=Math.floor(a/60)-(hours*60);
  var seconds=a-(hours*3600)-(minutes*60);

  var hs=' hour';var ms=' minute';var ss=' second';
  if (hours!=1) {hs+='s'}
  if (minutes!=1) {ms+='s'}
  if (seconds!=1) {ss+='s'}
  if(hours == 0 && minutes == 0 && seconds == 0) return "Arrived at destination";

  seconds = Math.round(seconds);
  if(hours < 10) hours = "0"+hours;
  if(minutes < 10) minutes = "0"+minutes;
  if(seconds < 10) seconds = "0"+seconds;

  return hours+":"+minutes+":"+seconds;
 //return hours+hs+', '+minutes+ms+', '+seconds+ss
} 

function setupControls(){
	var container = $("mapcontrols");
	var parent = container.parentNode;
	parent.removeChild(container);
	container.style.display = "block";
  container.set('tween', {duration: 'short'});
	container.tween('opacity', 0.6);

	container.addEvent('mouseover', function(){ container.tween('opacity', 1); });
	container.addEvent('mouseout', function(){  container.tween('opacity', 0.6); });

	var self = this;
	
  $('map').appendChild(container);

        $("z-centre-img").addEvent('click', function(){centreOnMarker();});
        $("zfollow").addEvent('click', function(){  
          if(!following){
            map.setZoom(14); 
            centreOnMarker(); 
            following = true;
          } else following = false;  
        });

        $('snaptoggle').addEvent('click', function(){ 
          if (show_snapped == true){ show_snapped = false; $('snaptoggle-image').set("src", "/images/mapControlsEnable.gif"); }
          else { show_snapped = true; $('snaptoggle-image').set("src", "/images/mapControlsDisable.gif"); }
          toggleSnappy();
        });

	$("z-in-img").addEvent('click', function(){map.zoomIn();});
	$("z-out-img").addEvent('click', function(){map.zoomOut();});
	$("z-left-img").addEvent('click', function(){ map.panDirection(1,  0); });
	$("z-right-img").addEvent('click', function(){ map.panDirection(-1,  0); });
	$("z-up-img").addEvent('click', function(){ map.panDirection(0,  1); });
	$("z-down-img").addEvent('click', function(){ map.panDirection(0,  -1); });
	$("viewmap").addEvent('click', function(){map.setMapType(map.getMapTypes()[0]);});
	$("viewsat").addEvent('click', function(){map.setMapType(map.getMapTypes()[1]);});
	$("viewter").addEvent('click', function(){map.setMapType(map.getMapTypes()[3]);});
	$("theatre").addEvent('click', function(){toggleTheatre();});

	return container;
}


function toggleTheatre(){
  var header = document.getElementById("header");
  var tracktitle = document.getElementById("tracktitle");
  var panel = document.getElementById("panel");
  if(header.style.display == "none"){
    header.style.display = "block";
    tracktitle.style.display = "block";
    // Open?
    if(parseInt(panel.style.width) <= 5) togglePanel();
  } else {
    header.style.display = "none";
    tracktitle.style.display = "none";
    // Close?
    if(parseInt(panel.style.width) > 5 || panel.style.width == '') togglePanel();		
  }
  resize();
}

function centreOnMarker(){
  if(nav_lat) map.panTo(snapper.getClosestLatLng(new GLatLng(nav_lat, nav_lon)));
  else map.panTo(snapper.getClosestLatLng(new GLatLng(50.06578, -5.71258)));
}




// Panel stuff
var panelWidth = 365;
var speed = 3;

function togglePanel(){

       if(map){ if(!map.originalCentre){ map.originalCentre = map.getBounds().getCenter();	} }

	// Get the element
	var mapdiv = document.getElementById("map");
	var panel = document.getElementById("panel");
	var anchor = document.getElementById("paneltoggle");
	var sidebar = document.getElementById("sidebar");

	// Setup width
	if(panel.status != 0 && panel.status != 1 && panel.status != -1){ 
		panel.style.width = 365 + "px";
		sidebar.style.width = 390 + "px";
		anchor.innerHTML = "&laquo;";
	}
	// Clear timeout if exists
	if (panel.movement){clearTimeout(panel.movement);}
	// Get current width
	var width = parseInt(panel.style.width);
	// Get status
	var status;
	if(panel.status == 0 || panel.status == 1){ status = panel.status; }
	else{
		if(width <= 5){
			status = 1;
			panel.status = status;
		}
		else{
			status = 0;
			panel.status = status;
		}
	}
	// Closing
	if(status == 0){

		// If the final width has been reached and we are not just starting
		if(width <= 5) {
			anchor.innerHTML = "&laquo;";
			anchor.title = "Open side panel";
			panel.status = -1;
			if(map){ map.checkResize(); map.panTo(map.originalCentre);  map.originalCentre = null; }
			return;
		}
		var dist = Math.ceil(width / speed);
		width = width - dist;
		panel.style.width = width + "px";
		sidebar.style.width = (width + 25) + "px";
		mapdiv.style.width = mapdiv.offsetWidth + dist + "px";
	}
	// Opening
	else{

		// If the final width has been reached and we are not just starting
		if (width == panelWidth){
			anchor.innerHTML = "&raquo;";
			anchor.title = "Close side panel";
			panel.status = -1;
			if(map){ map.checkResize(); map.panTo(map.originalCentre); map.originalCentre = null; }
			return;
		}
		var dist = Math.ceil((this.panelWidth - width) / this.speed);
		width = width + dist;
		mapdiv.style.width = mapdiv.offsetWidth - dist + "px";
		panel.style.width = width + "px";
		sidebar.style.width = (width + 25) + "px";
	}


   // Set timeout
   panel.movement = setTimeout(function(){togglePanel();}, 1);
}









// Route stuff

var route_locations;
var map;

var route_latitude;
var route_longitude;

function runMap(){ 


 /* if(navigator.geolocation) navigator.geolocation.watchPosition(onPositionSuccess, onPositionError,{timeout:60000, maximumAge:300000, enableHighAccuracy:true}); */

  var mapHeight = windowHeight();
  mapHeight -= 84;
  mapHeight -= 25;
	
  $('map').setStyle('height', mapHeight);
	
	
	var route_str = document.getElementById("route").innerHTML.trim();
	var route_str_arr = route_str.split(' ');
	route_locations = new Array();
	var point_before;

// 3
	
	for(var i = 0; i < route_str_arr.length; i+=2){
		route_latitude = route_str_arr[i];
		route_longitude = route_str_arr[i + 1];
		route_locations.push(new GLatLng(route_latitude,route_longitude));
	}
	
	// reversing route for nick's trip!
	//route_locations.reverse();
	
  
	
	// Create map
	// Make map visible

	
	var mapdiv = document.getElementById("map");
	// Set up map
	map = new GMap(mapdiv);
	map.addMapType(G_PHYSICAL_MAP);
	map.enableContinuousZoom();
	
	// Bound, center and zoom map
	var bounds = calculateBounds(route_locations);
	map.setCenter(bounds.getCenter());
	map.setZoom(map.getBoundsZoomLevel(bounds));
	
	// Set to satellite
	map.setMapType(G_NORMAL_MAP);
	
	
	// Add route
	var routeLineYellow = new GPolyline(route_locations, "#ffff00", 12, 0.7);
	var routeLineBlack = new GPolyline(route_locations, "#000000", 5, 1);
	//map.addOverlay(routeLineYellow);
	map.addOverlay(routeLineBlack);
	
	var finish_point = route_locations[route_locations.length - 1];
	var finish_icon = new GIcon();
	finish_icon.image = "/images/icon-race-finish.png";
	finish_icon.iconSize = new GSize(25, 25);
	finish_icon.iconAnchor = new GPoint(13, 13);	
	finish_icon.infoWindowAnchor = new GPoint(0, 0);
	this.finish_marker = new GMarker(finish_point, finish_icon, true)
	this.map.addOverlay(this.finish_marker);
	var start_point = route_locations[0];
	var start_icon = new GIcon();
	start_icon.image = "/images/icon-race-start.png";
	start_icon.iconSize = new GSize(25, 25);
	start_icon.iconAnchor = new GPoint(13, 13);	
	start_icon.infoWindowAnchor = new GPoint(0, 0);
	start_marker = new GMarker(start_point, start_icon, true)
	map.addOverlay(start_marker);

        var marker = new GMarker(map.getCenter());
        snapper = new SnapToRoute(map, marker, routeLineBlack);

        setupControls();

        total_poly = routeLineBlack.getLength();

}

function onPositionError(error) {
	//alert("geolocation error");
}

function calculateBounds(points){
	var top = null;
	var bottom = null;
	var left = null;
	var right = null;
	for(var i = 0; i < points.length; i++){
		var point = points[i];
		if(top == null){ 
			top = point;
			bottom = point;
			left = point;
			right = point;
		}
		else{
			if(parseFloat(point.lat()) > parseFloat(top.lat())){ top = point }
			if(parseFloat(point.lat()) < parseFloat(bottom.lat())){ bottom = point }
			if(parseFloat(point.lng()) > parseFloat(right.lng())){ right = point }
			if(parseFloat(point.lng()) < parseFloat(left.lng())){ left = point }
		}
	}
	// Calculate bounds
	var sw = new GLatLng(bottom.lat(), left.lng())
	var ne = new GLatLng(top.lat(), right.lng())
	var bounds = new GLatLngBounds(sw,  ne);
	return new GLatLngBounds(sw,  ne);
}

function geoDistance(lat1, lon1, lat2, lon2){	

	if(lat1 == lat2 && lon1 == lon2) return 0;

	else {
		var theta = lon1 - lon2;
		var dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
		dist = Math.acos(dist);
		dist = rad2deg(dist);
		dist *= 60;
		// convert to km
		dist *= 1.852;
		// convert to m
		dist *= 1000;
		if(isNaN(dist)) return 0;
		else return dist;
	}
}



function deg2rad(angle) {
	return (angle/180) * Math.PI;
}
function rad2deg(angle) {
	return (angle/Math.PI) * 180;
}

String.prototype.trim = function () {
    return this.replace(/^\s*/, "").replace(/\s*$/, "");
}

function getPointAt(distance, unit){
	// Calculate actual distance

	if(unit == 'km') distance *= 1000;
	else if(unit == 'm') distance *= 1609.344;
	else if(unit == 'nm') distance *= 1852;

	var pointAfter;
	// Get point after distance
	for(var i = 0; i < route_locations.length; i++){
		var point = route_locations[i];
		if(point.cumulativeDistance >= distance){
			// Check for first point
			if(i == 0) return point;
			else{
				pointAfter = point;
				break;
			}
		}
	}

	// Check for last point
	if(!pointAfter) return route_locations[route_locations .length - 1];
	// Calculate inter point
	var pointBefore = route_locations[i - 1];
	var distanceWanted = distance - pointBefore.cumulativeDistance;
	var interPointDistance = pointAfter.cumulativeDistance - pointBefore.cumulativeDistance;
	var distanceRatio = distanceWanted / interPointDistance;
	var latInc = (pointAfter.lat() - pointBefore.lat());
	var lngInc = (pointAfter.lng() - pointBefore.lng());	
	var intlat = parseFloat(pointBefore.lat()) + (latInc * distanceRatio);
	var intlng = parseFloat(pointBefore.lng()) + (lngInc * distanceRatio);

	// Return new point
	return new GLatLng(intlat, intlng);

}

function windowHeight(){
	if(typeof window.innerWidth != 'undefined') { return window.innerHeight; }
	else{
		if(document.documentElement && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0){ return document.documentElement.clientHeight; }
		else{
			if(document.body && typeof document.body.clientWidth != 'undefined') { return document.body.clientHeight; }
		}
	}
}

function resize(){

       //$('debug').set('html', $('debug').get('html') + "<br>resizing");

	var headerSize = 0;
	var tracktitleSize = 0;
	if(document.getElementById("header") != undefined) headerSize = $('header').offsetHeight;
	if(document.getElementById("tracktitle") != undefined) tracktitleSize = $('tracktitle').offsetHeight;

	var mapdiv = document.getElementById("map");

	if(headerSize == 0 && tracktitleSize == 0) mapdiv.style.height = (windowHeight() - headerSize - tracktitleSize) + "px";
	else mapdiv.style.height = (windowHeight() - headerSize - tracktitleSize) - 1 + "px";
	
  var paneltoggle = document.getElementById("paneltoggle");
	var panel = document.getElementById("panel");

	if(panel != undefined){
		panel.style.height = (windowHeight() - headerSize - tracktitleSize) - 1 + "px";
		paneltoggle.style.lineHeight = (parseInt(panel.style.height)) + "px";
		paneltoggle.style.textDecoration = 'none';
	}

	if(map) map.checkResize();

}


function calcDistance(lat1, lon1, lat2, lon2){	
	if(lat1 == lat2 && lon1 == lon2) return 0;
	else {
		var theta = lon1 - lon2;
		var dist = Math.sin(this.deg2rad(lat1)) * Math.sin(this.deg2rad(lat2)) + Math.cos(this.deg2rad(lat1)) * Math.cos(this.deg2rad(lat2)) * Math.cos(this.deg2rad(theta));
		dist = Math.acos(dist);
		dist = this.rad2deg(dist);
		dist *= 60;
		// convert to k
		dist *= 1.852;
		// convert to m
		dist *= 1000;
		if(isNaN(dist)) return 0;
		else return dist;
	}
}

