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

