var HOUR_OFFSET = -4;
var MAX_SPEED = 40 / 1.82; // km/h -> knots
var STALL_SPEED = 2 / 1.82; // km/h -> knots  

var map, hoverMarker;
var icons = {};
var timelineZoom = 3;

var allPoints = [];

var gradient = new Gradient({
  '0.0': black,
  '0.3': new Color(220, 0, 0),
  '0.5': new Color(255, 100, 0), 
  '0.7': new Color(255, 255, 0),
  '1.0': white
}); 

var rest_icon_template = 'http://www.google.com/chart?chst=d_fnote_title&chld=balloon|2|555|h|Stopped%20|xxx%20minutes%20%20|';

var img = {
  flag: "img/round-green.png",
  hover: "http://maps.google.com/intl/en_ALL/mapfiles/dd-via.png"
};



google.setOnLoadCallback(function() {
  var startLL = new google.maps.LatLng(45.350230, -75.816592);
  var startZoom = 4;
  
  changeSidebarBottom('hide'); 
  $('#blackout').css({ opacity: 0.6 });
  $('#blackout').fadeIn();

  $(window).resize(function () {
    $('.changeheight').height($(window).height() -
        ($('#toolbar').outerHeight() + 34) -
        ($('#timeline').outerHeight() + 10));
    $('#timeline').width($('#timeline-wrapper').innerWidth() - 
        ($('#timeline-controls').outerWidth() + 22));
    $('#selection-internal').height($(window).height() - 90);
    changeSidebarBottom();
  }).resize();
  $(window).unload(GUnload);
  map = new google.maps.Map2(document.getElementById("map"));
  map.addControl(new google.maps.SmallMapControl());
  map.addControl(new google.maps.MapTypeControl());
  map.setMapType(G_HYBRID_MAP);

  icons.flag = new google.maps.Icon();
  icons.flag.image = img.flag; 
  icons.flag.iconSize = new google.maps.Size(14, 14);
  icons.flag.iconAnchor = new google.maps.Point(6, 7);

  icons.hover = new google.maps.Icon();
  icons.hover.image = img.hover; 
  icons.hover.iconSize = new google.maps.Size(11, 11);
  icons.hover.iconAnchor = new google.maps.Point(5, 5);
  
  hover = new google.maps.Marker(new google.maps.LatLng(0, 0),
      { icon: icons.hover, hide: true, zIndexProcess: function() { return 100000; } });
  map.addOverlay(hover);
  setupTimelineEventHandlers();
    
  $('#button-zoom-in, #button-zoom-out').click(function() {
    var scrollPosition = $('#timeline').scrollLeft() + ($('#timeline').width() / 2) - $('#bookend-start').width();
    if (this.id == 'button-zoom-in' && timelineZoom > 0) {
      timelineZoom--;
      scrollPosition *= 2;
    } else if (this.id == 'button-zoom-out' && timelineZoom < 7) {
      timelineZoom++;
      scrollPosition /= 2;
    }
    setTimelineZoom(timelineZoom);
    $('#timeline').scrollLeft(scrollPosition + $('#bookend-start').width() - $('#timeline').width() / 2);
  });
  
  $('#pointinfo .controls .button-close').click( function() {
    changeSidebarBottom('hide');
  });

  var hashParts = String(window.location).split('#');
  
  if (hashParts.length >= 2 && hashParts[1].length > 0) {
    // data file given on url
    loadData(hashParts[1]);
  } else {
    // show file selector
    $('#selection').fadeIn();
    $.getJSON('list_logs.php', function(data) {
      var ol = $('#selection-internal ol');
      $.each(data, function(i, file) {
        ol.append('<li id="f' + i + '"><a href="#">' +
                  '<span>' + Math.round(file.s / 1000) + ' KB</span>' +
                  file.n + '</a></li>');
        $('#f' + i + ' a').click(function() {
          loadData('logs/' + file.n);
          $('#selection').fadeOut();
          return false;
        });
      });
    });
  }
});


function setupTimelineEventHandlers() {
  $('#timeline-internal li')
    .live('mouseover', function() {
      var data = allPoints[String(this.id).split('i')[1]];
      if (!data) return;
      
      hover.setLatLng(data.latlng);
      hover.show();
    })
    .live('mouseout', function() {
      hover.hide();
    })
    .live('click', function() {
      var data = allPoints[String(this.id).split('i')[1]];
      if (!data) return;
      
      if (!map.getBounds().containsLatLng(data.latlng)) { map.panTo(data.latlng); }
      $("#time-local").html(data.time.render({ seconds: true }) + " EST");
      $("#lat").html(roundTo(data.latlng.lat(), 6));
      $("#lng").html(roundTo(data.latlng.lng(), 6));
      $("#bearing").html(roundTo(data.bearing, 1) + "&deg;");
      $("#landspeed").html(roundTo(data.speed * 1.852, 1) + " km/h");
      $("#pointinfo").show();
      changeSidebarBottom('show');
    })
    .live('dblclick', function() {
      var data = allPoints[String(this.id).split('i')[1]];
      if (!data) return;
      
      if (!data.flag) {
        data.flag = new google.maps.Marker(data.latlng, icons.flag)
        map.addOverlay(data.flag);
        $(this).append('<span class="flag"></span>');
        recomputeSidebar();
      }
    });
  $('#timeline-internal li .flag')
    .live('mouseover', function() {
      var data = allPoints[String($(this).parent().id).split('i')[1]];
      if (!data) return;
      
      hover.setLatLng(data.latlng);
      hover.show();   
    })
    .live('mouseout', function() {
      hover.hide();
    });
}


function recomputeSidebar() {
  lastPointData = null;
  lastFlagData = null;
  distance = 0;
  $('#ranges').empty();
  $.each(allPoints, function(pointNum, pointData) {
    if (lastPointData && lastFlagData) {
      distance += pointData.latlng.distanceFrom(lastPointData.latlng);
    }
    if (pointData.flag) {
      if (lastFlagData) {
        var rangeDetails = $('#ranges-pattern .rangedetails').clone();
        
        if (distance >= 1000) {
          $('span.distance', rangeDetails).html(roundTo(distance / 1000, 2) + ' km');
        } else {
          $('span.distance', rangeDetails).html(roundTo(distance, 0) + ' m');
        }
        
        var timeInterval = new TimeInterval(pointData.time, lastFlagData.time);
	$('span.time', rangeDetails).html(timeInterval.render());

	var meanSpeed = distance / timeInterval.inSeconds();
	$('span.speedmean', rangeDetails).html(roundTo(meanSpeed * 3.6, 1) + ' km/h');
        
//	$('span.speedmax', rangeDetails).html(meanSpeed * 3.6 + ' km/h');
        
        rangeDetails.appendTo('#ranges');        
      }

      var rangeEnd = $('#ranges-pattern .rangeend').clone();
      $('h3', rangeEnd).html(pointData.time.render({ seconds: true }) + " EST");
      rangeEnd.appendTo('#ranges');
      lastFlagData = pointData;
      distance = 0;
    }
    
    lastPointData = pointData;
  });
  
  $('#instructions').hide();
}
 

