/**
 * @depends prototype.js
 */
 
var Loader = {
  _assets: $H({}),
  _checkInterval: null,
  _options: {},
  _update: function() {
    var allLoaded = true;
    Loader._assets.each(function(a){
      if(!a[1].complete && a[1].image.complete) {
        a[1].complete = true;
        a[1].completed_at = new Date().getTime();;
        if(a[1].options.onComplete) a[1].options.onComplete(a[0]);
      }
      if(!a[1].complete && !a[1].image.complete) allLoaded = false;
    });
    if(allLoaded) {
      clearInterval(Loader._checkInterval);
      Loader._checkInterval = null;
      if(Loader._options && Loader._options.onComplete) Loader._options.onComplete();
      Loader._options = null;
    }
  },
  initialize: function() {
    var options = arguments[0] || {};
    Loader._options = options;
  },
  cacheOrLoad: function(url) {
    var options = arguments[1] || {};
    if(this.isLoaded(url)) {
      if(options.onComplete) options.onComplete(url);
    } else {
      this.load(url, options);
    }
  },
  load: function(url) {
    var options = arguments[1] || {};
    if(Loader._assets.get(url)) {
	   if (options.onComplete) options.onComplete(url);
	   return;
    }
    var a = {};
    a.image = new Image();
    a.image.src = url;
    a.complete = false;
    a.options  = options;
    a.loaded_at = new Date().getTime();
    if (!Engine.isSafari2)  
      Event.observe(a.image, 'error', function(){ Loader.error(url) });
    Loader._assets.set(url, a);
    if(!Loader._checkInterval) Loader._checkInterval = setInterval(Loader._update,10);
  },
  error: function(url) {
    var asset = Loader._assets.get(url);
    asset.complete = true;
    if(asset.options.onComplete) asset.options.onComplete('/images/empty.gif');
  },
  stats: function(url) {
    return (Loader._assets.get(url)._complete ?
      (Loader._assets.get(url)._completed_at - Loader._assets.get(url)._loaded_at) : null);
  },
  isQueued: function(url) {
    return !!(Loader._assets.get(url));
  },
  isLoaded: function(url) {
    return (Loader._assets.get(url) && Loader._assets.get(url).complete);
  },
  reset: function() {
    Loader._assets = $H({});
  }
};