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