/*
 * 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);