    var g_trackTimer = 0;
    var g_trackTimerDelta = 0;
    var g_trkTimer;
    var g_trkSpeed = 30; // Timer increment in seconds

    function resetTrackTimer()
    {
      // Initialise the timer to the largest 1st value in each of the tracks in g_Tracks
      var i;

      g_trackTimer = 0;

      // Stop the automatic clock from ticking
      g_trackTimerDelta = 0;
      clearTimeout(g_trkTimer);

      // Now initialise to the start of the latest track
      for(i=0; i<g_tracks.length; i++)
      {
        g_trackTimer = Math.max(Number(g_trackTimer), Number(g_tracks[i][0].secs));
        debug("resetTrackTimer() : track : " + i + " Start time : " + g_tracks[i][0].secs + "  Current track timer : " + g_trackTimer);

        g_tracks_index[i] = -1;  // Reset the plotting pointer;
      }

      reportTime(g_trackTimer, "   Reset");
      debug("resetTrackTimer() : Time =" + g_trackTimer);
    }


    function startTrackTimer()
    {
      g_trackTimerDelta = g_trkSpeed; // Time increment, in seconds
      trackTimer();
      debug("startTrackTimer() : Time =" + g_trackTimer);
    }

    function stopTrackTimer()
    {
      g_trackTimerDelta = 0;
      clearTimeout(g_trkTimer);

      reportTime(g_trackTimer, "   Stopped");
      debug("stopTrackTimer() : Time =" + g_trackTimer);
    }

    function trackTimer()
    {
      g_trackTimer += g_trackTimerDelta;
      reportTime(g_trackTimer, "   Running");

      if (drawTracks())                                // Call drawtracks upto the current time
      {
        reportTime(g_trackTimer, "   Finished");       // Reached the end of a track
      }
      else
      {
        g_trkTimer = setTimeout('trackTimer()',100);   // Keep going!  Keep calling every Xms
      }

      debug("trackTimer() : Time =" + g_trackTimer);
    }


