/*
 * Finish
 * Calls tasks on document ready
 * Author: toovey
 * Adapted from sam eubank's finish.js
 *
 * @requires Log
 * @requires Timer
 * @requires Stats
 *
 * TODO: Output % of total time for tasks rather than just time in milliseconds
 */

var Finish = {

  startTime: (new Date()).getTime(),

  /**
  * Set another task to be run on dom:loaded.
  */
  addTask: function(task, name) {
    task.name = name;
    this.tasks.push(task);
  },

  /**
  * Run all finishing tasks.
  */
  runTasks: function() {
    Log.debug('Running setup tasks');
    var finish = Finish;
    var enableStats = (Math.random() < 0.001);
    if (enableStats) {
      Stats.event('started Finish.runTasks', navigator.userAgent);
    }
    Timer.start('Finish.runTasks');

    var tasks = finish.tasks;
    for (var index = 0; index < tasks.length; index++) {
      var task = tasks[index];
      if (typeof task == 'string') {
        Log.error('Missed: ' + task);
      }
      var taskName = task.name;
      if (taskName) {
        Timer.start(taskName);
      }
      try {
        task();
      }
      catch (e) {
        Log.error('Error in ' + (taskName ? taskName : task) + ':' + e);
      }
      if (taskName) {
        Timer.log(taskName, 1);
      }
    }
    Timer.log('Finish.runTasks');
    if (enableStats) {
      Stats.event('finished Finish.runTasks', navigator.userAgent);
    }
    finish.tasks = [];
  },

  /**
  * Tasks to run on dom:loaded.
  */
  tasks: []
};

$j(function() {
  Finish.runTasks();
});