diff options
Diffstat (limited to '')
-rw-r--r-- | themes/default/js/image.loader.js | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/themes/default/js/image.loader.js b/themes/default/js/image.loader.js new file mode 100644 index 000000000..cd8b9cc52 --- /dev/null +++ b/themes/default/js/image.loader.js @@ -0,0 +1,84 @@ + +function ImageLoader(opts) { + this.opts = jQuery.extend( { + maxRequests: 6, + onChanged: jQuery.noop + }, opts||{} ); +} + +ImageLoader.prototype = { + loaded: 0, + errors: 0, + errorEma: 0, + + pause: false, + + current: [], + queue: [], + pool: [], + + remaining: function() { + return this.current.length + this.queue.length; + }, + + add: function(urls) { + this.queue = this.queue.concat( urls ); + this._fireChanged("add"); + this._checkQueue(); + }, + + clear: function() { + this.queue.length = 0; + while (this.current.length) + jQuery( this.current.pop() ).unbind(); + this.loaded = this.errors = this.errorEma = 0; + }, + + pause: function(val) { + if (val !== undefined) + { + this.paused = val; + this._checkQueue(); + } + return this.paused; + }, + + _checkQueue: function() { + while (!this.paused + && this.queue.length + && this.current.length < this.opts.maxRequests) + { + this._processOne( this.queue.shift() ); + } + }, + + _processOne: function(url) { + var img = this.pool.shift() || new Image; + this.current.push(img); + var that = this; + jQuery(img).bind( "load error abort", function(e) { + //img.onload = function(e) { + jQuery(img).unbind(); + img.onload=null; + that.current.splice(jQuery.inArray(img, that.current), 1); + if (e.type==="load") { + that.loaded++; + that.errorEma *= 0.9; + } + else { + that.errors++; + that.errorEma++; + if (that.errorEma>=20 && that.errorEma<21) + that.paused = true; + } + that._fireChanged(e.type, img); + that._checkQueue(); + that.pool.push(img); + } ); + img.src = url; + }, + + _fireChanged: function(type, img) { + this.opts.onChanged(type, img); + } +}
\ No newline at end of file |