    var started = false;
    var startTime = 0;
    var now;
    var distance = 1000;
    var timer;
    var startColor = [0xA0, 0x00, 0];//[0xC0, 0x70, 0];
    var endColor = [0xFF, 0x30, 0x30];//[0xFF, 0x98, 0x30];    
    var storage = new Array();
    
    function setup() {
      if (!navigator.language) {
        return;
      }  
      var language = navigator.language.toLowerCase();
      if (language.indexOf("en") >= 0 && language.indexOf("ca") < 0) {
        document.getElementById("Unit").selectedIndex = 2;
        update();
      }
      setTimeout(function() {window.scrollTo(0, 1)}, 1);
    }
    
    function start() {
      startTime = new Date().getTime();
      resume(true);
    }
    
    function stop() {
      update();
      if (timer) {
        clearTimeout(timer);
      }  
      document.getElementById("StartButton").onclick = start;      
      document.getElementById("StartButton").innerHTML = "Restart";
      document.getElementById("StartButton").style.backgroundColor = "#FF8000";
      document.getElementById("ResumeButton").style.display = "inline";
      save();
    }
    
    function resume(newStart) {
      document.getElementById("ResumeButton").style.display = "none";
      document.getElementById("StartButton").onclick = stop;
      document.getElementById("StartButton").innerHTML = "Stop";
      if (timer) {
        clearTimeout(timer);
      }  
      timer = setTimeout(tick, 100);
      if (!newStart && storage.length > 0) {
        storage.pop();
        recreateHistory();
      }  
    }
    
    function update() {
      //var now = new Date().getTime();
      if (startTime == 0) {
        document.getElementById("Time").innerHTML = "0.00&nbsp;s";
        document.getElementById("Time").time = 0;        
      }
      else {
        document.getElementById("Time").innerHTML = ((now - startTime) / 1000).toFixed(2) + "&nbsp;s";
        document.getElementById("Time").time = (now - startTime) / 1000;        
      }  
      if (document.getElementById("Unit").selectedIndex < 2) {
        document.getElementById("Speed1").innerHTML = (getKmh(now)).toFixed(2) + "&nbsp;km/h";
        document.getElementById("Speed2").innerHTML = (getMih(now)).toFixed(2) + "&nbsp;mph";
      }
      else {
        document.getElementById("Speed1").innerHTML = (getMih(now)).toFixed(2) + "&nbsp;mph";
        document.getElementById("Speed2").innerHTML = (getKmh(now)).toFixed(2) + "&nbsp;km/h";
      }  
    }

    function tick() {
      now = new Date().getTime();
      var factor = (1 - Math.cos((now - startTime) / 300)) / 2;
      var color = 0;
      var shift = 1;
      for (var i = 2; i >= 0; i--) {
        color += shift * parseInt((startColor[i] + (endColor[i] - startColor[i]) * factor));
        shift *= 256;
      }
      color = parseInt(color);
      document.getElementById("StartButton").style.backgroundColor = "#" + color.toString(16);
      update();
      timer = setTimeout(tick, 100);      
    }
    
    function getKmh(now) {
      if (startTime == 0) {
        return 0;
      }  
      return getDistance() / (now - startTime) * 3600;
    }

    function getMih(now) {
      if (startTime == 0) {
        return 0;
      }  
      return getDistance() / (now - startTime) * 3600 / 1.609344;
    }
    
    function getDistance() {
      var value = parseFloat(document.getElementById("Distance").value);      
      if (value == NaN) {
        value = 0;
      }  
      switch(document.getElementById("Unit").selectedIndex) {
        case 0:
          return value * 1000;
        case 1:
          return value;
        case 2:
          return value * 1609.344;
        case 3:
          return value * 0.9144;      
      }
      return 0;
    }
    
    function save() {
      var item = new Object();
      item.distance = getDistance();
      item.time = document.getElementById("Time").time;
      storage.push(item);
      appendHistory(item, storage.length % 2 == 0);
      updateTotals();
    }
    
    function appendHistory(item, isEven, element) {
      var unit = document.getElementById("Unit").selectedIndex;
      
      document.getElementById("HistoryTable").style.display = "block";
      document.getElementById("HistoryEmpty").style.display = "none";
      document.getElementById("HistoryButtons").style.display = "block";
      var tr = document.createElement("tr");

      var td = document.createElement("td");
      td.align = "right"; 
      td.style.paddingRight = "5px";
      switch (unit) {
        case 0:  
          item.mailDistance = (item.distance / 1000).toFixed(1) 
          td.innerHTML = item.mailDistance + "&nbsp;km";
          break;
        case 1:
          item.mailDistance = item.distance;
          td.innerHTML = item.mailDistance + "&nbsp;m";
          break;
        case 2:  
          item.mailDistance = (item.distance / 1609.344).toFixed(1);
          td.innerHTML = item.mailDistance + "&nbsp;Mi";
          break;
        case 3:  
          item.mailDistance = parseInt((item.distance / 0.9144));
          td.innerHTML = item.mailDistance + "&nbsp;ya";
          break;
      }          
      tr.appendChild(td);

      td = document.createElement("td");
      td.align = "right"; 
      td.style.paddingRight = "5px";
      td.innerHTML = item.time.toFixed(2) + "s";                
      tr.appendChild(td);

      td = document.createElement("td");
      td.align = "right"; 
      td.style.paddingRight = "5px";
      if (item.time == 0) {
        td.innerHTML = "0.00";
      }
      else {
        if (unit < 2) {
          item.speed = (item.distance / item.time * 3.6).toFixed(2);
          td.innerHTML = item.speed + "&nbsp;km/h";
        }
        else {
          item.speed = (item.distance / item.time * 3.6 / 1.609344).toFixed(2);
          td.innerHTML = item.speed + "&nbsp;mph";
        } 
      }    
      tr.appendChild(td);

      if (!element) {
        td = document.createElement("td");
        var img = document.createElement("img");
        img.src = "close.png";
        img.style.paddingTop = "4px";
        img.style.paddingBottom = "4px";
        td.appendChild(img);
        td.item = item;
        td.align = "right"; 
        td.onclick = function() {
          var item = this.item;
          for (var i = 0; i < storage.length; i++) {
            if (storage[i] == item) {
              storage.splice(i, 1);
              var tr = this.parentNode;
              tr.parentNode.removeChild(tr);
              //saveHistory();
              updateTotals();
              if (storage.length == 0) {
                clearHistory(true);
              }
              break;
            }
          }
        }
        tr.appendChild(td);
      }
      else {
        tr.appendChild(document.createElement("td"));
      }

      if (isEven) {
        tr.className = "even";
      }
      if (element) {
        element.appendChild(tr);
      }
      else {  
        document.getElementById("HistoryBody").appendChild(tr);
      }  
    }
    
    function calcTotals() {
      var totals = new Object();
      totals.distance = 0;
      totals.time = 0;
      for (var i = 0; i < storage.length; i++) {
        totals.distance += storage[i].distance;
        totals.time += storage[i].time;
      }
      return totals;
    }
    
    function updateTotals() {
      var totals = calcTotals();
      var footer = document.getElementById("HistoryFooter");
      if (footer.firstChild) {      
        footer.removeChild(footer.firstChild);
      }  
      appendHistory(totals, false, footer); 
    }
    
    function unitsUpdated() {
      update();
      recreateHistory();
    }
    
    function clearHistory(passConfirm) {
      if (!passConfirm && !confirm("Do you really want to remove all history entries?")) {
        return;
      }
      document.getElementById("HistoryBody").innerHTML = "";
      storage = new Array();
      //saveHistory();
      document.getElementById("HistoryTable").style.display = "none";
      document.getElementById("HistoryButtons").style.display = "none";
      document.getElementById("HistoryEmpty").style.display = "block";      
      document.getElementById("ToggleHistory").style.display = "none";
      document.getElementById("Chart").style.display = "none";      
    }
    
    function recreateHistory() {
      document.getElementById("HistoryBody").innerHTML = "";
      for (var i = 0; i < storage.length; i++) {
        appendHistory(storage[i], i % 2 == 0);
      }
      updateTotals();
    }
    
    function mailHistory() {
      var unit = document.getElementById("Unit").selectedIndex;
      var body = "Distance";
      switch (unit) {
        case 0:  
          body += "(km)";
          break;
        case 1:
          body += "(m)";
          break;
        case 2:  
          body += "(Mi)";
          break;
        case 3:  
          body += "(ya)";
          break;
      }          
      body += ",Time,Speed";
      if (unit < 2) {
        body += "(km/h)";
      }
      else {
        body += "(mph)";
      }       
      body += "<br>";
      for (var i = 0; i < storage.length; i++) {
        var item = storage[i];
        body += item.mailDistance + ",";
        body += item.time + ",";
        body += item.speed + "<br>";
      }
      var distance = 0;
      var time = 0;
      var speed = 0;
      for (var i = 0; i < storage.length; i++) {
        distance += parseFloat(storage[i].mailDistance);
        time += parseFloat(storage[i].time);
        speed += parseFloat(storage[i].speed);
      }
      body += "Totals:<br>" + distance + "," + time + "," + speed/storage.length; 
      window.open("mailto:?subject=SpeedoMeter&body=" + body, "_self");
    }

    function tellFriend() {
      var body = "Hi,<br><br>I just stumbled upon this SpeedoMeter iPhone application:" +
          "<br><br>http://www.itunes.com/app/speedometerapp<br><br>" +
          "which helps to calculate the average velocity over a given distance, " +
          "e.g. while walking, jogging or to check your cars speedometer." +
          "<br><br>Best regards";
      window.open("mailto:?subject=SpeedoMeter on the iPhone&body=" + body, "_self");  
    }  

    function debug(msg) {
      var e = document.getElementById("Debug");
      e.innerHTML += msg + "<br>";
    }
