/*************************************************************************************
   cImagePreloader class 
   written by Ondra Zizka 2005-08-01, ondra@dynawest.cz, ondra.zizka.cz

	 Preloads images. Upon completion, it may call a callback function.
*************************************************************************************/

/* Usage:

<script type="text/javascript" src="cImagePreloader.js"></script>
<script type="text/javascript">
var aImg = ["node.gif", "plus.gif", "minus.gif", "line.gif", "gap.gif"];
function OnPreload(aImages, nImages){
   if(nImages != aImg.length){ alert("Images did not load properly"); return; }
}
</script>
<body onload="window.oPreloader = new cImagePreloader(aImg, OnPreload);">

*/



/**  Constructor
  @param asImageUrls: Array of filenames or space-separated list of files to preload.
	@param fCallback:   Callback function to call upon completion.
 */
function cImagePreloader(asImageUrls, fCallback){
	if(typeof(asImageUrls) == "string")
		asImageUrls = asImageUrls.split(" ");
		
	// record the number of images.
	this.nImages = asImageUrls.length;
	
	// Store the fCallback 
	this.fCallback = fCallback;
	
	// Initialize internal state.
	this.nLoaded    = 0;
	this.nProcessed = 0;
	this.aImages = new Array;
	

	
	// for each image, call preload()
	for ( var i = 0; i < asImageUrls.length; i++ )
		this.preload(asImageUrls[i]);
}


/**  cImagePreloader::preload()  */
cImagePreloader.prototype.preload = function(sImageUrl){
	// 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.onload;
	oImage.onerror = cImagePreloader.onerror;
	oImage.onabort = cImagePreloader.onabort;
	
	// assign pointer back to this.
	oImage.oImagePreloader = this;
	oImage.bLoaded = false;
	
	// assign the .src property of the Image object
	oImage.src = sImageUrl;
}


/**  cImagePreloader::onComplete()  */
cImagePreloader.prototype.onComplete = function(){
   this.nProcessed++;
   if( this.fCallback && this.nProcessed == this.nImages ){
      this.fCallback(this.aImages, this.nLoaded);
   }
}


/** Callback functions - applied on the Image object (this) */
cImagePreloader.onload = function(){
   this.bLoaded = true;
   this.oImagePreloader.nLoaded++;
   this.oImagePreloader.onComplete();
}
cImagePreloader.onerror = function(){
   this.bError = true;
   this.oImagePreloader.onComplete();
}
cImagePreloader.onabort = function(){
   this.bAbort = true;
   this.oImagePreloader.onComplete();
}