/*[version]2008-09-16 20:51[/version]*/
/**
 * Class AnemaImagePreloader.js
 * Requires Acu.js
 *
 * Lädt alle interval Millisekunden bis zu maxImages vor. Das Vorladen
 * muss explizit über die Methode start() erfolgen.
 *
 * Abgesehen zur normalen Queue, die im Intervall abgearbeitet wird,
 * können dringende Bilder mit einer priorityQueue sofort vorgeladen werden.
 * Zur priorityQueue kann auch ein onCompleteHandler angegeben werden,
 * der priorityQueueOnCompleteHandlerDelay Millisekunden aufgerufen wird,
 * nachdem alle Bilder aus der priorityQueue geladen wurden.
 *
 * Sowohl die normale als auch die priorityQueue operieren im FIFO-Mode.
 *
 * Constructor-Parameter:
 *		- interval		Millisekunden-Intervall, in dem Bilder vorgeladen werden
 *		- maxImages		Anzahl an Bildern, die auf einmal vorgeladen werden sollen
 *		- images		Array mit den Pfaden der Bilder, die vorgeladen werden sollen;
 *						zusätzliche Bilder können jederzeit mit registerImage hinzugefügt
 *						werden
 *
 *
 */


function AnemaImagePreloader( /*interval, maxImages, images*/ ){
	this.restartInterval = arguments[0] ? arguments[0] : 1000;
	this.maxImagesAtOnce = arguments[1] ? arguments[1] : 10;
	this.queue = arguments[2] ? arguments[2] : new Array();
	this.timer = null;
	this.priorityQueue = new Array();
	this.priorityQueueOnCompleteHandler = null;
	this.priorityQueueOnCompleteHandlerDelay = 0;
	this.priorityQueueLastImage = null;

	var self = this;
	this.loader = function(){
		// Erst lade alle dringenden Bilder vor.
		for( var i=0; i<self.priorityQueue.length; i++ ){
			var path = self.priorityQueue[i];
			new Image().src = path;
		}
		// Setze Timeout für onCompleteHandler, falls vorhanden.
		if( self.priorityQueueOnCompleteHandler ){
			var h = function(){
				self.priorityQueueOnCompleteHandler();
				self.priorityQueueOnCompleteHandler = null;
				self.priorityQueueOnCompleteHandlerDelay = 0;
			};
			setTimeout( h, self.priorityQueueOnCompleteHandlerDelay );
		}
		// Jetzt kann die Priority-Queue auf alle Fälle wieder zurückgesetzt werden.
		self.priorityQueue = new Array();

		for( var i=0; i<self.maxImagesAtOnce; i++ ){
			if( self.queue.length == 0 ){
				// Keine Bilder mehr, wir sind fertig.
				break;
			}
			var path = self.queue.shift();
			new Image().src = path;
		}
		// Schedule for next run if needed.
		clearTimeout( self.timer );	// Just in case.
		if( self.queue.length > 0 ){
			self.timer = setTimeout( self.loader, self.restartInterval );
		}else{
			self.timer = null;
		}
	};
}

AnemaImagePreloader.prototype.registerImage = function( imagePath ){
	this.queue.push( imagePath );
	if( !this.timer ){
		// Wir befinden uns im Ruhezustand, müssen aber Bilder vorladen.
		this.start();
	}
};

AnemaImagePreloader.prototype.start = function( /*delay*/ ){
	var delay = arguments[0] ? arguments[0] : 0;

	if( this.timer ) clearTimeout( this.timer );
	this.timer = setTimeout( this.loader, delay );
};

AnemaImagePreloader.prototype.stop = function(){
	if( this.timer ) clearTimeout( this.timer );
	this.timer = null;
};

AnemaImagePreloader.prototype.clearQueue = function(){
	if( this.timer ) clearTimeout( this.timer );
	this.timer = null;
	this.queue.length = 0;
};

/**
 * images ist ein Array von Bildpfaden, onCompleteHandler die optionale
 * Funktion, die aufgerufen werden soll, wenn alle Bilder (der
 * priorityQueue) vorgeladen wurden. Parameter delay gibt an,
 * wie viele Millisekunden nach dem Vorladen des letzten Bildes der
 * Handler ausgeführt werden soll. Default sind 300 Millisekunden.
 * Wird kein Handler angegeben, wird der Delay auf 0 gesetzt.
 */
AnemaImagePreloader.prototype.setPriorityQueue = function( images/*, onCompleteHandler, delay*/ ){
	this.priorityQueue = images;
	var handler = arguments[1];
	var delay = arguments[2];

	if( delay ){
		this.priorityQueueOnCompleteHandlerDelay = delay;
	}else{
		this.priorityQueueOnCompleteHandlerDelay = 300;
	}
	if( handler ){
		this.priorityQueueOnCompleteHandler = handler;
	}else{
		// Wo kein Handler, da kein Delay.
		this.priorityQueueOnCompleteHandler = null;
		this.priorityQueueOnCompleteHandlerDelay = 0;
	}
};

AnemaImagePreloader.prototype.addPriorityQueueImage = function( imagePath ){
	this.priorityQueue.push( imagePath );
};

