/*

 * jQuery preloadImages plugin

 * Version 0.1.1  (20/12/2007)

 * @requires jQuery v1.2.1+

 *

 * Dual licensed under the MIT and GPL licenses:

 * http://www.opensource.org/licenses/mit-license.php

 * http://www.gnu.org/licenses/gpl.html

 *

 * @name preloadImages

 * @type jQuery

 * @cat Plugins/Browser Tweaks

 * @author Blair McBride <blair@theunfocused.net>

*/



(function($) {

/**

*

* Queue up a list of images, and start preloading them.

* Works with multi-dimensional arrays.

*

* @example $.preloadImages(['1.jpg', '2.jpg', '3.jpg']);

* @example $.preloadImages(['1.jpg', '2.jpg', '3.jpg', ['4.jpg', '5.jpg']]);

*

* @param arr Any number of image URLs to preload, in an array.

*/

$.preloadImages = function(arr) {

	$.preloadImages.add(arr);



	queuedStop = false;

	startPreloading();

};









/**

* Add a list of images to the end of the preload queue.

* Does not start precoessing the queue, unlike $.preloadImages()

* Works with multi-dimensional arrays.

*

* @example $.preloadImages.add(['1.jpg', '2.jpg', '3.jpg']);

* @example $.preloadImages.add(['1.jpg', '2.jpg', '3.jpg', ['4.jpg', '5.jpg']]);

*

* @param arr Any number of image URLs to preload, either as individual arguments or in an array.

*/

$.preloadImages.add = function(arr) {

	if(typeof(arr) == 'string') {

		$.preloadImages.imageQueue.push(arr);

		return;

	}



	if(arr.length < 1) return;



	for(var i = 0, numimgs = arr.length; i < numimgs; i++) {

		if(typeof(arr[i]) == 'string')

			$.preloadImages.imageQueue.push(arr[i]);

		else if(typeof(arr[i]) == 'object' && arr[i].length > 0)

			$.preloadImages.add(arr[i]);

	}

}



/**

* Prepend a list of images to the start of the preload queue.

* Does not start precoessing the queue, unlike $.preloadImages()

* Works with multi-dimensional arrays.

*

* @example $.preloadImages.add('1.jpg', '2.jpg', '3.jpg');

* @example $.preloadImages.add(['1.jpg', '2.jpg', '3.jpg'], ['4.jpg', '5.jpg']);

*

* @param Any number of image URLs to preload, either as individual arguments or in an array.

*/

$.preloadImages.prepend = function() {

	if(typeof(arr) == 'string') {

		$.preloadImages.imageQueue.unshift(arr);

		return;

	}



	if(arr.length < 1) return;



	for(var i = numargs - 1; i >= 0; i--) {

		if(typeof(arr[i]) == 'string')

			$.preloadImages.imageQueue.unshift(arr[i]);

		else if(typeof(arr[i]) == 'object' && arr[i].length > 0)

			$.preloadImages.prepend(arr[i]);

	}

}



/**

* Clear the preload queue.

*/

$.preloadImages.clear = function() {

	$.preloadImages.imageQueue = [];	

}



/**

* Stop processing the preload queue. Does not clear the queue, so precessing can be started off from where it was stopped.

*/

$.preloadImages.stop = function() {

	queuedStop = true;

}



/**

* Start processing the preload queue.

*/

$.preloadImages.start = function() {

	queuedStop = false;

	startPreloading();

}



/**

* The preload queue, for direct manupilation of the queue.

* Items at the start of the queue will be processed first.

* This needs to be kept single-dimensional.

*/

$.preloadImages.imageQueue = [];







/* PRIVATE */

var isPreloading = false;

var queuedStop = false;



function startPreloading() {

	if(isPreloading)

		return;



	$(document.createElement('img')).bind('load', function() {

		if(queuedStop) {

			queuedStop = isPreloading = false;

			return;

		}

		isPreloading = true;

		if($.preloadImages.imageQueue.length > 0) {

			this.src = $.preloadImages.imageQueue.shift();

		} else

			isPreloading = false;

	}).trigger('load');

}





})(jQuery);

