tt.Initializer = function (packages, onReady) {
  this.packages = packages;
  this.onReady = onReady;
};

var nscl = tt.Initializer;
var nsin = tt.Initializer.prototype;

nscl.create = function (packages, onReady) {
  var i = new nscl(packages, onReady);
  Event.observe(window, 'load', function () {
    i.load();
  });
  return i;
};

nsin.load = function () {
  var pr = tt.Loader.defaultPathRoot + 'packages/';
  var ps = $A(this.packages);
  ps.push('debug');
  var or = this.onReady;

  var loadPackage = function (i) {
    if (i >= ps.length) {
      or();
      return;
    }
    new Ajax.Request(pr + ps[i] + '.js', {'method': 'get', 'onComplete': function (r) {
      var p = r.responseText.evalJSON();
      if (p.packages != undefined) {
        for (var j = 0; j < p.packages.length; j++) {
          var pkg = p.packages[j];
          if (ps.indexOf(pkg) == -1) {
            ps.push(pkg);
          }
        }
      }
      var jfs = [];
      if (p.js != undefined) {
        for (var j = 0; j < p.js.length; j++) {
          jfs.push('javascript/' + p.js[j] + '.js');
        }
      }
      var l = tt.Loader.create(jfs);
      l.load(function () {
        loadPackage(i + 1);
      });
    }});
  };
  loadPackage(0);
};
