/* 
	Simple Image Preloader 
	Last Modified: 9 June 2008
*/
var PreLoader = (function () {

	// hidden image data hash
	var imgs = {};
	
	// image callback function
	// manages callback stack
	var imageCallback = function (src, isLoaded) {
		imgs[src].loaded = isLoaded;
		for (var i = 0; i < imgs[src].callbacks.length; i++) {
		
			// stop event propagation if called for
			if (imgs[src].callbacks[i](imgs[src].el) === false) {
				return;
			}
		}	
	};
	
	// pushes image onto stack w/ optional callback
	var loadImage = function (src, callback) {
	
		// check that the image hasn't already been loaded
		if (imgs[src]) {
		
			// check that there was a callback sent
			if (callback !== null) {
		
				// call asynchronously if loaded
				if (imgs[src].loaded === true) {				
					window.setTimeout(function() {
						callback(imgs[src].el);
					}, 0);
				}
				
				// otherwise, add to the callback stack
				else {
					imgs[src].callbacks.push(callback);
				}
			}
			
			// return now
			return;
		}
	
		// create the new image object
		var newImg = new Image();
		
		// push the image data into the stack
		var cStack = [];
		if (callback !== null) { cStack.push(callback); }
		imgs[src] = {
			callbacks: cStack,
			loaded: false,
			el: newImg
		};
		
		// add event callbacks w/ load status
		newImg.onload = function () {
			imageCallback(src, true);
		};		
		newImg.onerror = function () {
			imageCallback(src, false);			
		};
		newImg.onabort = function () {
			imageCallback(src, false);
		};
		
		// specify src last
		newImg.src = src;
	};
	
	// public members
	return {
		
		// all-purpose load method
		load: function(src /* , callback */ ) {
			var callback = arguments[1] || null;
			loadImage(src, callback);
		}
	};
})();