function SpriteFactory(params) { this.params = params this.preload() this.template = params.light ? this.renderLight() : this.render() } SpriteFactory.fn = SpriteFactory.prototype SpriteFactory.fn.preload = function() { this.loading = true this.to_convert = [] var img = $("").bind("load", this, this.imageLoaded).attr("src", this.params.src) if(img[0].complete) this.imageLoaded({data:this}) } SpriteFactory.fn.generate = function(index) { var el = this.template.clone() this.update(el, index) if(this.loading) this.to_convert.push(el[0]) return el } SpriteFactory.fn.imageLoaded = function(e) { var self = e.data $(self.to_convert).removeClass("loading") this.loading = false } SpriteFactory.fn.render = function() { var params = this.params var $$ = $("").css({width: params.width, height: params.height, display: "block", overflow: "hidden", position: "relative"}) if(this.loading) $$.addClass("loading") var css = { position : "absolute", display: "block", width: this.params.index[0]*this.params.width, height: this.params.index[1]*this.params.height } if($.browser.msie && $.browser.version.substr(0,1) < 7) css.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + params.src + "', sizingMethod='scale')" else css.backgroundImage = "url('" + params.src + "')" var img = $("").css(css) $$.append(img) return $$ } SpriteFactory.fn.update = function(el, index) { var params = this.params var l = -index[0]*params.width, t = (-index[1]*params.height) if(params.light) el.css({backgroundPosition: l + "px" + " " + t + "px"}) else el.children().css({left: l, top: t}) return el } SpriteFactory.fn.renderLight = function() { var params = this.params var $$ = $("").css({width: params.width, height: params.height, display: "block", position: "relative", background: "url('" + params.src + "')"}) if(this.loading) $$.addClass("loading") return $$ }