function ImagePreloader(images, callback, start, onLoadImage) {
	
	// store the call-back
	this.callback = callback;
	
	// store the start function & the onloadImage function
	// if they're there
	typeof start != 'undefined' ? this.start = start : this.start = null;
	typeof onLoadImage != 'undefined' ? this.onLoadImage = onLoadImage : this.onLoadImage = null;
	
	// initialize internal state.
	this.nLoaded = 0;
	this.nProcessed = 0;
	this.aImages = new Array;
	
	// record the number of images.
	this.nImages = images.length;
	
	// call start
	if (this.start != null) {
		this.start(this.nImages);
		}
	
	// for each image, call preload()
	for ( var i = 0; i < images.length; i++ ) {
		this.preload(images[i]);
		}
	
	};
	
ImagePreloader.prototype.preload = function(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 = ImagePreloader.prototype.onload;
	oImage.onerror = ImagePreloader.prototype.onerror;
	oImage.onabort = ImagePreloader.prototype.onabort;
		
	// assign pointer back to this.
	oImage.oImagePreloader = this;
	oImage.bLoaded = false;
	
	// assign the .src property of the Image object
	oImage.src = image;
	
	};
	
ImagePreloader.prototype.onComplete = function() {
	
	this.nProcessed++;
	// call the onLoadImage function
	if (this.onLoadImage != null) {
		this.onLoadImage(this.nProcessed);
		}
	if ( this.nProcessed == this.nImages ) {
		this.callback(this.aImages, this.nLoaded);
		}
	
	};
	
ImagePreloader.prototype.onload = function() {
	
	this.bLoaded = true;
	this.oImagePreloader.nLoaded++;
	this.oImagePreloader.onComplete();
	
	};
	
ImagePreloader.prototype.onerror = function() {
	
	this.bError = true;
	this.oImagePreloader.onComplete();
	
	};
	
ImagePreloader.prototype.onabort = function() {
	
	this.bAbort = true;
	this.oImagePreloader.onComplete();
	
	};
