var SUMMARY_FILE = 'data/ener-summary.xml';

function my_load() {
   new Ajax.Request (SUMMARY_FILE + '?ran=' + Math.random(),
		     {
			method:'get',
			onSuccess: useSummary,
			onFailure: onFailure
		     });
}

function my_unload() {
}

// ------------------
// Expedition summary
// ------------------

function onFailure() {

   var errDiv = document.getElementById ('errormsg');
   errDiv.style.display = 'block';
   errDiv.innerHTML =
   'Expedition data are not available, or they are corrupted. ' +
   'Please try again later, or contact Martin Senger at ' +
   'martin.senger' + '@' + 'gmail.com. Thank you.';

}

var NA = '[no data available]';
var EST_LENGTH = 150;   // estimated expedition length in days

function useSummary (transport) {
   var totals = transport.responseXML.getElementsByTagName ("total")[0];
   if (totals) {
      var kms = totals.getAttribute ('kms');
      if (kms && kms == parseFloat (kms)) {
	 kms = Math.round (kms * 10) / 10;
      } else {
	 kms = NA;
      }
      document.getElementById ('totalkms').innerHTML = kms;

   } else {
      document.getElementById ('totalkms').innerHTML = NA;
   }

   // days (they are not actually taken from the XML response)
   var days;
   var elapsed = new Date().getTime() - startTime;
   if (elapsed < 0) {
      // expedition has not yet started
      days = 0;
   } else {
      days = elapsed / oneDay;
   }
   var done = days * 100 / EST_LENGTH;
   done = Math.round (done * 100) / 100;
   if (done > 100)
      done = 100;
   document.getElementById ('part_done').style.width = done + '%';
   document.getElementById ('part_notyet').style.width = 100 - done + '%';
   document.getElementById ('percent').innerHTML = done + '%';

}

// -------------------------------------------------
// Digital elapsed time from the Expedition kick off
// -------------------------------------------------

// kick-off time in millis

var startTime = new Date ('January 25, 2010 08:00:00').getTime();
var endTime = new Date ('June 05, 2010 20:00:00').getTime();

// how many millis is in various units
var oneDay    = 1000 * 60 * 60 * 24;
var oneHour   = 1000 * 60 * 60;
var oneMinute = 1000 * 60;
var oneSecond = 1000;

// an object displaying (graphically) the elapsed time
var digitClock = new Object();

// images of digits
var DIGIT_WIDTH = 25;
var DIGIT_HEIGHT = 21;
var DIGITS_PATH = "images/digits/";
digitClock.digitURLs = [DIGITS_PATH + '0wind.gif',
			DIGITS_PATH + '1wind.gif',
			DIGITS_PATH + '2wind.gif',
			DIGITS_PATH + '3wind.gif',
			DIGITS_PATH + '4wind.gif',
			DIGITS_PATH + '5wind.gif',
			DIGITS_PATH + '6wind.gif',
			DIGITS_PATH + '7wind.gif',
			DIGITS_PATH + '8wind.gif',
			DIGITS_PATH + '9wind.gif' ];

// preload images
var digits = [];
for (var i = 0; i < digitClock.digitURLs.length; i++) {
   digits[i] = new Image (DIGIT_WIDTH, DIGIT_HEIGHT);
   digits[i].src = digitClock.digitURLs[i];
}

// return a 3-element array with 'number' splitted into its digits:
// i.e. for number '13' it returns (0,1,3), for number '5' it returns (0,0,5);
// number should be in the range [0, 999] only
function splitNumber (number) {
   if (number > 999)
      number = 999;
   if (number < 0)
      number = 0;
   var e1 = Math.floor (number / 100);
   var e2 = Math.floor ((number - e1 * 100) / 10);
   return (new Array (e1, e2, number - e1 * 100 - e2 * 10));
}

// return true if expedition has finished;
// the decision is based on the global variable 'endTime'
function expeditionHasFinished() {
   return (new Date().getTime() > endTime);
}

// call this to display the clock 
digitClock.display = function() {
   var clock = this;
   this.update();
   if (! expeditionHasFinished())
      setInterval (function() { clock.update() }, 1000);
}

// this is called every second to update images with clock digits
digitClock.display.prototype.update = function() {
   var imageIdx = new Array();  // indeces of images in the 'digits' array
   var elapsed;
   if (expeditionHasFinished()) {
      // expedition finished: elapsed = the whole expedition time
      elapsed = endTime - startTime;
   } else {
      elapsed = new Date().getTime() - startTime;
   }
   if (elapsed < 0) {
      // expedition has not yet started - put here zeros
      //          d d d h h m m s s
      imageIdx = (0,0,0,0,0,0,0,0,0);
   } else {
      var days = Math.floor (elapsed / oneDay);
      var reminderAfterDays = elapsed % oneDay;

      var hours = Math.floor (reminderAfterDays / oneHour);
      var reminderAfterHours = reminderAfterDays % oneHour;

      var minutes = Math.floor (reminderAfterHours / oneMinute);
      var reminderAfterMinutes = reminderAfterHours % oneMinute;

      var seconds = Math.floor (reminderAfterMinutes / oneSecond);

      imageIdx = imageIdx.concat (splitNumber (days),
      				  splitNumber (hours).slice (1),
      				  splitNumber (minutes).slice (1),
      				  splitNumber (seconds).slice (1));
   }
   if (document.images) {
      for (var i = 0; i < imageIdx.length; i++) {
	 if (document.images  ['t' + i]) {
	    document.images ['t' + i].src = digits [imageIdx[i]].src;
	 }
      }
   }
}
