/* jQuery.preloader - v0.95 - K Reeve aka BinaryKitten
*
* v0.95
* 	# Note - keeping below v1 as really not sure that I consider it public usable.
* 	# But it saying that it does the job it was intended to do.
* 	Added Completion of loading callback.
* 	Main Reworking With Thanks to Remy Sharp of jQuery for Designers
*
*
* v0.9
* 	Fixed .toString being .toSteing
*
* v0.8
*		Fixed sheet.href being null error (was causing issues in FF3RC1)
*
* v0.7
*		Remade the preLoadImages from jQuery to DOM
*
* v0.6
* 		Fixed IE6 Compatability!
*		Moved from jQuery to DOM
*
* v0.5
* 		Shifted the additionalimages loader in the preLoadAllImages so it wasn't called multiple times
* 		Created secondary .preLoadImages to handle additionalimages and so it can be called on itself
*/

(function($) {
    $.preLoadImages = function(imageList, callback) {
        var pic = [], i, total, loaded = 0;
        if (typeof imageList != 'undefined') {
            if ($.isArray(imageList)) {
                total = imageList.length; // used later
                for (i = 0; i < total; i++) {
                    pic[i] = new Image();
                    pic[i].onload = function() {
                        loaded++; // should never hit a race condition due to JS's non-threaded nature
                        if (loaded == total) {
                            if ($.isFunction(callback)) {
                                callback();
                            }
                        }
                    };
                    pic[i].src = imageList[i];
                }
            }
            else {
                pic[0] = new Image();
                pic[0].onload = function() {
                    if ($.isFunction(callback)) {
                        callback();
                    }
                }
                pic[0].src = imageList;
            }
        }
        pic = undefined;
    };

    $.preLoadCSSImages = function(callback) {
        var pic = [], i, imageList = [], loaded = 0, total, regex = new RegExp("url\((.*)\) ", 'i'), spl;
        var cssSheets = document.styleSheets, path, myRules, Rule, match, txt, img, sheetIdx, ruleIdx;
        for (sheetIdx = 0; sheetIdx < cssSheets.length; sheetIdx++) {
            var sheet = cssSheets[sheetIdx];
            if (typeof sheet.href == 'string' && sheet.href.length > 0) {
                spl = sheet.href.split('/'); spl.pop(); path = spl.join('/') + '/';
            }
            else {
                path = './';
            }
            myRules = sheet.cssRules ? sheet.cssRules : sheet.rules;
            for (ruleIdx = 0; ruleIdx < myRules.length; ruleIdx++) {
                Rule = myRules[ruleIdx];
                txt = Rule.cssText ? Rule.cssText : Rule.style.cssText;
                match = regex.exec(txt);
                if (match != null) {
                    img = match[1].substring(1, match[1].indexOf(')', 1));
                    if (img.substring(0, 4) == 'http') {
                        imageList[imageList.length] = img;
                    }
                    else if (match[1].substring(1, 2) == '/') {
                        var p2 = path.split('/'); p2.pop(); p2.pop(); p2x = p2.join("/");
                        imageList[imageList.length] = p2x + img;
                    }
                    else {
                        imageList[imageList.length] = path + img;
                    }
                }
            };
        };

        total = imageList.length; // used later
        for (i = 0; i < total; i++) {
            pic[i] = new Image();
            pic[i].onload = function() {
                loaded++; // should never hit a race condition due to JS's non-threaded nature
                if (loaded == total) {
                    if ($.isFunction(callback)) {
                        callback();
                    }
                }
            };
            pic[i].src = imageList[i];
        }

    };
    $.preLoadAllImages = function(imageList, callback) {
        if (typeof imageList != 'undefined') {
            if ($.isFunction(imageList)) {
                callback = imageList;
            }
            else if (!$.isArray(imageList)) {
                imageList = [imageList];
            }
        }
        $.preLoadCSSImages(function() {
            if (imageList.length > 0) {
                $.preLoadImages(imageList, function() {
                    callback();
                });
            }
            else {
                callback();
            }
        });
    }
})(jQuery);
