module.exports = (function(){ function Loader (readyCallback, view){ this.assets = {}; this.images = []; this.readyCallback = readyCallback || function(){}; this.count = 0 this.view = view this.loaded = false } // Set the callback when the loader is ready Loader.prototype.onReady = function(readyCallback){ this.readyCallback = readyCallback || function(){}; } // Register an asset as loading Loader.prototype.register = function(s){ this.assets[s] = false; this.count += 1 } // Signal that an asset has loaded Loader.prototype.ready = function(s){ // window.debug && console.log("ready >> " + s); this.assets[s] = true; if (this.loaded) return; this.view && this.view.update( this.percentRemaining() ) if (! this.isReady()) return; this.loaded = true; if (this.view) { this.view && this.view.finish(this.readyCallback) } else { this.readyCallback && this.readyCallback(); } } // (boolean) Is the loader ready? Loader.prototype.isReady = function(){ return ! Object.keys(this.assets).some( (key) => { return ! this.assets[key] }) } // (float) Percentage of assets remaining Loader.prototype.percentRemaining = function(){ return this.remainingAssets() / this.count } // (int) Number of assets remaining Loader.prototype.remainingAssets = function(){ var n = 0; for (var s in this.assets) { if (this.assets.hasOwnProperty(s) && this.assets[s] != true) { n++; // console.log('remaining: ' + s); } } return n; } // Preload the images in config.images Loader.prototype.preloadImages = function(images){ this.register("preload"); for (var i = 0; i < images.length; i++) { this.preloadImage(images[i]); } this.ready("preload"); } Loader.prototype.preloadImage = function(src, register, cb){ if (! src || src == "none") return; var _this = this; if (! cb && typeof register === "function") { cb = register register = null } if (register) { this.register(src); } var img = new Image(), loaded = false; img.onload = function(){ if (loaded) return loaded = true if (cb) { cb(img); } if (register) { _this.ready(src); } } img.src = src; if (img.complete) img.onload(); _this.images.push(img); } return Loader; })();