(function()
{

var imagesToPreload = []; //FIFO
var preloadObject = new Image();
preloadObject.onload = preloadObject.onLoad = imageLoad;
preloadObject.onerror = preloadObject.onError = imageError;
var startPreloading = false;
var isPreloading = false;

addDOMLoadEvent(function() 
{
	startPreloading = true;
	preloadNext();
});

window.preloadImg = function(img) 
{
	if (arguments.length == 2) img = arguments[0] + arguments[1]; //Old use: dir + filename
	imagesToPreload.push(img);

	if (!isPreloading) preloadNext();
};

window.preloadImgs = function(images)
{
	var a, len;
	
	for (a = 0, len = images.length; a < len; a++)
		preloadImg(images[a]);
};

function imageLoad()
{
	if (!isPreloading) return;
	preloadNext();
}

function imageError()
{
	if (!isPreloading) return;

	// There might be a browser which fires both onload and onerror. However because in preloadNext the src is reset, the other event should never appear
	preloadNext();
}

function preloadNext()
{
	var url;
	
	isPreloading = false;
	if (!startPreloading) return;
	
	url = imagesToPreload.shift();
	if (!url)
	{
		preloadObject.src = 'about:blank';
		return; // There is nothing to preload. At this point isPreloading is false, so the next time a preloadImage is added, the preloading restarts
	}
	preloadObject.src = url;
	isPreloading = true;
}

})();
