var Loader = Class.create();

Loader.prototype = {
	 		
	_assets: $H({}),
	_checkInterval: null,
	_options: {},
	
	initialize: function() {
		var options = arguments[0] || {};
	  	Loader._options = 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;
	  	}
	},
		
	cacheOrLoad: function(url) {
	  	var options = arguments[1] || {};
	  	if(this.isLoaded(url)) {
	    	if(options.onComplete) options.onComplete();
	  	} else {
	    	this.load(url, options);
	  	}
	},
	
	load: function(url) {
	  	if(Loader._assets[url]) return;
	  	var options = arguments[1] || {};
		var a = {};
		a.image = new Image();
		a.image.src = url;
		a.complete = false;
		a.options  = options;
		a.loaded_at = new Date().getTime();
		Event.observe(a.image, 'error', function() { Loader.error(url); });
		Loader._assets[url] = a;
		if(!Loader._checkInterval) Loader._checkInterval = setInterval(Loader._update,100);
		//console.log('loaded:'+url);
	},
	
	error: function(url) {
		//console.log('cannot find image:'+url);
		var asset = Loader._assets[url];
		asset.complete = true;
		if(asset.options.onComplete) asset.options.onComplete('/images/s.gif');
	},
	
	stats: function(url) {
		return (Loader._assets[url]._complete ?
	    	(Loader._assets[url]._completed_at - Loader._assets[url]._loaded_at) : null);
	},
	
	isQueued: function(url) {
	  	return !!(Loader._assets[url]);
	},
	
	isLoaded: function(url) {
	  	return (Loader._assets[url] && Loader._assets[url].complete);
	},
	
	reset: function() {
	  	Loader._assets = $H({});
	}
	
};