
	// http://www.webreference.com/programming/javascript/gr/column3/

	function CImagePreloader(a_images, call_back, o_reference)
	{
		// store the call-back
		this.call_back = call_back;

		this.oReference = o_reference;

		// initialize internal state.
		this.nLoaded = 0;
		this.nProcessed = 0;
		this.aImages = new Array;

		// record the number of images.
		this.nImages = a_images.length;

		// for each image, call preload()
		for ( var i = 0; i < a_images.length; i++ )
		{
			this.preload(a_images[i]);
		}
	}




	/**
	 * @param string s_image    path to the image
	 */
	CImagePreloader.prototype.preload = function(s_image)
	{
		// create new Image object and add to array
		var oImage = new Image;
		this.aImages.push(oImage);

		// set up event handlers for the Image object
		oImage.onload = CImagePreloader.prototype.onload;
		oImage.onerror = CImagePreloader.prototype.onerror;
		oImage.onabort = CImagePreloader.prototype.onabort;

		// assign pointer back to this.
		oImage.oImagePreloader = this;
		oImage.bLoaded = false;

		// assign the .src property of the Image object
		oImage.src = s_image;
	}




	CImagePreloader.prototype.onComplete = function()
	{
		this.nProcessed++;

		if ( this.nProcessed == this.nImages )
		{
			this.call_back(this.aImages, this.nLoaded, this.oReference);
		}
	}




	CImagePreloader.prototype.onload = function()
	{
		this.bLoaded = true;
		this.oImagePreloader.nLoaded++;
		this.oImagePreloader.onComplete();
	}




	CImagePreloader.prototype.onerror = function()
	{
		this.bError = true;
		this.oImagePreloader.onComplete();
	}




	CImagePreloader.prototype.onabort = function()
	{
		this.bAbort = true;
		this.oImagePreloader.onComplete();
	}


