From 411ab96e4bd99c0b29aa48afdee5d5b9f3b3eb6a Mon Sep 17 00:00:00 2001 From: Matthew Cobbs Date: Thu, 26 Jan 2012 20:56:25 -0500 Subject: [PATCH] Build 0.5.16 - Shortened references to Stitches in code --- README.md | 6 +- build.properties | 4 +- build/css/stitches-0.5.14-min.css | 7 - build/css/stitches-0.5.16-min.css | 7 + ...titches-0.5.14.css => stitches-0.5.16.css} | 10 +- build/js/stitches-0.5.14-min.js | 1 - build/js/stitches-0.5.16-min.js | 1 + ...{stitches-0.5.14.js => stitches-0.5.16.js} | 430 ++++++++++-------- build/js/stitches.html | 8 +- dist/stitches-0.5.16.zip | Bin 0 -> 95049 bytes docs/file.html | 25 +- docs/icon.html | 103 +++-- docs/icons.html | 13 +- docs/page.html | 146 +++--- docs/stitches.html | 115 ++--- src/file.js | 25 +- src/icon.js | 141 +++--- src/icons.js | 13 +- src/page.js | 146 +++--- src/stitches.css | 10 +- src/stitches.html | 8 +- src/stitches.js | 97 ++-- 22 files changed, 697 insertions(+), 619 deletions(-) delete mode 100644 build/css/stitches-0.5.14-min.css create mode 100644 build/css/stitches-0.5.16-min.css rename build/css/{stitches-0.5.14.css => stitches-0.5.16.css} (97%) delete mode 100644 build/js/stitches-0.5.14-min.js create mode 100644 build/js/stitches-0.5.16-min.js rename build/js/{stitches-0.5.14.js => stitches-0.5.16.js} (68%) create mode 100644 dist/stitches-0.5.16.zip diff --git a/README.md b/README.md index 9afd3e7c..c4ae0ab3 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,19 @@ ## Stitches [Stitches](http://draeton.github.com/stitches/) is an HTML5 sprite sheet generator. -The current version is `0.5.14`. Documentation is available +The current version is `0.5.16`. Documentation is available [here](http://draeton.github.com/stitches/stitches/docs/stitches.html). ## Implementation Stitches requires a stylesheet, a script, and an HTML element to get the job done: - + - + Once that's in place, the sprite sheet generator is created by the `init` method: diff --git a/build.properties b/build.properties index ad81359c..db1085f0 100644 --- a/build.properties +++ b/build.properties @@ -1,4 +1,4 @@ -#Wed, 25 Jan 2012 11:53:39 -0500 +#Thu, 26 Jan 2012 20:56:00 -0500 build.major=0 build.minor=5 -build.number=14 +build.number=16 diff --git a/build/css/stitches-0.5.14-min.css b/build/css/stitches-0.5.14-min.css deleted file mode 100644 index 777289ea..00000000 --- a/build/css/stitches-0.5.14-min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Stitches - HTML5 Sprite Generator - * http://draeton.github.com/stitches - * - * Copyright 2011, Matthew Cobbs - * Licensed under the MIT license. - */.stitches{position:relative;z-index:0;width:500px;overflow:hidden;margin:1em auto;font-family:Arial,sans-serif;font-size:16px;line-height:20px;color:#222}.stitches .drawer{z-index:100;width:125px;position:absolute;top:20px;left:-125px;opacity:.4;-moz-opacity:.4;filter:alpha(opacity=0.4)}.stitches .drawer:hover{opacity:1;-moz-opacity:1;filter:alpha(opacity=1)}.stitches .drawer .cabinet{display:block;width:125px;height:30px;overflow:hidden;background:#039a27;border-radius:0 10px 0 0;padding:0;margin:0}.stitches .drawer .cabinet:hover{background:#04cc33}.stitches .drawer .cabinet:active{background:#05ff3f}.stitches .drawer .cabinet span{display:block;width:125px;height:30px;position:absolute;top:0;left:0;color:white;text-align:center;font-weight:bold;font-size:14px;line-height:30px}.stitches .drawer .cabinet input.files{display:block;width:125px;height:30px;position:absolute;top:0;left:0;opacity:0;-moz-opacity:0;filter:alpha(opacity=0)}.stitches .drawer .open-options{display:block;width:125px;height:30px;background:#03669a;border-radius:0 0 10px 0;padding:0;margin:0;color:white;text-align:center;font-weight:bold;font-size:14px;line-height:30px;text-decoration:none}.stitches .drawer .open:hover{background:#0486cc}.stitches .drawer .open:active{background:#05a8ff}.stitches .dropbox{z-index:0;height:200px;border-radius:10px 10px 0 0;padding:20px 0 0;position:relative;background-color:#fff}.stitches .droplabel{display:block;width:400px;position:absolute;top:100px;left:50%;margin-left:-200px;text-align:center;font-weight:bold;color:#aaa}.stitches .droplabel.error{color:red}.stitches .dropping{background-color:#f0f0f0;background-image:linear-gradient(bottom,#fff 0,#f0f0f0 100%);background-image:-o-linear-gradient(bottom,#fff 0,#f0f0f0 100%);background-image:-moz-linear-gradient(bottom,#fff 0,#f0f0f0 100%);background-image:-webkit-linear-gradient(bottom,#fff 0,#f0f0f0 100%);background-image:-ms-linear-gradient(bottom,#fff 0,#f0f0f0 100%);background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#fff),color-stop(1,#f0f0f0))}.stitches .filelist{font-size:14px;line-height:14px;color:#777;height:200px;overflow:auto;margin:0;padding:0}.stitches .filelist li{position:relative;display:block;overflow:hidden;padding:9px 20px;border-top:1px solid #f0f0f0;height:40px;display:none}.stitches .filelist li:hover{background-color:#f0f0f0;background-image:linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-o-linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-moz-linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-webkit-linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-ms-linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(1,#c8c8c8))}.stitches .filelist li span.icon{display:block;float:left;width:60px;margin-right:10px;text-align:center}.stitches .filelist li span.icon img{max-width:40px;max-height:40px}.stitches .filelist li span.name{display:block;float:left;margin-right:10px;padding-top:14px}.stitches .filelist li a.remove{padding-top:14px;display:block;float:left}.stitches .buttons{overflow:hidden;margin-bottom:40px}.stitches .buttons a{display:block;width:124px;border-right:1px solid #f2f2f2;float:left;background:#03669a;color:white;text-align:center;font-size:14px;line-height:30px;font-weight:bold;text-decoration:none}.stitches .buttons a:hover{background:#0486cc}.stitches .buttons a:active{background:#05a8ff}.stitches .buttons a.disabled{background:#aaa!important;color:#ccc!important;cursor:default}.stitches .buttons a.clear{border-radius:0 0 10px 0;border-right:0;width:125px}.stitches .buttons a.generate{border-radius:0 0 0 10px;background:#039a27}.stitches .buttons a.generate:hover{background:#04cc33}.stitches .buttons a.generate:active{background:#05ff3f}.stitches .options{position:absolute;z-index:200;top:0;left:0;padding:20px 12px 0 12px;height:230px;width:476px;border-radius:10px;display:none;background-color:#f0f0f0;background-image:linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-o-linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-moz-linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-webkit-linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-ms-linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(1,#c8c8c8))}.stitches .options a.close-options{position:absolute;top:12px;right:12px;font-size:20px;text-decoration:none;color:red}.stitches .options h2{margin:0 0 12px 0;padding:0;font-size:16px;line-height:16px}.stitches .options p{margin:0 0 12px 0;padding:0;font-size:14px;line-height:18px;clear:both}.stitches .options label{font-size:12px;line-height:12px;font-weight:bold;display:inline-block;margin-top:6px;padding:0;width:auto;float:none;text-align:left}.stitches .options input{vertical-align:middle;width:auto;color:black} \ No newline at end of file diff --git a/build/css/stitches-0.5.16-min.css b/build/css/stitches-0.5.16-min.css new file mode 100644 index 00000000..ba104a4f --- /dev/null +++ b/build/css/stitches-0.5.16-min.css @@ -0,0 +1,7 @@ +/*! + * Stitches - HTML5 Sprite Generator + * http://draeton.github.com/stitches + * + * Copyright 2011, Matthew Cobbs + * Licensed under the MIT license. + */.stitches{position:relative;z-index:0;width:500px;overflow:hidden;margin:1em auto;font-family:Arial,sans-serif;font-size:16px;line-height:20px;color:#222}.stitches .drawer{z-index:100;width:125px;position:absolute;top:20px;left:-125px;opacity:.4;-moz-opacity:.4;filter:alpha(opacity=0.4)}.stitches .drawer:hover{opacity:1;-moz-opacity:1;filter:alpha(opacity=1)}.stitches .drawer .cabinet{display:block;width:125px;height:30px;overflow:hidden;background:#039a27;border-radius:0 10px 0 0;padding:0;margin:0}.stitches .drawer .cabinet:hover{background:#04cc33}.stitches .drawer .cabinet:active{background:#05ff3f}.stitches .drawer .cabinet span{display:block;width:125px;height:30px;position:absolute;top:0;left:0;color:white;text-align:center;font-weight:bold;font-size:14px;line-height:30px}.stitches .drawer .cabinet input.files{display:block;width:125px;height:30px;position:absolute;top:0;left:0;opacity:0;-moz-opacity:0;filter:alpha(opacity=0)}.stitches .drawer .open-options{display:block;width:125px;height:30px;background:#039a27;border-radius:0 0 10px 0;padding:0;margin:0;color:white;text-align:center;font-weight:bold;font-size:14px;line-height:30px;text-decoration:none}.stitches .drawer .open-options:hover{background:#04cc33}.stitches .drawer .open-options:active{background:#05ff3f}.stitches .dropbox{z-index:0;height:200px;border-radius:10px 10px 0 0;padding:20px 0 0;position:relative;background-color:#fff}.stitches .droplabel{display:block;width:400px;position:absolute;top:100px;left:50%;margin-left:-200px;text-align:center;font-weight:bold;color:#aaa}.stitches .droplabel.error{color:red}.stitches .dropping{background-color:#f0f0f0;background-image:linear-gradient(bottom,#fff 0,#f0f0f0 100%);background-image:-o-linear-gradient(bottom,#fff 0,#f0f0f0 100%);background-image:-moz-linear-gradient(bottom,#fff 0,#f0f0f0 100%);background-image:-webkit-linear-gradient(bottom,#fff 0,#f0f0f0 100%);background-image:-ms-linear-gradient(bottom,#fff 0,#f0f0f0 100%);background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#fff),color-stop(1,#f0f0f0))}.stitches .filelist{font-size:14px;line-height:14px;color:#777;height:200px;overflow:auto;margin:0;padding:0}.stitches .filelist li{position:relative;display:block;overflow:hidden;padding:9px 20px;border-top:1px solid #f0f0f0;height:40px;display:none}.stitches .filelist li:hover{background-color:#f0f0f0;background-image:linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-o-linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-moz-linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-webkit-linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-ms-linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(1,#c8c8c8))}.stitches .filelist li span.icon{display:block;float:left;width:60px;margin-right:10px;text-align:center}.stitches .filelist li span.icon img{max-width:40px;max-height:40px}.stitches .filelist li span.name{display:block;float:left;margin-right:10px;padding-top:14px}.stitches .filelist li a.remove{padding-top:14px;display:block;float:left}.stitches .buttons{overflow:hidden;margin-bottom:40px}.stitches .buttons a{display:block;width:124px;border-right:1px solid #f2f2f2;float:left;background:#03669a;color:white;text-align:center;font-size:14px;line-height:30px;font-weight:bold;text-decoration:none}.stitches .buttons a:hover{background:#0486cc}.stitches .buttons a:active{background:#05a8ff}.stitches .buttons a.disabled{background:#aaa!important;color:#ccc!important;cursor:default}.stitches .buttons a.clear{border-radius:0 0 10px 0;border-right:0;width:125px}.stitches .buttons a.generate{border-radius:0 0 0 10px;background:#039a27}.stitches .buttons a.generate:hover{background:#04cc33}.stitches .buttons a.generate:active{background:#05ff3f}.stitches .options{position:absolute;z-index:200;top:0;left:0;padding:20px 12px 0 12px;height:230px;width:476px;border-radius:10px;display:none;background-color:#f0f0f0;background-image:linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-o-linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-moz-linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-webkit-linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-ms-linear-gradient(top,#fff 0,#c8c8c8 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(1,#c8c8c8))}.stitches .options a.close-options{position:absolute;top:12px;right:12px;font-size:20px;text-decoration:none;color:red}.stitches .options h2{margin:0 0 12px 0;padding:0;font-size:16px;line-height:16px}.stitches .options p{margin:0 0 12px 0;padding:0;font-size:14px;line-height:18px;clear:both}.stitches .options label{font-size:12px;line-height:12px;font-weight:bold;display:inline-block;margin-top:6px;padding:0;width:auto;float:none;text-align:left}.stitches .options input{vertical-align:middle;width:auto;color:black} \ No newline at end of file diff --git a/build/css/stitches-0.5.14.css b/build/css/stitches-0.5.16.css similarity index 97% rename from build/css/stitches-0.5.14.css rename to build/css/stitches-0.5.16.css index 4b047ba3..c67c0391 100644 --- a/build/css/stitches-0.5.14.css +++ b/build/css/stitches-0.5.16.css @@ -84,7 +84,7 @@ display: block; width: 125px; height: 30px; - background: #03669A; /* blue 0486CC 05A8FF */ + background: #039a27; /* green 04CC33 05FF3F */ border-radius: 0 0 10px 0; padding: 0; margin: 0; @@ -96,12 +96,12 @@ text-decoration: none; } -.stitches .drawer .open:hover { - background: #0486CC; +.stitches .drawer .open-options:hover { + background: #04CC33; } -.stitches .drawer .open:active { - background: #05A8FF; +.stitches .drawer .open-options:active { + background: #05FF3F; } /* dropbox */ diff --git a/build/js/stitches-0.5.14-min.js b/build/js/stitches-0.5.14-min.js deleted file mode 100644 index f2240de3..00000000 --- a/build/js/stitches-0.5.14-min.js +++ /dev/null @@ -1 +0,0 @@ -(function(window,$,Modernizr){window.Stitches=(function(){var defaults={jsdir:"js",prefix:"sprite",padding:10,dataURI:false};return{_topics:{},init:function($elem,config){Stitches.settings=$.extend({},defaults,config);Stitches.iconQueue=[];Stitches.Page.$elem=$elem;Stitches.sub("page.error",Stitches.Page.errorHandler);Stitches.sub("page.init.done",Stitches.Page.fetchTemplates);Stitches.sub("page.templates.done",Stitches.Page.render);Stitches.sub("page.render.done",Stitches.checkAPIs);Stitches.sub("page.apis.done",Stitches.Page.bindDragAndDrop);Stitches.sub("page.apis.done",Stitches.Page.bindButtons);Stitches.sub("page.apis.done",Stitches.Page.bindCabinet);Stitches.sub("page.apis.done",Stitches.Page.bindOptions);Stitches.sub("page.apis.done",Stitches.Page.subscribe);Stitches.sub("page.drop.done",Stitches.File.queueFiles);Stitches.sub("file.queue.done",Stitches.File.queueIcons);Stitches.sub("file.icon.done",Stitches.Page.addIcon);Stitches.sub("file.remove.done",Stitches.Page.removeIcon);Stitches.sub("file.unqueue",Stitches.File.unqueueIcon);Stitches.sub("file.unqueue.all",Stitches.File.unqueueAllIcons);Stitches.sub("sprite.generate",Stitches.generateStitches);Stitches.pub("page.init.done");},sub:function(topic,fn){var callbacks=Stitches._topics[topic]||$.Callbacks("stopOnFalse");if(fn){callbacks.add(fn);}Stitches._topics[topic]=callbacks;},unsub:function(topic,fn){var callbacks=Stitches._topics[topic];if(callbacks){callbacks.remove(fn);}},pub:function(topic){var callbacks=Stitches._topics[topic],args=Array.prototype.slice.call(arguments,1);if(callbacks){callbacks.fire.apply(callbacks,args);}},checkAPIs:function(){Modernizr.load([{test:typeof FileReader!=="undefined"&&Modernizr.draganddrop,nope:Stitches.settings.jsdir+"/dropfile/dropfile.js"},{test:Modernizr.canvas,nope:Stitches.settings.jsdir+"/flashcanvas/flashcanvas.js",complete:function(){if(typeof FileReader!=="undefined"&&Modernizr.draganddrop&&Modernizr.canvas){Stitches.pub("page.apis.done");}else{Stitches.pub("page.error",new Error("Required APIs are not present."));}}}]);},generateStitches:function(looseIcons){var placedIcons=Stitches.positionImages(looseIcons);var sprite=Stitches.makeStitches(placedIcons);var stylesheet=Stitches.makeStylesheet(placedIcons,sprite);Stitches.pub("sprite.generate.done",sprite,stylesheet);},positionImages:function(looseIcons){var placedIcons=[];$(looseIcons).each(function(idx,icon){icon.x=icon.y=0;icon.isPlaced=false;});looseIcons=looseIcons.sort(function(a,b){if(b.area===a.area){return b.name>a.name?1:-1;}else{return b.area-a.area;}});Stitches.canvas=Stitches.Icons.idealCanvas(looseIcons);Stitches.Icons.placeIcons(looseIcons,placedIcons,Stitches.canvas);Stitches.Icons.cropCanvas(placedIcons,Stitches.canvas);Stitches.pub("sprite.position.done",placedIcons);return placedIcons;},makeStitches:function(placedIcons){var context,data;try{context=Stitches.canvas.getContext("2d");$(placedIcons).each(function(idx,icon){context.drawImage(icon.image,icon.x,icon.y);});data=Stitches.canvas.toDataURL();}catch(e){Stitches.pub("page.error",e);}Stitches.pub("sprite.image.done",data);return data;},makeStylesheet:function(placedIcons,sprite){placedIcons=placedIcons.sort(function(a,b){return a.namemaxW?icon.width:maxW;maxH=icon.height>maxH?icon.height:maxH;area+=icon.area;});var ideal=Math.ceil(Math.sqrt(area));var idealW=maxW>ideal?maxW:ideal;var idealH=maxH>ideal?maxH:ideal;var canvas=document.createElement("canvas");canvas.width=idealW;canvas.height=idealH;return canvas;},placeIcons:function(loose,placed,canvas){var i=0;while(loose.length&&i<10){$(loose).each(function(idx,icon){if(!icon.isPlaced){icon.isPlaced=Stitches.Icons.placeIcon(icon,placed,canvas);}});i++;}for(i=0;iicon.x);y1=(p.yicon.y);if(x1&&x2&&y1&&y2){intersect.push(p);}});if(intersect.length){overlap=intersect.pop();}else{placed.push(icon);}return overlap;},cropCanvas:function(placed,canvas){var w=0,h=0;$(placed).each(function(idx,icon){w=w>icon.x+icon.width?w:icon.x+icon.width;h=h>icon.y+icon.height?h:icon.y+icon.height;});canvas.width=w;canvas.height=h;}};})();})(window,Stitches,jQuery);(function(window,Stitches){var guid=0;var nameCache={};Stitches.Icon=function(name,src,cb){var self=this;this.guid=guid++;this.name=Stitches.Icon.getName(name);this.image=new Image();this.image.onload=function(){self.x=0;self.y=0;self.width=self.image.width+Stitches.settings.padding;self.height=self.image.height+Stitches.settings.padding;self.area=self.width*self.height;if(cb){cb(self);}};this.image.src=src;};Stitches.Icon.getName=function(name){var i=1,fix;name=name.replace(/[\s.]+/gi,"-").replace(/[^a-z0-9\-]/gi,"_");if(nameCache[name]){do{fix=name+"-"+i++;}while(nameCache[fix]);name=fix;}nameCache[name]=true;return name;};Stitches.Icon.clearNameCache=function(name){if(name){delete nameCache[name];}else{nameCache={};}};})(window,Stitches);(function(){var cache={};Stitches.tmpl=function tmpl(str,data){var fn=!/\W/.test(str)?cache[str]=cache[str]||tmpl(document.getElementById(str).innerHTML):new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+str.replace(/[\r\t\n]/g," ").split("<%").join("\t").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');");return data?fn(data):fn;};})();(function(window,Stitches,$){Stitches.Page=(function(){var rendered=false;return{fetchTemplates:function(){return $.get(Stitches.settings.jsdir+"/stitches.html",function(html){$("body").append(html);Stitches.Page.templates={stitches:Stitches.tmpl("stitches_tmpl"),icon:Stitches.tmpl("stitches_icon_tmpl")};Stitches.pub("page.templates.done");});},render:function(){var $div=$(Stitches.Page.templates.stitches({}));$div.appendTo(Stitches.Page.$elem);Stitches.Page.$stitches=$(".stitches",Stitches.Page.$elem);Stitches.Page.$drawer=$(".drawer",Stitches.Page.$elem);Stitches.Page.$dropbox=$(".dropbox",Stitches.Page.$elem);Stitches.Page.$droplabel=$(".droplabel",Stitches.Page.$elem);Stitches.Page.$filelist=$(".filelist",Stitches.Page.$elem);Stitches.Page.$buttons=$(".buttons",Stitches.Page.$elem);Stitches.Page.buttons={$generate:$("a.generate",Stitches.Page.$buttons),$clear:$("a.clear",Stitches.Page.$buttons),$sprite:$("a.dlsprite",Stitches.Page.$buttons),$stylesheet:$("a.dlstylesheet",Stitches.Page.$buttons)};Stitches.Page.$options=$(".options",Stitches.Page.$elem);Stitches.Page.inputs={$prefix:$("input[name=prefix]",Stitches.Page.$options),$padding:$("input[name=padding]",Stitches.Page.$options),$dataURI:$("input[name=dataURI]",Stitches.Page.$options)};Stitches.Page.inputs.$prefix.val(Stitches.settings.prefix);Stitches.Page.inputs.$padding.val(Stitches.settings.padding);Stitches.Page.inputs.$dataURI.filter("[value="+Stitches.settings.dataURI+"]").attr("checked",true);rendered=true;Stitches.pub("page.render.done");},errorHandler:function(e){if(rendered){Stitches.Page.$droplabel.html("× "+e.message).addClass("error");}throw e;},subscribe:function(){var buttons=Stitches.Page.buttons;var $droplabel=Stitches.Page.$droplabel;Stitches.sub("file.icon.done",function(icon){if(Stitches.iconQueue.length===1){$droplabel.fadeOut("fast");buttons.$generate.removeClass("disabled");buttons.$clear.removeClass("disabled");}buttons.$sprite.addClass("disabled");buttons.$stylesheet.addClass("disabled");});Stitches.sub("file.remove.done",function(icon){if(Stitches.iconQueue.length<1){$droplabel.fadeIn("fast");buttons.$generate.addClass("disabled");buttons.$clear.addClass("disabled");}buttons.$sprite.addClass("disabled");buttons.$stylesheet.addClass("disabled");});Stitches.sub("sprite.generate.done",function(sprite,stylesheet){buttons.$sprite.attr("href",sprite).removeClass("disabled");buttons.$stylesheet.attr("href",stylesheet).removeClass("disabled");});},_noop:function(e){e.preventDefault();e.stopPropagation();},bindDragAndDrop:function(){var dropbox=Stitches.Page.$dropbox.get(0);dropbox.addEventListener("dragenter",Stitches.Page._dragStart,false);dropbox.addEventListener("dragleave",Stitches.Page._dragStop,false);dropbox.addEventListener("dragexit",Stitches.Page._dragStop,false);dropbox.addEventListener("dragover",Stitches.Page._noop,false);dropbox.addEventListener("drop",Stitches.Page._drop,false);},_dragStart:function(e){Stitches.Page.$dropbox.addClass("dropping");},_dragStop:function(e){if($(e.target).parents(".dropbox").length===0){Stitches.Page.$dropbox.removeClass("dropping");}},_drop:function(e){e.stopPropagation();e.preventDefault();Stitches.Page.$dropbox.removeClass("dropping");var evt=e||window.event;var files=(evt.files||evt.dataTransfer.files);if(files.length>0){Stitches.pub("page.drop.done",files);}},bindButtons:function(){var $elem=Stitches.Page.$elem;$elem.delegate("a.disabled","click",Stitches.Page._noop);$elem.delegate("a.generate","click",Stitches.Page._generate);$elem.delegate("a.remove","click",Stitches.Page._removeFile);$elem.delegate("a.clear","click",Stitches.Page._removeAllFiles);},bindCabinet:function(){var $elem=Stitches.Page.$elem;var $stitches=Stitches.Page.$stitches;var $options=Stitches.Page.$options;var $drawer=Stitches.Page.$drawer;var $cabinet=$("form.cabinet",$drawer);var $input=$("input.files",$drawer);$stitches.hover(function(){$drawer.stop().animate({left:"-5px"},250);},function(){$drawer.stop().animate({left:"-125px"},250);});$input.bind("change",function(){if(this.files.length){Stitches.pub("page.drop.done",this.files);}$cabinet.trigger("reset");});$drawer.delegate("a.open-options","click",function(){$options.fadeIn();});},bindOptions:function(){var $options=Stitches.Page.$options;var buttons=Stitches.Page.buttons;$options.delegate("a.close-options","click",function(){$options.fadeOut();});$options.delegate("input","change",function(){buttons.$sprite.addClass("disabled");buttons.$stylesheet.addClass("disabled");});$options.delegate("input[name=prefix]","change",function(){Stitches.settings.prefix=Stitches.Page.inputs.$prefix.val();});$options.delegate("input[name=padding]","change",function(){var padding=Stitches.Page.inputs.$padding.val();Stitches.settings.padding=+padding;Stitches.Page.updateIconDimensions();});$options.delegate("input[name=dataURI]","change",function(){var dataURI=Stitches.Page.inputs.$dataURI.filter(":checked").val();Stitches.settings.dataURI=dataURI==="true"?true:false;});},_generate:function(e){Stitches.pub("sprite.generate",[].concat(Stitches.iconQueue));},_removeFile:function(e){var icon=$(this).parent("li").data("icon");Stitches.pub("file.unqueue",icon);},_removeAllFiles:function(e){Stitches.pub("file.unqueue.all");},addIcon:function(icon){$(Stitches.Page.templates.icon(icon)).data("icon",icon).appendTo(Stitches.Page.$filelist).fadeIn("fast");},removeIcon:function(icon){Stitches.Page.$filelist.find("li").filter(function(){return $(this).data("icon")===icon;}).fadeOut("fast").remove();},updateIconDimensions:function(){var padding=Stitches.settings.padding;$.each(Stitches.iconQueue,function(i,icon){icon.width=icon.image.width+padding;icon.height=icon.image.height+padding;});}};})();})(window,Stitches,jQuery);(function(window,Stitches,$){Stitches.File=(function(){var readQueue=[];return{queueFiles:function(files){$.each(files,function(i,file){if(/jpeg|png|gif/.test(file.type)){readQueue.push(file);Stitches.pub("file.queue.done",file);}});},queueIcons:function(){var file,reader;file=readQueue.shift();if(file){try{reader=new FileReader();reader.onloadend=function(e){var icon=new Stitches.Icon(file.name,e.target.result);Stitches.iconQueue.push(icon);Stitches.pub("file.icon.done",icon);};reader.readAsDataURL(file);}catch(e){Stitches.pub("page.error",e);}}},unqueueIcon:function(icon){Stitches.iconQueue=$.grep(Stitches.iconQueue,function(item){return item!==icon;});Stitches.Icon.clearNameCache(icon.name);Stitches.pub("file.remove.done",icon);},unqueueAllIcons:function(){$.each(Stitches.iconQueue,function(i,icon){Stitches.File.unqueueIcon(icon);});Stitches.Icon.clearNameCache();}};})();})(window,Stitches,jQuery); \ No newline at end of file diff --git a/build/js/stitches-0.5.16-min.js b/build/js/stitches-0.5.16-min.js new file mode 100644 index 00000000..783d22be --- /dev/null +++ b/build/js/stitches-0.5.16-min.js @@ -0,0 +1 @@ +(function(window,$,Modernizr){var S=window.Stitches=(function(){var defaults={jsdir:"js",prefix:"sprite",padding:10,dataURI:false};var _topics={};return{init:function($elem,config){S.settings=$.extend({},defaults,config);S.iconQueue=[];S.Page.$elem=$elem;S.sub("page.error",S.Page.errorHandler);S.sub("page.init.done",S.Page.fetchTemplates);S.sub("page.templates.done",S.Page.render);S.sub("page.render.done",S.checkAPIs);S.sub("page.apis.done",S.Page.bindDragAndDrop);S.sub("page.apis.done",S.Page.bindButtons);S.sub("page.apis.done",S.Page.bindCabinet);S.sub("page.apis.done",S.Page.bindOptions);S.sub("page.apis.done",S.Page.subscribe);S.sub("page.drop.done",S.File.queueFiles);S.sub("file.queue.done",S.File.queueIcons);S.sub("file.icon.done",S.Page.addIcon);S.sub("file.remove.done",S.Page.removeIcon);S.sub("file.unqueue",S.File.unqueueIcon);S.sub("file.unqueue.all",S.File.unqueueAllIcons);S.sub("sprite.generate",S.generateStitches);S.pub("page.init.done");},sub:function(topic,fn){var callbacks=_topics[topic]||$.Callbacks("stopOnFalse");if(fn){callbacks.add(fn);}_topics[topic]=callbacks;},unsub:function(topic,fn){var callbacks=_topics[topic];if(callbacks){callbacks.remove(fn);}},pub:function(topic){var callbacks=_topics[topic],args=Array.prototype.slice.call(arguments,1);if(callbacks){callbacks.fire.apply(callbacks,args);}},checkAPIs:function(){Modernizr.load([{test:typeof FileReader!=="undefined"&&Modernizr.draganddrop,nope:S.settings.jsdir+"/dropfile/dropfile.js"},{test:Modernizr.canvas,nope:S.settings.jsdir+"/flashcanvas/flashcanvas.js",complete:function(){if(typeof FileReader!=="undefined"&&Modernizr.draganddrop&&Modernizr.canvas){S.pub("page.apis.done");}else{S.pub("page.error",new Error("Required APIs are not present."));}}}]);},generateStitches:function(looseIcons){var placedIcons=S.positionImages(looseIcons);var sprite=S.makeStitches(placedIcons);var stylesheet=S.makeStylesheet(placedIcons,sprite);S.pub("sprite.generate.done",sprite,stylesheet);},positionImages:function(looseIcons){var placedIcons=[];$(looseIcons).each(function(idx,icon){icon.x=icon.y=0;icon.isPlaced=false;});looseIcons=looseIcons.sort(function(a,b){if(b.area===a.area){return b.name>a.name?1:-1;}else{return b.area-a.area;}});S.canvas=S.Icons.idealCanvas(looseIcons);S.Icons.placeIcons(looseIcons,placedIcons,S.canvas);S.Icons.cropCanvas(placedIcons,S.canvas);S.pub("sprite.position.done",placedIcons);return placedIcons;},makeStitches:function(placedIcons){var context,data;try{context=S.canvas.getContext("2d");$(placedIcons).each(function(idx,icon){context.drawImage(icon.image,icon.x,icon.y);});data=S.canvas.toDataURL();}catch(e){S.pub("page.error",e);}S.pub("sprite.image.done",data);return data;},makeStylesheet:function(placedIcons,sprite){placedIcons=placedIcons.sort(function(a,b){return a.namemaxW?icon.width:maxW;maxH=icon.height>maxH?icon.height:maxH;area+=icon.area;});var ideal=Math.ceil(Math.sqrt(area));var idealW=maxW>ideal?maxW:ideal;var idealH=maxH>ideal?maxH:ideal;var canvas=document.createElement("canvas");canvas.width=idealW;canvas.height=idealH;return canvas;},placeIcons:function(loose,placed,canvas){var i=0;while(loose.length&&i<10){$(loose).each(function(idx,icon){if(!icon.isPlaced){icon.isPlaced=S.Icons.placeIcon(icon,placed,canvas);}});i++;}for(i=0;iicon.x);y1=(p.yicon.y);if(x1&&x2&&y1&&y2){intersect.push(p);}});if(intersect.length){overlap=intersect.pop();}else{placed.push(icon);}return overlap;},cropCanvas:function(placed,canvas){var w=0,h=0;$(placed).each(function(idx,icon){w=w>icon.x+icon.width?w:icon.x+icon.width;h=h>icon.y+icon.height?h:icon.y+icon.height;});canvas.width=w;canvas.height=h;}};})();})(window,Stitches,jQuery);(function(window,Stitches){Stitches.Icon=(function(){var S=window.Stitches;var guid=0;var nameCache={};var Icon=function(name,src,cb){var self=this;this.guid=guid++;this.name=S.Icon.getName(name);this.image=new Image();this.image.onload=function(){self.x=0;self.y=0;self.width=self.image.width+S.settings.padding;self.height=self.image.height+S.settings.padding;self.area=self.width*self.height;if(cb){cb(self);}};this.image.src=src;};Icon.getName=function(name){var i=1,fix;name=name.replace(/[\s.]+/gi,"-").replace(/[^a-z0-9\-]/gi,"_");if(nameCache[name]){do{fix=name+"-"+i++;}while(nameCache[fix]);name=fix;}nameCache[name]=true;return name;};Icon.clearNameCache=function(name){if(name){delete nameCache[name];}else{nameCache={};}};return Icon;})();})(window,Stitches);(function(){var cache={};Stitches.tmpl=function tmpl(str,data){var fn=!/\W/.test(str)?cache[str]=cache[str]||tmpl(document.getElementById(str).innerHTML):new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+str.replace(/[\r\t\n]/g," ").split("<%").join("\t").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');");return data?fn(data):fn;};})();(function(window,Stitches,$){Stitches.Page=(function(){var S=window.Stitches;var rendered=false;return{fetchTemplates:function(){return $.get(S.settings.jsdir+"/stitches.html",function(html){$("body").append(html);S.Page.templates={stitches:S.tmpl("stitches_tmpl"),icon:S.tmpl("stitches_icon_tmpl")};S.pub("page.templates.done");});},render:function(){var $div=$(S.Page.templates.stitches({}));$div.appendTo(S.Page.$elem);S.Page.$stitches=$(".stitches",S.Page.$elem);S.Page.$drawer=$(".drawer",S.Page.$elem);S.Page.$dropbox=$(".dropbox",S.Page.$elem);S.Page.$droplabel=$(".droplabel",S.Page.$elem);S.Page.$filelist=$(".filelist",S.Page.$elem);S.Page.$buttons=$(".buttons",S.Page.$elem);S.Page.buttons={$generate:$("a.generate",S.Page.$buttons),$clear:$("a.clear",S.Page.$buttons),$sprite:$("a.dlsprite",S.Page.$buttons),$stylesheet:$("a.dlstylesheet",S.Page.$buttons)};S.Page.$options=$(".options",S.Page.$elem);S.Page.inputs={$prefix:$("input[name=prefix]",S.Page.$options),$padding:$("input[name=padding]",S.Page.$options),$dataURI:$("input[name=dataURI]",S.Page.$options)};S.Page.inputs.$prefix.val(S.settings.prefix);S.Page.inputs.$padding.val(S.settings.padding);S.Page.inputs.$dataURI.filter("[value="+S.settings.dataURI+"]").attr("checked",true);rendered=true;S.pub("page.render.done");},errorHandler:function(e){if(rendered){S.Page.$droplabel.html("× "+e.message).addClass("error");}throw e;},subscribe:function(){var buttons=S.Page.buttons;var $droplabel=S.Page.$droplabel;S.sub("file.icon.done",function(icon){if(S.iconQueue.length===1){$droplabel.fadeOut("fast");buttons.$generate.removeClass("disabled");buttons.$clear.removeClass("disabled");}buttons.$sprite.addClass("disabled");buttons.$stylesheet.addClass("disabled");});S.sub("file.remove.done",function(icon){if(S.iconQueue.length<1){$droplabel.fadeIn("fast");buttons.$generate.addClass("disabled");buttons.$clear.addClass("disabled");}buttons.$sprite.addClass("disabled");buttons.$stylesheet.addClass("disabled");});S.sub("sprite.generate.done",function(sprite,stylesheet){buttons.$sprite.attr("href",sprite).removeClass("disabled");buttons.$stylesheet.attr("href",stylesheet).removeClass("disabled");});},_noop:function(e){e.preventDefault();e.stopPropagation();},bindDragAndDrop:function(){var dropbox=S.Page.$dropbox.get(0);dropbox.addEventListener("dragenter",S.Page._dragStart,false);dropbox.addEventListener("dragleave",S.Page._dragStop,false);dropbox.addEventListener("dragexit",S.Page._dragStop,false);dropbox.addEventListener("dragover",S.Page._noop,false);dropbox.addEventListener("drop",S.Page._drop,false);},_dragStart:function(e){S.Page.$dropbox.addClass("dropping");},_dragStop:function(e){if($(e.target).parents(".dropbox").length===0){S.Page.$dropbox.removeClass("dropping");}},_drop:function(e){e.stopPropagation();e.preventDefault();S.Page.$dropbox.removeClass("dropping");var evt=e||window.event;var files=(evt.files||evt.dataTransfer.files);if(files.length>0){S.pub("page.drop.done",files);}},bindButtons:function(){var $elem=S.Page.$elem;$elem.delegate("a.disabled","click",S.Page._noop);$elem.delegate("a.generate","click",S.Page._generate);$elem.delegate("a.remove","click",S.Page._removeFile);$elem.delegate("a.clear","click",S.Page._removeAllFiles);},bindCabinet:function(){var $elem=S.Page.$elem;var $stitches=S.Page.$stitches;var $options=S.Page.$options;var $drawer=S.Page.$drawer;var $cabinet=$("form.cabinet",$drawer);var $input=$("input.files",$drawer);$stitches.hover(function(){$drawer.stop().animate({left:"-5px"},250);},function(){$drawer.stop().animate({left:"-125px"},250);});$input.bind("change",function(){if(this.files.length){S.pub("page.drop.done",this.files);}$cabinet.trigger("reset");});$drawer.delegate("a.open-options","click",function(){$options.fadeIn();});},bindOptions:function(){var $options=S.Page.$options;var buttons=S.Page.buttons;$options.delegate("a.close-options","click",function(){$options.fadeOut();});$options.delegate("input","change",function(){buttons.$sprite.addClass("disabled");buttons.$stylesheet.addClass("disabled");});$options.delegate("input[name=prefix]","change",function(){S.settings.prefix=S.Page.inputs.$prefix.val();});$options.delegate("input[name=padding]","change",function(){var padding=S.Page.inputs.$padding.val();S.settings.padding=+padding;S.Page.updateIconDimensions();});$options.delegate("input[name=dataURI]","change",function(){var dataURI=S.Page.inputs.$dataURI.filter(":checked").val();S.settings.dataURI=dataURI==="true"?true:false;});},_generate:function(e){S.pub("sprite.generate",[].concat(S.iconQueue));},_removeFile:function(e){var icon=$(this).parent("li").data("icon");S.pub("file.unqueue",icon);},_removeAllFiles:function(e){S.pub("file.unqueue.all");},addIcon:function(icon){$(S.Page.templates.icon(icon)).data("icon",icon).appendTo(S.Page.$filelist).fadeIn("fast");},removeIcon:function(icon){S.Page.$filelist.find("li").filter(function(){return $(this).data("icon")===icon;}).fadeOut("fast").remove();},updateIconDimensions:function(){var padding=S.settings.padding;$.each(S.iconQueue,function(i,icon){icon.width=icon.image.width+padding;icon.height=icon.image.height+padding;});}};})();})(window,Stitches,jQuery);(function(window,Stitches,$){Stitches.File=(function(){var S=window.Stitches;var readQueue=[];return{queueFiles:function(files){$.each(files,function(i,file){if(/jpeg|png|gif/.test(file.type)){readQueue.push(file);S.pub("file.queue.done",file);}});},queueIcons:function(){var file,reader;file=readQueue.shift();if(file){try{reader=new FileReader();reader.onloadend=function(e){var icon=new S.Icon(file.name,e.target.result);S.iconQueue.push(icon);S.pub("file.icon.done",icon);};reader.readAsDataURL(file);}catch(e){S.pub("page.error",e);}}},unqueueIcon:function(icon){S.iconQueue=$.grep(S.iconQueue,function(item){return item!==icon;});S.Icon.clearNameCache(icon.name);S.pub("file.remove.done",icon);},unqueueAllIcons:function(){$.each(S.iconQueue,function(i,icon){S.File.unqueueIcon(icon);});S.Icon.clearNameCache();}};})();})(window,Stitches,jQuery); \ No newline at end of file diff --git a/build/js/stitches-0.5.14.js b/build/js/stitches-0.5.16.js similarity index 68% rename from build/js/stitches-0.5.14.js rename to build/js/stitches-0.5.16.js index 9b2dcbe0..1b33bdd6 100644 --- a/build/js/stitches-0.5.14.js +++ b/build/js/stitches-0.5.16.js @@ -13,8 +13,9 @@ // ## Stitches namespace // // Holds all methods - window.Stitches = (function () { - // **Some configuration defaults** + var S = window.Stitches = (function () { + + /* Some configuration defaults */ var defaults = { "jsdir": "js", "prefix": "sprite", @@ -22,10 +23,10 @@ "dataURI": false }; - return { - // **Pub/sub subscription manager** - _topics: {}, + /* Pub/sub subscription manager */ + var _topics = {}; + return { // ### init // // Readies everything for user interaction. @@ -33,30 +34,30 @@ // @param {jQuery} $elem A wrapped DOM node // @param {Object} config An optional settings object init: function ($elem, config) { - Stitches.settings = $.extend({}, defaults, config); - Stitches.iconQueue = []; - Stitches.Page.$elem = $elem; + S.settings = $.extend({}, defaults, config); + S.iconQueue = []; + S.Page.$elem = $elem; /* setup subscriptions */ - Stitches.sub("page.error", Stitches.Page.errorHandler); - Stitches.sub("page.init.done", Stitches.Page.fetchTemplates); - Stitches.sub("page.templates.done", Stitches.Page.render); - Stitches.sub("page.render.done", Stitches.checkAPIs); - Stitches.sub("page.apis.done", Stitches.Page.bindDragAndDrop); - Stitches.sub("page.apis.done", Stitches.Page.bindButtons); - Stitches.sub("page.apis.done", Stitches.Page.bindCabinet); - Stitches.sub("page.apis.done", Stitches.Page.bindOptions); - Stitches.sub("page.apis.done", Stitches.Page.subscribe); - Stitches.sub("page.drop.done", Stitches.File.queueFiles); - Stitches.sub("file.queue.done", Stitches.File.queueIcons); - Stitches.sub("file.icon.done", Stitches.Page.addIcon); - Stitches.sub("file.remove.done", Stitches.Page.removeIcon); - Stitches.sub("file.unqueue", Stitches.File.unqueueIcon); - Stitches.sub("file.unqueue.all", Stitches.File.unqueueAllIcons); - Stitches.sub("sprite.generate", Stitches.generateStitches); + S.sub("page.error", S.Page.errorHandler); + S.sub("page.init.done", S.Page.fetchTemplates); + S.sub("page.templates.done", S.Page.render); + S.sub("page.render.done", S.checkAPIs); + S.sub("page.apis.done", S.Page.bindDragAndDrop); + S.sub("page.apis.done", S.Page.bindButtons); + S.sub("page.apis.done", S.Page.bindCabinet); + S.sub("page.apis.done", S.Page.bindOptions); + S.sub("page.apis.done", S.Page.subscribe); + S.sub("page.drop.done", S.File.queueFiles); + S.sub("file.queue.done", S.File.queueIcons); + S.sub("file.icon.done", S.Page.addIcon); + S.sub("file.remove.done", S.Page.removeIcon); + S.sub("file.unqueue", S.File.unqueueIcon); + S.sub("file.unqueue.all", S.File.unqueueAllIcons); + S.sub("sprite.generate", S.generateStitches); /* notify */ - Stitches.pub("page.init.done"); + S.pub("page.init.done"); }, // ### sub @@ -66,11 +67,11 @@ // @param {String} topic The subscription topic name // @param {Function} fn A callback to fire sub: function (topic, fn) { - var callbacks = Stitches._topics[topic] || $.Callbacks("stopOnFalse"); + var callbacks = _topics[topic] || $.Callbacks("stopOnFalse"); if (fn) { callbacks.add(fn); } - Stitches._topics[topic] = callbacks; + _topics[topic] = callbacks; }, // ### unsub @@ -80,7 +81,7 @@ // @param {String} topic The subscription topic name // @param {Function} fn A callback to remove unsub: function (topic, fn) { - var callbacks = Stitches._topics[topic]; + var callbacks = _topics[topic]; if (callbacks) { callbacks.remove(fn); } @@ -92,7 +93,7 @@ // // @param {String} topic The subscription topic name pub: function (topic) { - var callbacks = Stitches._topics[topic], + var callbacks = _topics[topic], args = Array.prototype.slice.call(arguments, 1); if (callbacks) { callbacks.fire.apply(callbacks, args); @@ -108,16 +109,16 @@ Modernizr.load([ { test: typeof FileReader !== "undefined" && Modernizr.draganddrop, - nope: Stitches.settings.jsdir + "/dropfile/dropfile.js" + nope: S.settings.jsdir + "/dropfile/dropfile.js" }, { test: Modernizr.canvas, - nope: Stitches.settings.jsdir + "/flashcanvas/flashcanvas.js", + nope: S.settings.jsdir + "/flashcanvas/flashcanvas.js", complete: function () { if (typeof FileReader !== "undefined" && Modernizr.draganddrop && Modernizr.canvas) { - Stitches.pub("page.apis.done"); + S.pub("page.apis.done"); } else { - Stitches.pub("page.error", new Error("Required APIs are not present.")); + S.pub("page.error", new Error("Required APIs are not present.")); } } } @@ -132,12 +133,12 @@ // // @param {[Icon]} looseIcons An Icon array of images to place generateStitches: function (looseIcons) { - var placedIcons = Stitches.positionImages(looseIcons); - var sprite = Stitches.makeStitches(placedIcons); - var stylesheet = Stitches.makeStylesheet(placedIcons, sprite); + var placedIcons = S.positionImages(looseIcons); + var sprite = S.makeStitches(placedIcons); + var stylesheet = S.makeStylesheet(placedIcons, sprite); /* notify */ - Stitches.pub("sprite.generate.done", sprite, stylesheet); + S.pub("sprite.generate.done", sprite, stylesheet); }, // ### positionImages @@ -165,16 +166,16 @@ }); /* find the ideal sprite for this set of icons */ - Stitches.canvas = Stitches.Icons.idealCanvas(looseIcons); + S.canvas = S.Icons.idealCanvas(looseIcons); /* try to place all of the icons on the ideal canvas */ - Stitches.Icons.placeIcons(looseIcons, placedIcons, Stitches.canvas); + S.Icons.placeIcons(looseIcons, placedIcons, S.canvas); /* trim empty edges */ - Stitches.Icons.cropCanvas(placedIcons, Stitches.canvas); + S.Icons.cropCanvas(placedIcons, S.canvas); /* notify and return */ - Stitches.pub("sprite.position.done", placedIcons); + S.pub("sprite.position.done", placedIcons); return placedIcons; }, @@ -191,19 +192,19 @@ domain blocking in browses for access to write image data to the canvas */ try { - context = Stitches.canvas.getContext('2d'); + context = S.canvas.getContext('2d'); $(placedIcons).each(function (idx, icon) { context.drawImage(icon.image, icon.x, icon.y); }); /* create image link */ - data = Stitches.canvas.toDataURL(); + data = S.canvas.toDataURL(); } catch (e) { - Stitches.pub("page.error", e); + S.pub("page.error", e); } /* notify and return */ - Stitches.pub("sprite.image.done", data); + S.pub("sprite.image.done", data); return data; }, @@ -220,10 +221,10 @@ return a.name < b.name ? -1 : 1; }); - var prefix = Stitches.settings.prefix; + var prefix = S.settings.prefix; var backgroundImage - if (Stitches.settings.dataURI) { + if (S.settings.dataURI) { backgroundImage = sprite; } else { backgroundImage = "download.png"; @@ -249,7 +250,7 @@ var data = "data:," + encodeURIComponent(css.join("\n")); /* notify and return */ - Stitches.pub("sprite.stylesheet.done", data); + S.pub("sprite.stylesheet.done", data); return data; } }; @@ -267,12 +268,17 @@ "use strict"; - var document = window.document; - // ## Stitches.Icons namespace // // Holds all methods for working with icons Stitches.Icons = (function () { + + /* shortcut */ + var S = window.Stitches; + + /* shortcut */ + var document = window.document; + return { // ### idealCanvas // @@ -327,7 +333,7 @@ while (loose.length && i < 10) { $(loose).each(function (idx, icon) { if (!icon.isPlaced) { - icon.isPlaced = Stitches.Icons.placeIcon(icon, placed, canvas); + icon.isPlaced = S.Icons.placeIcon(icon, placed, canvas); } }); @@ -363,7 +369,7 @@ icon.x = x; icon.y = y; - var overlap = Stitches.Icons.isOverlapped(icon, placed); + var overlap = S.Icons.isOverlapped(icon, placed); if (!overlap) { return true; } @@ -451,78 +457,91 @@ "use strict"; - // **Maintain a unique id for each icon** - var guid = 0; - - // **Maintains a unique name for each icon** - var nameCache = {}; - - // ## Stitches.Icon class + // ## Stitches.Icon namespace // - // Wraps a single icon. Creates a new image from the source - // and sets additional properties after the image loads. - // The callback is generally used to handle queueuing - // - // @param {String} name - // @param {String} src - // @param {Function} cb Optional callback - Stitches.Icon = function (name, src, cb) { - var self = this; - - this.guid = guid++; - this.name = Stitches.Icon.getName(name); - - this.image = new Image(); - this.image.onload = function () { - self.x = 0; - self.y = 0; - self.width = self.image.width + Stitches.settings.padding; - self.height = self.image.height + Stitches.settings.padding; - self.area = self.width * self.height; - - if (cb) { - cb(self); + // Constructs and manages icons + Stitches.Icon = (function () { + + /* shortcut */ + var S = window.Stitches; + + /* Maintain a unique id for each icon */ + var guid = 0; + + /* Maintains a unique name for each icon */ + var nameCache = {}; + + // ### Icon + // + // Wraps a single icon. Creates a new image from the source + // and sets additional properties after the image loads. + // The callback is generally used to handle queueuing + // + // @param {String} name + // @param {String} src + // @param {Function} cb Optional callback + // @constructor + var Icon = function (name, src, cb) { + var self = this; + + this.guid = guid++; + this.name = S.Icon.getName(name); + + this.image = new Image(); + this.image.onload = function () { + self.x = 0; + self.y = 0; + self.width = self.image.width + S.settings.padding; + self.height = self.image.height + S.settings.padding; + self.area = self.width * self.height; + + if (cb) { + cb(self); + } } - } - this.image.src = src; - }; + this.image.src = src; + }; - // ### Stitches.Icon.getName - // - // Return a unique name. If the name is already in the nameCache, - // append a value until a unique name is found. - // - // @param {String} name - // @return {String} - Stitches.Icon.getName = function (name) { - var i = 1, fix; - - name = name.replace(/[\s.]+/gi, "-").replace(/[^a-z0-9\-]/gi, "_"); - - if (nameCache[name]) { - do { - fix = name + "-" + i++; - } while (nameCache[fix]); - name = fix; - } - - nameCache[name] = true; - return name; - }; + // ### Icon.getName + // + // Return a unique name. If the name is already in the nameCache, + // append a value until a unique name is found. + // + // @param {String} name + // @return {String} + Icon.getName = function (name) { + var i = 1, fix; + + name = name.replace(/[\s.]+/gi, "-").replace(/[^a-z0-9\-]/gi, "_"); + + if (nameCache[name]) { + do { + fix = name + "-" + i++; + } while (nameCache[fix]); + name = fix; + } - // ### Stitches.Icon.clearNameCache - // - // Clear the name cache. If a name is passed in, only clear that key - // - // @param {String} name - // @return {String} - Stitches.Icon.clearNameCache = function (name) { - if (name) { - delete nameCache[name]; - } else { - nameCache = {}; - } - }; + nameCache[name] = true; + return name; + }; + + // ### Icon.clearNameCache + // + // Clear the name cache. If a name is passed in, only clear that key + // + // @param {String} name + // @return {String} + Icon.clearNameCache = function (name) { + if (name) { + delete nameCache[name]; + } else { + nameCache = {}; + } + }; + + /* return constructor */ + return Icon; + })(); })(window, Stitches);/* Simple JavaScript Templating John Resig - http://ejohn.org/ - MIT Licensed */ @@ -564,6 +583,10 @@ // Holds all DOM interaction methods Stitches.Page = (function () { + /* shortcut */ + var S = window.Stitches; + + /* true when the widget has rendered */ var rendered = false; return { @@ -573,16 +596,16 @@ // // @return {jqXHR} fetchTemplates: function () { - return $.get(Stitches.settings.jsdir + "/stitches.html", function (html) { + return $.get(S.settings.jsdir + "/stitches.html", function (html) { $("body").append(html); - Stitches.Page.templates = { - stitches: Stitches.tmpl("stitches_tmpl"), - icon: Stitches.tmpl("stitches_icon_tmpl") + S.Page.templates = { + stitches: S.tmpl("stitches_tmpl"), + icon: S.tmpl("stitches_icon_tmpl") }; /* notify */ - Stitches.pub("page.templates.done"); + S.pub("page.templates.done"); }); }, @@ -590,37 +613,37 @@ // // Creates the stitches widget and content render: function () { - var $div = $(Stitches.Page.templates.stitches({})); - $div.appendTo(Stitches.Page.$elem); + var $div = $(S.Page.templates.stitches({})); + $div.appendTo(S.Page.$elem); // set dom element references - Stitches.Page.$stitches = $(".stitches", Stitches.Page.$elem); - Stitches.Page.$drawer = $(".drawer", Stitches.Page.$elem); - Stitches.Page.$dropbox = $(".dropbox", Stitches.Page.$elem); - Stitches.Page.$droplabel = $(".droplabel", Stitches.Page.$elem); - Stitches.Page.$filelist = $(".filelist", Stitches.Page.$elem); - Stitches.Page.$buttons = $(".buttons", Stitches.Page.$elem); - Stitches.Page.buttons = { - $generate: $("a.generate", Stitches.Page.$buttons), - $clear: $("a.clear", Stitches.Page.$buttons), - $sprite: $("a.dlsprite", Stitches.Page.$buttons), - $stylesheet: $("a.dlstylesheet", Stitches.Page.$buttons) + S.Page.$stitches = $(".stitches", S.Page.$elem); + S.Page.$drawer = $(".drawer", S.Page.$elem); + S.Page.$dropbox = $(".dropbox", S.Page.$elem); + S.Page.$droplabel = $(".droplabel", S.Page.$elem); + S.Page.$filelist = $(".filelist", S.Page.$elem); + S.Page.$buttons = $(".buttons", S.Page.$elem); + S.Page.buttons = { + $generate: $("a.generate", S.Page.$buttons), + $clear: $("a.clear", S.Page.$buttons), + $sprite: $("a.dlsprite", S.Page.$buttons), + $stylesheet: $("a.dlstylesheet", S.Page.$buttons) }; // set options - Stitches.Page.$options = $(".options", Stitches.Page.$elem); - Stitches.Page.inputs = { - $prefix: $("input[name=prefix]", Stitches.Page.$options), - $padding: $("input[name=padding]", Stitches.Page.$options), - $dataURI: $("input[name=dataURI]", Stitches.Page.$options) + S.Page.$options = $(".options", S.Page.$elem); + S.Page.inputs = { + $prefix: $("input[name=prefix]", S.Page.$options), + $padding: $("input[name=padding]", S.Page.$options), + $dataURI: $("input[name=dataURI]", S.Page.$options) }; - Stitches.Page.inputs.$prefix.val(Stitches.settings.prefix); - Stitches.Page.inputs.$padding.val(Stitches.settings.padding); - Stitches.Page.inputs.$dataURI.filter("[value=" + Stitches.settings.dataURI + "]").attr("checked", true); + S.Page.inputs.$prefix.val(S.settings.prefix); + S.Page.inputs.$padding.val(S.settings.padding); + S.Page.inputs.$dataURI.filter("[value=" + S.settings.dataURI + "]").attr("checked", true); /* notify */ rendered = true; - Stitches.pub("page.render.done"); + S.pub("page.render.done"); }, // ## errorHandler @@ -628,7 +651,7 @@ // Handles all error messages errorHandler: function (e) { if (rendered) { - Stitches.Page.$droplabel.html("× " + e.message).addClass("error"); + S.Page.$droplabel.html("× " + e.message).addClass("error"); } throw e; }, @@ -637,12 +660,12 @@ // // Handles all subscriptions subscribe: function () { - var buttons = Stitches.Page.buttons; - var $droplabel = Stitches.Page.$droplabel; + var buttons = S.Page.buttons; + var $droplabel = S.Page.$droplabel; /* handle drop label and buttons on queue length changes */ - Stitches.sub("file.icon.done", function (icon) { - if (Stitches.iconQueue.length === 1) { + S.sub("file.icon.done", function (icon) { + if (S.iconQueue.length === 1) { $droplabel.fadeOut("fast"); buttons.$generate.removeClass("disabled"); buttons.$clear.removeClass("disabled"); @@ -650,8 +673,8 @@ buttons.$sprite.addClass("disabled"); buttons.$stylesheet.addClass("disabled"); }); - Stitches.sub("file.remove.done", function (icon) { - if (Stitches.iconQueue.length < 1) { + S.sub("file.remove.done", function (icon) { + if (S.iconQueue.length < 1) { $droplabel.fadeIn("fast"); buttons.$generate.addClass("disabled"); buttons.$clear.addClass("disabled"); @@ -661,7 +684,7 @@ }); /* handle sprite and stylesheet generation */ - Stitches.sub("sprite.generate.done", function (sprite, stylesheet) { + S.sub("sprite.generate.done", function (sprite, stylesheet) { buttons.$sprite.attr("href", sprite).removeClass("disabled"); buttons.$stylesheet.attr("href", stylesheet).removeClass("disabled"); }); @@ -677,34 +700,34 @@ // // Bind all of the event listeners for drag and drop bindDragAndDrop: function () { - var dropbox = Stitches.Page.$dropbox.get(0); - dropbox.addEventListener("dragenter", Stitches.Page._dragStart, false); - dropbox.addEventListener("dragleave", Stitches.Page._dragStop, false); - dropbox.addEventListener("dragexit", Stitches.Page._dragStop, false); - dropbox.addEventListener("dragover", Stitches.Page._noop, false); - dropbox.addEventListener("drop", Stitches.Page._drop, false); + var dropbox = S.Page.$dropbox.get(0); + dropbox.addEventListener("dragenter", S.Page._dragStart, false); + dropbox.addEventListener("dragleave", S.Page._dragStop, false); + dropbox.addEventListener("dragexit", S.Page._dragStop, false); + dropbox.addEventListener("dragover", S.Page._noop, false); + dropbox.addEventListener("drop", S.Page._drop, false); }, // #### *Private drag and drop methods* _dragStart: function (e) { - Stitches.Page.$dropbox.addClass("dropping"); + S.Page.$dropbox.addClass("dropping"); }, _dragStop: function (e) { if ($(e.target).parents(".dropbox").length === 0) { - Stitches.Page.$dropbox.removeClass("dropping"); + S.Page.$dropbox.removeClass("dropping"); } }, _drop: function (e) { e.stopPropagation(); e.preventDefault(); - Stitches.Page.$dropbox.removeClass("dropping"); + S.Page.$dropbox.removeClass("dropping"); var evt = e || window.event; var files = (evt.files || evt.dataTransfer.files); if (files.length > 0) { - Stitches.pub("page.drop.done", files); + S.pub("page.drop.done", files); } }, @@ -712,21 +735,21 @@ // // Bind all of the event listeners for buttons bindButtons: function () { - var $elem = Stitches.Page.$elem; - $elem.delegate("a.disabled", "click", Stitches.Page._noop); - $elem.delegate("a.generate", "click", Stitches.Page._generate); - $elem.delegate("a.remove", "click", Stitches.Page._removeFile); - $elem.delegate("a.clear", "click", Stitches.Page._removeAllFiles); + var $elem = S.Page.$elem; + $elem.delegate("a.disabled", "click", S.Page._noop); + $elem.delegate("a.generate", "click", S.Page._generate); + $elem.delegate("a.remove", "click", S.Page._removeFile); + $elem.delegate("a.clear", "click", S.Page._removeAllFiles); }, // ### bindCabinet // // Bind all of the event listeners for the cabinet bindCabinet: function () { - var $elem = Stitches.Page.$elem; - var $stitches = Stitches.Page.$stitches; - var $options = Stitches.Page.$options; - var $drawer = Stitches.Page.$drawer; + var $elem = S.Page.$elem; + var $stitches = S.Page.$stitches; + var $options = S.Page.$options; + var $drawer = S.Page.$drawer; var $cabinet = $("form.cabinet", $drawer); var $input = $("input.files", $drawer); @@ -740,7 +763,7 @@ // on change event, use the drop event to handle files $input.bind("change", function () { if (this.files.length) { - Stitches.pub("page.drop.done", this.files); + S.pub("page.drop.done", this.files); } $cabinet.trigger("reset"); }); @@ -755,8 +778,8 @@ // // Bind all of the event listeners for the options panel bindOptions: function () { - var $options = Stitches.Page.$options; - var buttons = Stitches.Page.buttons; + var $options = S.Page.$options; + var buttons = S.Page.buttons; $options.delegate("a.close-options", "click", function () { $options.fadeOut(); @@ -768,34 +791,34 @@ }); $options.delegate("input[name=prefix]", "change", function () { - Stitches.settings.prefix = Stitches.Page.inputs.$prefix.val(); + S.settings.prefix = S.Page.inputs.$prefix.val(); }); $options.delegate("input[name=padding]", "change", function () { - var padding = Stitches.Page.inputs.$padding.val(); - Stitches.settings.padding = +padding; - Stitches.Page.updateIconDimensions(); + var padding = S.Page.inputs.$padding.val(); + S.settings.padding = +padding; + S.Page.updateIconDimensions(); }); $options.delegate("input[name=dataURI]", "change", function () { - var dataURI = Stitches.Page.inputs.$dataURI.filter(":checked").val(); - Stitches.settings.dataURI = dataURI === "true" ? true : false; + var dataURI = S.Page.inputs.$dataURI.filter(":checked").val(); + S.settings.dataURI = dataURI === "true" ? true : false; }); }, // #### *Private button methods* _generate: function (e) { /* [].concat to copy array */ - Stitches.pub("sprite.generate", [].concat(Stitches.iconQueue)); + S.pub("sprite.generate", [].concat(S.iconQueue)); }, _removeFile: function (e) { var icon = $(this).parent("li").data("icon"); - Stitches.pub("file.unqueue", icon); + S.pub("file.unqueue", icon); }, _removeAllFiles: function (e) { - Stitches.pub("file.unqueue.all"); + S.pub("file.unqueue.all"); }, // ### addIcon @@ -803,9 +826,9 @@ // Add an icon to the file list // @param {Icon} icon addIcon: function (icon) { - $(Stitches.Page.templates.icon(icon)) + $(S.Page.templates.icon(icon)) .data("icon", icon) - .appendTo(Stitches.Page.$filelist) + .appendTo(S.Page.$filelist) .fadeIn("fast"); }, @@ -814,7 +837,7 @@ // Remove an icon from the file list // @param {Icon} icon removeIcon: function (icon) { - Stitches.Page.$filelist.find("li") + S.Page.$filelist.find("li") .filter(function () { return $(this).data("icon") === icon; }) @@ -826,9 +849,9 @@ // // Update icon dimensions after changing padding setting updateIconDimensions: function () { - var padding = Stitches.settings.padding; + var padding = S.settings.padding; - $.each(Stitches.iconQueue, function (i, icon) { + $.each(S.iconQueue, function (i, icon) { icon.width = icon.image.width + padding; icon.height = icon.image.height + padding; }); @@ -853,6 +876,9 @@ // Holds all File procesing methods Stitches.File = (function () { + /* shortcut */ + var S = window.Stitches; + /* track files to read */ var readQueue = []; @@ -866,7 +892,7 @@ $.each(files, function (i, file) { if (/jpeg|png|gif/.test(file.type)) { readQueue.push(file); - Stitches.pub("file.queue.done", file); + S.pub("file.queue.done", file); } }); }, @@ -884,15 +910,15 @@ reader = new FileReader(); reader.onloadend = function (e) { /* create an icon and add to the icon queue */ - var icon = new Stitches.Icon(file.name, e.target.result); - Stitches.iconQueue.push(icon); + var icon = new S.Icon(file.name, e.target.result); + S.iconQueue.push(icon); /* notify */ - Stitches.pub("file.icon.done", icon); + S.pub("file.icon.done", icon); }; reader.readAsDataURL(file); } catch (e) { - Stitches.pub("page.error", e); + S.pub("page.error", e); } } }, @@ -904,23 +930,23 @@ // @param {Icon} icon unqueueIcon: function (icon) { /* remove the icon from the queue */ - Stitches.iconQueue = $.grep(Stitches.iconQueue, function (item) { + S.iconQueue = $.grep(S.iconQueue, function (item) { return item !== icon; }); - Stitches.Icon.clearNameCache(icon.name); + S.Icon.clearNameCache(icon.name); /* notify */ - Stitches.pub("file.remove.done", icon); + S.pub("file.remove.done", icon); }, // ### unqueueAllIcons // // Clear all icons from the queue unqueueAllIcons: function () { - $.each(Stitches.iconQueue, function (i, icon) { - Stitches.File.unqueueIcon(icon); + $.each(S.iconQueue, function (i, icon) { + S.File.unqueueIcon(icon); }); - Stitches.Icon.clearNameCache(); + S.Icon.clearNameCache(); } }; })(); diff --git a/build/js/stitches.html b/build/js/stitches.html index b2870d5c..cc7fc12f 100644 --- a/build/js/stitches.html +++ b/build/js/stitches.html @@ -27,10 +27,10 @@

options

diff --git a/dist/stitches-0.5.16.zip b/dist/stitches-0.5.16.zip new file mode 100644 index 0000000000000000000000000000000000000000..2bfbe92d583b0f15bbe54109d8b5ac77d094b635 GIT binary patch literal 95049 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 literal 0 HcmV?d00001 diff --git a/docs/file.html b/docs/file.html index ef8fbd2e..b7ade643 100644 --- a/docs/file.html +++ b/docs/file.html @@ -13,6 +13,9 @@

Holds all File procesing methods

     Stitches.File = (function () {
 
+        /* shortcut */
+        var S = window.Stitches;
+
         /* track files to read */
         var readQueue = [];
 
@@ -27,7 +30,7 @@
                 $.each(files, function (i, file) {
                     if (/jpeg|png|gif/.test(file.type)) {
                         readQueue.push(file);
-                        Stitches.pub("file.queue.done", file);
+                        S.pub("file.queue.done", file);
                     }
                 });
             },
@@ -45,15 +48,15 @@
                         reader = new FileReader();
                         reader.onloadend = function (e) {
                             /* create an icon and add to the icon queue */
-                            var icon = new Stitches.Icon(file.name, e.target.result);
-                            Stitches.iconQueue.push(icon);
+                            var icon = new S.Icon(file.name, e.target.result);
+                            S.iconQueue.push(icon);
 
                             /* notify */
-                            Stitches.pub("file.icon.done", icon);
+                            S.pub("file.icon.done", icon);
                         };
                         reader.readAsDataURL(file);
                     } catch (e) {
-                        Stitches.pub("page.error", e);
+                        S.pub("page.error", e);
                     }
                 }
             },
@@ -66,23 +69,23 @@
 
             unqueueIcon: function (icon) {
                 /* remove the icon from the queue */
-                Stitches.iconQueue = $.grep(Stitches.iconQueue, function (item) {
+                S.iconQueue = $.grep(S.iconQueue, function (item) {
                     return item !== icon;
                 });
-                Stitches.Icon.clearNameCache(icon.name);
+                S.Icon.clearNameCache(icon.name);
 
                 /* notify */
-                Stitches.pub("file.remove.done", icon);
+                S.pub("file.remove.done", icon);
             },
 
 

unqueueAllIcons

Clear all icons from the queue

             unqueueAllIcons: function () {
-                $.each(Stitches.iconQueue, function (i, icon) {
-                    Stitches.File.unqueueIcon(icon);
+                $.each(S.iconQueue, function (i, icon) {
+                    S.File.unqueueIcon(icon);
                 });
-                Stitches.Icon.clearNameCache();
+                S.Icon.clearNameCache();
             }
         };
     })();
diff --git a/docs/icon.html b/docs/icon.html
index b11fa6f3..5bbacf42 100644
--- a/docs/icon.html
+++ b/docs/icon.html
@@ -8,13 +8,21 @@
 
     "use strict";
 
-

Maintain a unique id for each icon

-    var guid = 0;
+

Stitches.Icon namespace

+ +

Constructs and manages icons

+    Stitches.Icon = (function () {
+
+        /* shortcut */
+        var S = window.Stitches;
+
+        /* Maintain a unique id for each icon */
+        var guid = 0;
 
-

Maintains a unique name for each icon

-    var nameCache = {};
+        /* Maintains a unique name for each icon */
+        var nameCache = {};
 
-

Stitches.Icon class

+

Icon

Wraps a single icon. Creates a new image from the source and sets additional properties after the image loads. @@ -23,29 +31,30 @@

@param {String} name
 @param {String} src
 @param {Function} cb Optional callback
+@constructor
 
-    Stitches.Icon = function (name, src, cb) {
-        var self = this;
-
-        this.guid = guid++;
-        this.name = Stitches.Icon.getName(name);
-
-        this.image = new Image();
-        this.image.onload = function () {
-            self.x = 0;
-            self.y = 0;
-            self.width = self.image.width + Stitches.settings.padding;
-            self.height = self.image.height + Stitches.settings.padding;
-            self.area = self.width * self.height;
-
-            if (cb) {
-                cb(self);
+        var Icon = function (name, src, cb) {
+            var self = this;
+
+            this.guid = guid++;
+            this.name = S.Icon.getName(name);
+
+            this.image = new Image();
+            this.image.onload = function () {
+                self.x = 0;
+                self.y = 0;
+                self.width = self.image.width + S.settings.padding;
+                self.height = self.image.height + S.settings.padding;
+                self.area = self.width * self.height;
+
+                if (cb) {
+                    cb(self);
+                }
             }
-        }
-        this.image.src = src;
-    };
+            this.image.src = src;
+        };
 
-

Stitches.Icon.getName

+

Icon.getName

Return a unique name. If the name is already in the nameCache, append a value until a unique name is found.

@@ -53,36 +62,40 @@
@param {String} name
 @return {String}
 
-    Stitches.Icon.getName = function (name) {
-        var i = 1, fix;
+        Icon.getName = function (name) {
+            var i = 1, fix;
 
-        name = name.replace(/[\s.]+/gi, "-").replace(/[^a-z0-9\-]/gi, "_");
+            name = name.replace(/[\s.]+/gi, "-").replace(/[^a-z0-9\-]/gi, "_");
 
-        if (nameCache[name]) {
-            do {
-                fix = name + "-" + i++;
-            } while (nameCache[fix]);
-            name = fix;
-        }
+            if (nameCache[name]) {
+                do {
+                    fix = name + "-" + i++;
+                } while (nameCache[fix]);
+                name = fix;
+            }
 
-        nameCache[name] = true;
-        return name;
-    };
+            nameCache[name] = true;
+            return name;
+        };
 
-

Stitches.Icon.clearNameCache

+

Icon.clearNameCache

Clear the name cache. If a name is passed in, only clear that key

@param {String} name
 @return {String}
 
-    Stitches.Icon.clearNameCache = function (name) {
-        if (name) {
-            delete nameCache[name];
-        } else {
-            nameCache = {};
-        }
-    };
+        Icon.clearNameCache = function (name) {
+            if (name) {
+                delete nameCache[name];
+            } else {
+                nameCache = {};
+            }
+        };
+
+        /* return constructor */
+        return Icon;
+    })();
 
 })(window, Stitches);
 
diff --git a/docs/icons.html b/docs/icons.html
index d73bfec4..b3e3ef50 100644
--- a/docs/icons.html
+++ b/docs/icons.html
@@ -8,12 +8,17 @@
 
     "use strict";
 
-    var document = window.document;
-
 

Stitches.Icons namespace

Holds all methods for working with icons

     Stitches.Icons = (function () {
+
+        /* shortcut */
+        var S = window.Stitches;
+
+        /* shortcut */
+        var document = window.document;
+
         return {
 

idealCanvas

@@ -70,7 +75,7 @@ while (loose.length && i < 10) { $(loose).each(function (idx, icon) { if (!icon.isPlaced) { - icon.isPlaced = Stitches.Icons.placeIcon(icon, placed, canvas); + icon.isPlaced = S.Icons.placeIcon(icon, placed, canvas); } }); @@ -107,7 +112,7 @@ icon.x = x; icon.y = y; - var overlap = Stitches.Icons.isOverlapped(icon, placed); + var overlap = S.Icons.isOverlapped(icon, placed); if (!overlap) { return true; } diff --git a/docs/page.html b/docs/page.html index b8373cee..3d7c6b88 100644 --- a/docs/page.html +++ b/docs/page.html @@ -13,6 +13,10 @@

Holds all DOM interaction methods

     Stitches.Page = (function () {
 
+        /* shortcut */
+        var S = window.Stitches;
+
+        /* true when the widget has rendered */
         var rendered = false;
 
         return {
@@ -23,16 +27,16 @@
 
@return {jqXHR}
 
             fetchTemplates: function () {
-                return $.get(Stitches.settings.jsdir + "/stitches.html", function (html) {
+                return $.get(S.settings.jsdir + "/stitches.html", function (html) {
                     $("body").append(html);
 
-                    Stitches.Page.templates = {
-                        stitches: Stitches.tmpl("stitches_tmpl"),
-                        icon:     Stitches.tmpl("stitches_icon_tmpl")
+                    S.Page.templates = {
+                        stitches: S.tmpl("stitches_tmpl"),
+                        icon:     S.tmpl("stitches_icon_tmpl")
                     };
 
                     /* notify */
-                    Stitches.pub("page.templates.done");
+                    S.pub("page.templates.done");
                 });
             },
 
@@ -40,37 +44,37 @@
 
 

Creates the stitches widget and content

             render: function () {
-                var $div = $(Stitches.Page.templates.stitches({}));
-                $div.appendTo(Stitches.Page.$elem);
+                var $div = $(S.Page.templates.stitches({}));
+                $div.appendTo(S.Page.$elem);
 
 

set dom element references

-                Stitches.Page.$stitches = $(".stitches", Stitches.Page.$elem);
-                Stitches.Page.$drawer = $(".drawer", Stitches.Page.$elem);
-                Stitches.Page.$dropbox = $(".dropbox", Stitches.Page.$elem);
-                Stitches.Page.$droplabel = $(".droplabel", Stitches.Page.$elem);
-                Stitches.Page.$filelist = $(".filelist", Stitches.Page.$elem);
-                Stitches.Page.$buttons = $(".buttons", Stitches.Page.$elem);
-                Stitches.Page.buttons = {
-                    $generate:   $("a.generate", Stitches.Page.$buttons),
-                    $clear:      $("a.clear", Stitches.Page.$buttons),
-                    $sprite:     $("a.dlsprite", Stitches.Page.$buttons),
-                    $stylesheet: $("a.dlstylesheet", Stitches.Page.$buttons)
+                S.Page.$stitches = $(".stitches", S.Page.$elem);
+                S.Page.$drawer = $(".drawer", S.Page.$elem);
+                S.Page.$dropbox = $(".dropbox", S.Page.$elem);
+                S.Page.$droplabel = $(".droplabel", S.Page.$elem);
+                S.Page.$filelist = $(".filelist", S.Page.$elem);
+                S.Page.$buttons = $(".buttons", S.Page.$elem);
+                S.Page.buttons = {
+                    $generate:   $("a.generate", S.Page.$buttons),
+                    $clear:      $("a.clear", S.Page.$buttons),
+                    $sprite:     $("a.dlsprite", S.Page.$buttons),
+                    $stylesheet: $("a.dlstylesheet", S.Page.$buttons)
                 };
 
 

set options

-                Stitches.Page.$options = $(".options", Stitches.Page.$elem);
-                Stitches.Page.inputs = {
-                    $prefix:     $("input[name=prefix]", Stitches.Page.$options),
-                    $padding:    $("input[name=padding]", Stitches.Page.$options),
-                    $dataURI:    $("input[name=dataURI]", Stitches.Page.$options)
+                S.Page.$options = $(".options", S.Page.$elem);
+                S.Page.inputs = {
+                    $prefix:     $("input[name=prefix]", S.Page.$options),
+                    $padding:    $("input[name=padding]", S.Page.$options),
+                    $dataURI:    $("input[name=dataURI]", S.Page.$options)
                 };
-                Stitches.Page.inputs.$prefix.val(Stitches.settings.prefix);
-                Stitches.Page.inputs.$padding.val(Stitches.settings.padding);
-                Stitches.Page.inputs.$dataURI.filter("[value=" + Stitches.settings.dataURI + "]").attr("checked", true);
+                S.Page.inputs.$prefix.val(S.settings.prefix);
+                S.Page.inputs.$padding.val(S.settings.padding);
+                S.Page.inputs.$dataURI.filter("[value=" + S.settings.dataURI + "]").attr("checked", true);
 
                 /* notify */
                 rendered = true;
-                Stitches.pub("page.render.done");
+                S.pub("page.render.done");
             },
 
 

errorHandler

@@ -78,7 +82,7 @@

Handles all error messages

             errorHandler: function (e) {
                 if (rendered) {
-                    Stitches.Page.$droplabel.html("&times; " + e.message).addClass("error");
+                    S.Page.$droplabel.html("&times; " + e.message).addClass("error");
                 }
                 throw e;
             },
@@ -87,12 +91,12 @@
 
 

Handles all subscriptions

             subscribe: function () {
-                var buttons = Stitches.Page.buttons;
-                var $droplabel = Stitches.Page.$droplabel;
+                var buttons = S.Page.buttons;
+                var $droplabel = S.Page.$droplabel;
 
                 /* handle drop label and buttons on queue length changes */
-                Stitches.sub("file.icon.done", function (icon) {
-                    if (Stitches.iconQueue.length === 1) {
+                S.sub("file.icon.done", function (icon) {
+                    if (S.iconQueue.length === 1) {
                         $droplabel.fadeOut("fast");
                         buttons.$generate.removeClass("disabled");
                         buttons.$clear.removeClass("disabled");
@@ -100,8 +104,8 @@
                     buttons.$sprite.addClass("disabled");
                     buttons.$stylesheet.addClass("disabled");
                 });
-                Stitches.sub("file.remove.done", function (icon) {
-                    if (Stitches.iconQueue.length < 1) {
+                S.sub("file.remove.done", function (icon) {
+                    if (S.iconQueue.length < 1) {
                         $droplabel.fadeIn("fast");
                         buttons.$generate.addClass("disabled");
                         buttons.$clear.addClass("disabled");
@@ -111,7 +115,7 @@
                 });
 
                 /* handle sprite and stylesheet generation */
-                Stitches.sub("sprite.generate.done", function (sprite, stylesheet) {
+                S.sub("sprite.generate.done", function (sprite, stylesheet) {
                     buttons.$sprite.attr("href", sprite).removeClass("disabled");
                     buttons.$stylesheet.attr("href", stylesheet).removeClass("disabled");
                 });
@@ -127,34 +131,34 @@
 
 

Bind all of the event listeners for drag and drop

             bindDragAndDrop: function () {
-                var dropbox = Stitches.Page.$dropbox.get(0);
-                dropbox.addEventListener("dragenter", Stitches.Page._dragStart, false);
-                dropbox.addEventListener("dragleave", Stitches.Page._dragStop, false);
-                dropbox.addEventListener("dragexit",  Stitches.Page._dragStop, false);
-                dropbox.addEventListener("dragover",  Stitches.Page._noop, false);
-                dropbox.addEventListener("drop",      Stitches.Page._drop, false);
+                var dropbox = S.Page.$dropbox.get(0);
+                dropbox.addEventListener("dragenter", S.Page._dragStart, false);
+                dropbox.addEventListener("dragleave", S.Page._dragStop, false);
+                dropbox.addEventListener("dragexit",  S.Page._dragStop, false);
+                dropbox.addEventListener("dragover",  S.Page._noop, false);
+                dropbox.addEventListener("drop",      S.Page._drop, false);
             },
 
 

Private drag and drop methods

             _dragStart: function (e) {
-                Stitches.Page.$dropbox.addClass("dropping");
+                S.Page.$dropbox.addClass("dropping");
             },
 
             _dragStop: function (e) {
                 if ($(e.target).parents(".dropbox").length === 0) {
-                    Stitches.Page.$dropbox.removeClass("dropping");
+                    S.Page.$dropbox.removeClass("dropping");
                 }
             },
 
             _drop: function (e) {
                 e.stopPropagation();
                 e.preventDefault();
-                Stitches.Page.$dropbox.removeClass("dropping");
+                S.Page.$dropbox.removeClass("dropping");
 
                 var evt = e || window.event;
                 var files = (evt.files || evt.dataTransfer.files);
                 if (files.length > 0) {
-                    Stitches.pub("page.drop.done", files);
+                    S.pub("page.drop.done", files);
                 }
             },
 
@@ -162,21 +166,21 @@
 
 

Bind all of the event listeners for buttons

             bindButtons: function () {
-                var $elem = Stitches.Page.$elem;
-                $elem.delegate("a.disabled", "click", Stitches.Page._noop);
-                $elem.delegate("a.generate", "click", Stitches.Page._generate);
-                $elem.delegate("a.remove", "click",   Stitches.Page._removeFile);
-                $elem.delegate("a.clear", "click",    Stitches.Page._removeAllFiles);
+                var $elem = S.Page.$elem;
+                $elem.delegate("a.disabled", "click", S.Page._noop);
+                $elem.delegate("a.generate", "click", S.Page._generate);
+                $elem.delegate("a.remove", "click",   S.Page._removeFile);
+                $elem.delegate("a.clear", "click",    S.Page._removeAllFiles);
             },
 
 

bindCabinet

Bind all of the event listeners for the cabinet

             bindCabinet: function () {
-                var $elem = Stitches.Page.$elem;
-                var $stitches = Stitches.Page.$stitches;
-                var $options = Stitches.Page.$options;
-                var $drawer = Stitches.Page.$drawer;
+                var $elem = S.Page.$elem;
+                var $stitches = S.Page.$stitches;
+                var $options = S.Page.$options;
+                var $drawer = S.Page.$drawer;
                 var $cabinet = $("form.cabinet", $drawer);
                 var $input = $("input.files", $drawer);
 
@@ -190,7 +194,7 @@
 

on change event, use the drop event to handle files

                 $input.bind("change", function () {
                     if (this.files.length) {
-                        Stitches.pub("page.drop.done", this.files);
+                        S.pub("page.drop.done", this.files);
                     }
                     $cabinet.trigger("reset");
                 });
@@ -205,8 +209,8 @@
 
 

Bind all of the event listeners for the options panel

             bindOptions: function () {
-                var $options = Stitches.Page.$options;
-                var buttons = Stitches.Page.buttons;
+                var $options = S.Page.$options;
+                var buttons = S.Page.buttons;
 
                 $options.delegate("a.close-options", "click", function () {
                     $options.fadeOut();
@@ -218,34 +222,34 @@
                 });
 
                 $options.delegate("input[name=prefix]", "change", function () {
-                    Stitches.settings.prefix = Stitches.Page.inputs.$prefix.val();
+                    S.settings.prefix = S.Page.inputs.$prefix.val();
                 });
 
                 $options.delegate("input[name=padding]", "change", function () {
-                    var padding = Stitches.Page.inputs.$padding.val();
-                    Stitches.settings.padding = +padding;
-                    Stitches.Page.updateIconDimensions();
+                    var padding = S.Page.inputs.$padding.val();
+                    S.settings.padding = +padding;
+                    S.Page.updateIconDimensions();
                 });
 
                 $options.delegate("input[name=dataURI]", "change", function () {
-                    var dataURI = Stitches.Page.inputs.$dataURI.filter(":checked").val();
-                    Stitches.settings.dataURI = dataURI === "true" ? true : false;
+                    var dataURI = S.Page.inputs.$dataURI.filter(":checked").val();
+                    S.settings.dataURI = dataURI === "true" ? true : false;
                 });
             },
 
 

Private button methods

             _generate: function (e) {
                 /* [].concat to copy array */
-                Stitches.pub("sprite.generate", [].concat(Stitches.iconQueue));
+                S.pub("sprite.generate", [].concat(S.iconQueue));
             },
 
             _removeFile: function (e) {
                 var icon = $(this).parent("li").data("icon");
-                Stitches.pub("file.unqueue", icon);
+                S.pub("file.unqueue", icon);
             },
 
             _removeAllFiles: function (e) {
-                Stitches.pub("file.unqueue.all");
+                S.pub("file.unqueue.all");
             },
 
 

addIcon

@@ -253,9 +257,9 @@

Add an icon to the file list @param {Icon} icon

             addIcon: function (icon) {
-                $(Stitches.Page.templates.icon(icon))
+                $(S.Page.templates.icon(icon))
                     .data("icon", icon)
-                    .appendTo(Stitches.Page.$filelist)
+                    .appendTo(S.Page.$filelist)
                     .fadeIn("fast");
             },
 
@@ -264,7 +268,7 @@
 

Remove an icon from the file list @param {Icon} icon

             removeIcon: function (icon) {
-                Stitches.Page.$filelist.find("li")
+                S.Page.$filelist.find("li")
                     .filter(function () {
                         return $(this).data("icon") === icon;
                     })
@@ -276,9 +280,9 @@
 
 

Update icon dimensions after changing padding setting

             updateIconDimensions: function () {
-                var padding = Stitches.settings.padding;
+                var padding = S.settings.padding;
 
-                $.each(Stitches.iconQueue, function (i, icon) {
+                $.each(S.iconQueue, function (i, icon) {
                     icon.width = icon.image.width + padding;
                     icon.height = icon.image.height + padding;
                 });
diff --git a/docs/stitches.html b/docs/stitches.html
index 465670af..5df91f13 100644
--- a/docs/stitches.html
+++ b/docs/stitches.html
@@ -11,8 +11,9 @@
 

Stitches namespace

Holds all methods

-    window.Stitches = (function () {
-

Some configuration defaults

+    var S = window.Stitches = (function () {
+
+        /* Some configuration defaults */
         var defaults = {
             "jsdir": "js",
             "prefix": "sprite",
@@ -20,11 +21,11 @@
             "dataURI": false
         };
 
-        return {
-

Pub/sub subscription manager

-            _topics: {},
+        /* Pub/sub subscription manager */
+        var _topics = {};
 
-

init

+ return { +

init

Readies everything for user interaction.

@@ -32,33 +33,33 @@ @param {Object} config An optional settings object
             init: function ($elem, config) {
-                Stitches.settings = $.extend({}, defaults, config);
-                Stitches.iconQueue = [];
-                Stitches.Page.$elem = $elem;
+                S.settings = $.extend({}, defaults, config);
+                S.iconQueue = [];
+                S.Page.$elem = $elem;
 
                 /* setup subscriptions */
-                Stitches.sub("page.error",          Stitches.Page.errorHandler);
-                Stitches.sub("page.init.done",      Stitches.Page.fetchTemplates);
-                Stitches.sub("page.templates.done", Stitches.Page.render);
-                Stitches.sub("page.render.done",    Stitches.checkAPIs);
-                Stitches.sub("page.apis.done",      Stitches.Page.bindDragAndDrop);
-                Stitches.sub("page.apis.done",      Stitches.Page.bindButtons);
-                Stitches.sub("page.apis.done",      Stitches.Page.bindCabinet);
-                Stitches.sub("page.apis.done",      Stitches.Page.bindOptions);
-                Stitches.sub("page.apis.done",      Stitches.Page.subscribe);
-                Stitches.sub("page.drop.done",      Stitches.File.queueFiles);
-                Stitches.sub("file.queue.done",     Stitches.File.queueIcons);
-                Stitches.sub("file.icon.done",      Stitches.Page.addIcon);
-                Stitches.sub("file.remove.done",    Stitches.Page.removeIcon);
-                Stitches.sub("file.unqueue",        Stitches.File.unqueueIcon);
-                Stitches.sub("file.unqueue.all",    Stitches.File.unqueueAllIcons);
-                Stitches.sub("sprite.generate",     Stitches.generateStitches);
+                S.sub("page.error",          S.Page.errorHandler);
+                S.sub("page.init.done",      S.Page.fetchTemplates);
+                S.sub("page.templates.done", S.Page.render);
+                S.sub("page.render.done",    S.checkAPIs);
+                S.sub("page.apis.done",      S.Page.bindDragAndDrop);
+                S.sub("page.apis.done",      S.Page.bindButtons);
+                S.sub("page.apis.done",      S.Page.bindCabinet);
+                S.sub("page.apis.done",      S.Page.bindOptions);
+                S.sub("page.apis.done",      S.Page.subscribe);
+                S.sub("page.drop.done",      S.File.queueFiles);
+                S.sub("file.queue.done",     S.File.queueIcons);
+                S.sub("file.icon.done",      S.Page.addIcon);
+                S.sub("file.remove.done",    S.Page.removeIcon);
+                S.sub("file.unqueue",        S.File.unqueueIcon);
+                S.sub("file.unqueue.all",    S.File.unqueueAllIcons);
+                S.sub("sprite.generate",     S.generateStitches);
 
                 /* notify */
-                Stitches.pub("page.init.done");
+                S.pub("page.init.done");
             },
 
-

sub

+

sub

Subscribe to a topic

@@ -66,14 +67,14 @@ @param {Function} fn A callback to fire
             sub: function (topic, fn) {
-                var callbacks = Stitches._topics[topic] ||  $.Callbacks("stopOnFalse");
+                var callbacks = _topics[topic] ||  $.Callbacks("stopOnFalse");
                 if (fn) {
                     callbacks.add(fn);
                 }
-                Stitches._topics[topic] = callbacks;
+                _topics[topic] = callbacks;
             },
 
-

unsub

+

unsub

Unsubscribe from a topic

@@ -81,27 +82,27 @@ @param {Function} fn A callback to remove
             unsub: function (topic, fn) {
-                var callbacks = Stitches._topics[topic];
+                var callbacks = _topics[topic];
                 if (callbacks) {
                     callbacks.remove(fn);
                 }
             },
 
-

pub

+

pub

Publish a topic

@param {String} topic The subscription topic name
 
             pub: function (topic) {
-                var callbacks = Stitches._topics[topic],
+                var callbacks = _topics[topic],
                     args = Array.prototype.slice.call(arguments, 1);
                 if (callbacks) {
                     callbacks.fire.apply(callbacks, args);
                 }
             },
 
-

checkAPIs

+

checkAPIs

Load supporting libraries for browsers with no native support. Uses Modernizr to check for drag-and-drop, FileReader, and canvas @@ -110,23 +111,23 @@ Modernizr.load([ { test: typeof FileReader !== "undefined" && Modernizr.draganddrop, - nope: Stitches.settings.jsdir + "/dropfile/dropfile.js" + nope: S.settings.jsdir + "/dropfile/dropfile.js" }, { test: Modernizr.canvas, - nope: Stitches.settings.jsdir + "/flashcanvas/flashcanvas.js", + nope: S.settings.jsdir + "/flashcanvas/flashcanvas.js", complete: function () { if (typeof FileReader !== "undefined" && Modernizr.draganddrop && Modernizr.canvas) { - Stitches.pub("page.apis.done"); + S.pub("page.apis.done"); } else { - Stitches.pub("page.error", new Error("Required APIs are not present.")); + S.pub("page.error", new Error("Required APIs are not present.")); } } } ]); }, -

generateStitches

+

generateStitches

Positions all of the icons from the $filelist on the canvas; crate the sprite link and the stylesheet link; @@ -135,15 +136,15 @@

@param {[Icon]} looseIcons An Icon array of images to place
 
             generateStitches: function (looseIcons) {
-                var placedIcons = Stitches.positionImages(looseIcons);
-                var sprite = Stitches.makeStitches(placedIcons);
-                var stylesheet = Stitches.makeStylesheet(placedIcons, sprite);
+                var placedIcons = S.positionImages(looseIcons);
+                var sprite = S.makeStitches(placedIcons);
+                var stylesheet = S.makeStylesheet(placedIcons, sprite);
 
                 /* notify */
-                Stitches.pub("sprite.generate.done", sprite, stylesheet);
+                S.pub("sprite.generate.done", sprite, stylesheet);
             },
 
-

positionImages

+

positionImages

Position all of the images in the looseIcons array within the canvas

@@ -169,20 +170,20 @@ }); /* find the ideal sprite for this set of icons */ - Stitches.canvas = Stitches.Icons.idealCanvas(looseIcons); + S.canvas = S.Icons.idealCanvas(looseIcons); /* try to place all of the icons on the ideal canvas */ - Stitches.Icons.placeIcons(looseIcons, placedIcons, Stitches.canvas); + S.Icons.placeIcons(looseIcons, placedIcons, S.canvas); /* trim empty edges */ - Stitches.Icons.cropCanvas(placedIcons, Stitches.canvas); + S.Icons.cropCanvas(placedIcons, S.canvas); /* notify and return */ - Stitches.pub("sprite.position.done", placedIcons); + S.pub("sprite.position.done", placedIcons); return placedIcons; }, -

makeStitches

+

makeStitches

Draw images on canvas

@@ -196,23 +197,23 @@ domain blocking in browses for access to write image data to the canvas */ try { - context = Stitches.canvas.getContext('2d'); + context = S.canvas.getContext('2d'); $(placedIcons).each(function (idx, icon) { context.drawImage(icon.image, icon.x, icon.y); }); /* create image link */ - data = Stitches.canvas.toDataURL(); + data = S.canvas.toDataURL(); } catch (e) { - Stitches.pub("page.error", e); + S.pub("page.error", e); } /* notify and return */ - Stitches.pub("sprite.image.done", data); + S.pub("sprite.image.done", data); return data; }, -

makeStylesheet

+

makeStylesheet

Create stylesheet text

@@ -226,10 +227,10 @@ return a.name < b.name ? -1 : 1; }); - var prefix = Stitches.settings.prefix; + var prefix = S.settings.prefix; var backgroundImage - if (Stitches.settings.dataURI) { + if (S.settings.dataURI) { backgroundImage = sprite; } else { backgroundImage = "download.png"; @@ -255,7 +256,7 @@ var data = "data:," + encodeURIComponent(css.join("\n")); /* notify and return */ - Stitches.pub("sprite.stylesheet.done", data); + S.pub("sprite.stylesheet.done", data); return data; } }; diff --git a/src/file.js b/src/file.js index 71f07281..62776270 100644 --- a/src/file.js +++ b/src/file.js @@ -15,6 +15,9 @@ // Holds all File procesing methods Stitches.File = (function () { + /* shortcut */ + var S = window.Stitches; + /* track files to read */ var readQueue = []; @@ -28,7 +31,7 @@ $.each(files, function (i, file) { if (/jpeg|png|gif/.test(file.type)) { readQueue.push(file); - Stitches.pub("file.queue.done", file); + S.pub("file.queue.done", file); } }); }, @@ -46,15 +49,15 @@ reader = new FileReader(); reader.onloadend = function (e) { /* create an icon and add to the icon queue */ - var icon = new Stitches.Icon(file.name, e.target.result); - Stitches.iconQueue.push(icon); + var icon = new S.Icon(file.name, e.target.result); + S.iconQueue.push(icon); /* notify */ - Stitches.pub("file.icon.done", icon); + S.pub("file.icon.done", icon); }; reader.readAsDataURL(file); } catch (e) { - Stitches.pub("page.error", e); + S.pub("page.error", e); } } }, @@ -66,23 +69,23 @@ // @param {Icon} icon unqueueIcon: function (icon) { /* remove the icon from the queue */ - Stitches.iconQueue = $.grep(Stitches.iconQueue, function (item) { + S.iconQueue = $.grep(S.iconQueue, function (item) { return item !== icon; }); - Stitches.Icon.clearNameCache(icon.name); + S.Icon.clearNameCache(icon.name); /* notify */ - Stitches.pub("file.remove.done", icon); + S.pub("file.remove.done", icon); }, // ### unqueueAllIcons // // Clear all icons from the queue unqueueAllIcons: function () { - $.each(Stitches.iconQueue, function (i, icon) { - Stitches.File.unqueueIcon(icon); + $.each(S.iconQueue, function (i, icon) { + S.File.unqueueIcon(icon); }); - Stitches.Icon.clearNameCache(); + S.Icon.clearNameCache(); } }; })(); diff --git a/src/icon.js b/src/icon.js index 4d98e016..3085ccdc 100644 --- a/src/icon.js +++ b/src/icon.js @@ -10,77 +10,90 @@ "use strict"; - // **Maintain a unique id for each icon** - var guid = 0; + // ## Stitches.Icon namespace + // + // Constructs and manages icons + Stitches.Icon = (function () { - // **Maintains a unique name for each icon** - var nameCache = {}; + /* shortcut */ + var S = window.Stitches; - // ## Stitches.Icon class - // - // Wraps a single icon. Creates a new image from the source - // and sets additional properties after the image loads. - // The callback is generally used to handle queueuing - // - // @param {String} name - // @param {String} src - // @param {Function} cb Optional callback - Stitches.Icon = function (name, src, cb) { - var self = this; - - this.guid = guid++; - this.name = Stitches.Icon.getName(name); - - this.image = new Image(); - this.image.onload = function () { - self.x = 0; - self.y = 0; - self.width = self.image.width + Stitches.settings.padding; - self.height = self.image.height + Stitches.settings.padding; - self.area = self.width * self.height; - - if (cb) { - cb(self); + /* Maintain a unique id for each icon */ + var guid = 0; + + /* Maintains a unique name for each icon */ + var nameCache = {}; + + // ### Icon + // + // Wraps a single icon. Creates a new image from the source + // and sets additional properties after the image loads. + // The callback is generally used to handle queueuing + // + // @param {String} name + // @param {String} src + // @param {Function} cb Optional callback + // @constructor + var Icon = function (name, src, cb) { + var self = this; + + this.guid = guid++; + this.name = S.Icon.getName(name); + + this.image = new Image(); + this.image.onload = function () { + self.x = 0; + self.y = 0; + self.width = self.image.width + S.settings.padding; + self.height = self.image.height + S.settings.padding; + self.area = self.width * self.height; + + if (cb) { + cb(self); + } } - } - this.image.src = src; - }; + this.image.src = src; + }; - // ### Stitches.Icon.getName - // - // Return a unique name. If the name is already in the nameCache, - // append a value until a unique name is found. - // - // @param {String} name - // @return {String} - Stitches.Icon.getName = function (name) { - var i = 1, fix; + // ### Icon.getName + // + // Return a unique name. If the name is already in the nameCache, + // append a value until a unique name is found. + // + // @param {String} name + // @return {String} + Icon.getName = function (name) { + var i = 1, fix; - name = name.replace(/[\s.]+/gi, "-").replace(/[^a-z0-9\-]/gi, "_"); + name = name.replace(/[\s.]+/gi, "-").replace(/[^a-z0-9\-]/gi, "_"); - if (nameCache[name]) { - do { - fix = name + "-" + i++; - } while (nameCache[fix]); - name = fix; - } + if (nameCache[name]) { + do { + fix = name + "-" + i++; + } while (nameCache[fix]); + name = fix; + } - nameCache[name] = true; - return name; - }; + nameCache[name] = true; + return name; + }; - // ### Stitches.Icon.clearNameCache - // - // Clear the name cache. If a name is passed in, only clear that key - // - // @param {String} name - // @return {String} - Stitches.Icon.clearNameCache = function (name) { - if (name) { - delete nameCache[name]; - } else { - nameCache = {}; - } - }; + // ### Icon.clearNameCache + // + // Clear the name cache. If a name is passed in, only clear that key + // + // @param {String} name + // @return {String} + Icon.clearNameCache = function (name) { + if (name) { + delete nameCache[name]; + } else { + nameCache = {}; + } + }; + + /* return constructor */ + return Icon; + })(); })(window, Stitches); \ No newline at end of file diff --git a/src/icons.js b/src/icons.js index 51670372..1fffa867 100644 --- a/src/icons.js +++ b/src/icons.js @@ -10,12 +10,17 @@ "use strict"; - var document = window.document; - // ## Stitches.Icons namespace // // Holds all methods for working with icons Stitches.Icons = (function () { + + /* shortcut */ + var S = window.Stitches; + + /* shortcut */ + var document = window.document; + return { // ### idealCanvas // @@ -70,7 +75,7 @@ while (loose.length && i < 10) { $(loose).each(function (idx, icon) { if (!icon.isPlaced) { - icon.isPlaced = Stitches.Icons.placeIcon(icon, placed, canvas); + icon.isPlaced = S.Icons.placeIcon(icon, placed, canvas); } }); @@ -106,7 +111,7 @@ icon.x = x; icon.y = y; - var overlap = Stitches.Icons.isOverlapped(icon, placed); + var overlap = S.Icons.isOverlapped(icon, placed); if (!overlap) { return true; } diff --git a/src/page.js b/src/page.js index a395cdc9..0c01ba37 100644 --- a/src/page.js +++ b/src/page.js @@ -15,6 +15,10 @@ // Holds all DOM interaction methods Stitches.Page = (function () { + /* shortcut */ + var S = window.Stitches; + + /* true when the widget has rendered */ var rendered = false; return { @@ -24,16 +28,16 @@ // // @return {jqXHR} fetchTemplates: function () { - return $.get(Stitches.settings.jsdir + "/stitches.html", function (html) { + return $.get(S.settings.jsdir + "/stitches.html", function (html) { $("body").append(html); - Stitches.Page.templates = { - stitches: Stitches.tmpl("stitches_tmpl"), - icon: Stitches.tmpl("stitches_icon_tmpl") + S.Page.templates = { + stitches: S.tmpl("stitches_tmpl"), + icon: S.tmpl("stitches_icon_tmpl") }; /* notify */ - Stitches.pub("page.templates.done"); + S.pub("page.templates.done"); }); }, @@ -41,37 +45,37 @@ // // Creates the stitches widget and content render: function () { - var $div = $(Stitches.Page.templates.stitches({})); - $div.appendTo(Stitches.Page.$elem); + var $div = $(S.Page.templates.stitches({})); + $div.appendTo(S.Page.$elem); // set dom element references - Stitches.Page.$stitches = $(".stitches", Stitches.Page.$elem); - Stitches.Page.$drawer = $(".drawer", Stitches.Page.$elem); - Stitches.Page.$dropbox = $(".dropbox", Stitches.Page.$elem); - Stitches.Page.$droplabel = $(".droplabel", Stitches.Page.$elem); - Stitches.Page.$filelist = $(".filelist", Stitches.Page.$elem); - Stitches.Page.$buttons = $(".buttons", Stitches.Page.$elem); - Stitches.Page.buttons = { - $generate: $("a.generate", Stitches.Page.$buttons), - $clear: $("a.clear", Stitches.Page.$buttons), - $sprite: $("a.dlsprite", Stitches.Page.$buttons), - $stylesheet: $("a.dlstylesheet", Stitches.Page.$buttons) + S.Page.$stitches = $(".stitches", S.Page.$elem); + S.Page.$drawer = $(".drawer", S.Page.$elem); + S.Page.$dropbox = $(".dropbox", S.Page.$elem); + S.Page.$droplabel = $(".droplabel", S.Page.$elem); + S.Page.$filelist = $(".filelist", S.Page.$elem); + S.Page.$buttons = $(".buttons", S.Page.$elem); + S.Page.buttons = { + $generate: $("a.generate", S.Page.$buttons), + $clear: $("a.clear", S.Page.$buttons), + $sprite: $("a.dlsprite", S.Page.$buttons), + $stylesheet: $("a.dlstylesheet", S.Page.$buttons) }; // set options - Stitches.Page.$options = $(".options", Stitches.Page.$elem); - Stitches.Page.inputs = { - $prefix: $("input[name=prefix]", Stitches.Page.$options), - $padding: $("input[name=padding]", Stitches.Page.$options), - $dataURI: $("input[name=dataURI]", Stitches.Page.$options) + S.Page.$options = $(".options", S.Page.$elem); + S.Page.inputs = { + $prefix: $("input[name=prefix]", S.Page.$options), + $padding: $("input[name=padding]", S.Page.$options), + $dataURI: $("input[name=dataURI]", S.Page.$options) }; - Stitches.Page.inputs.$prefix.val(Stitches.settings.prefix); - Stitches.Page.inputs.$padding.val(Stitches.settings.padding); - Stitches.Page.inputs.$dataURI.filter("[value=" + Stitches.settings.dataURI + "]").attr("checked", true); + S.Page.inputs.$prefix.val(S.settings.prefix); + S.Page.inputs.$padding.val(S.settings.padding); + S.Page.inputs.$dataURI.filter("[value=" + S.settings.dataURI + "]").attr("checked", true); /* notify */ rendered = true; - Stitches.pub("page.render.done"); + S.pub("page.render.done"); }, // ## errorHandler @@ -79,7 +83,7 @@ // Handles all error messages errorHandler: function (e) { if (rendered) { - Stitches.Page.$droplabel.html("× " + e.message).addClass("error"); + S.Page.$droplabel.html("× " + e.message).addClass("error"); } throw e; }, @@ -88,12 +92,12 @@ // // Handles all subscriptions subscribe: function () { - var buttons = Stitches.Page.buttons; - var $droplabel = Stitches.Page.$droplabel; + var buttons = S.Page.buttons; + var $droplabel = S.Page.$droplabel; /* handle drop label and buttons on queue length changes */ - Stitches.sub("file.icon.done", function (icon) { - if (Stitches.iconQueue.length === 1) { + S.sub("file.icon.done", function (icon) { + if (S.iconQueue.length === 1) { $droplabel.fadeOut("fast"); buttons.$generate.removeClass("disabled"); buttons.$clear.removeClass("disabled"); @@ -101,8 +105,8 @@ buttons.$sprite.addClass("disabled"); buttons.$stylesheet.addClass("disabled"); }); - Stitches.sub("file.remove.done", function (icon) { - if (Stitches.iconQueue.length < 1) { + S.sub("file.remove.done", function (icon) { + if (S.iconQueue.length < 1) { $droplabel.fadeIn("fast"); buttons.$generate.addClass("disabled"); buttons.$clear.addClass("disabled"); @@ -112,7 +116,7 @@ }); /* handle sprite and stylesheet generation */ - Stitches.sub("sprite.generate.done", function (sprite, stylesheet) { + S.sub("sprite.generate.done", function (sprite, stylesheet) { buttons.$sprite.attr("href", sprite).removeClass("disabled"); buttons.$stylesheet.attr("href", stylesheet).removeClass("disabled"); }); @@ -128,34 +132,34 @@ // // Bind all of the event listeners for drag and drop bindDragAndDrop: function () { - var dropbox = Stitches.Page.$dropbox.get(0); - dropbox.addEventListener("dragenter", Stitches.Page._dragStart, false); - dropbox.addEventListener("dragleave", Stitches.Page._dragStop, false); - dropbox.addEventListener("dragexit", Stitches.Page._dragStop, false); - dropbox.addEventListener("dragover", Stitches.Page._noop, false); - dropbox.addEventListener("drop", Stitches.Page._drop, false); + var dropbox = S.Page.$dropbox.get(0); + dropbox.addEventListener("dragenter", S.Page._dragStart, false); + dropbox.addEventListener("dragleave", S.Page._dragStop, false); + dropbox.addEventListener("dragexit", S.Page._dragStop, false); + dropbox.addEventListener("dragover", S.Page._noop, false); + dropbox.addEventListener("drop", S.Page._drop, false); }, // #### *Private drag and drop methods* _dragStart: function (e) { - Stitches.Page.$dropbox.addClass("dropping"); + S.Page.$dropbox.addClass("dropping"); }, _dragStop: function (e) { if ($(e.target).parents(".dropbox").length === 0) { - Stitches.Page.$dropbox.removeClass("dropping"); + S.Page.$dropbox.removeClass("dropping"); } }, _drop: function (e) { e.stopPropagation(); e.preventDefault(); - Stitches.Page.$dropbox.removeClass("dropping"); + S.Page.$dropbox.removeClass("dropping"); var evt = e || window.event; var files = (evt.files || evt.dataTransfer.files); if (files.length > 0) { - Stitches.pub("page.drop.done", files); + S.pub("page.drop.done", files); } }, @@ -163,21 +167,21 @@ // // Bind all of the event listeners for buttons bindButtons: function () { - var $elem = Stitches.Page.$elem; - $elem.delegate("a.disabled", "click", Stitches.Page._noop); - $elem.delegate("a.generate", "click", Stitches.Page._generate); - $elem.delegate("a.remove", "click", Stitches.Page._removeFile); - $elem.delegate("a.clear", "click", Stitches.Page._removeAllFiles); + var $elem = S.Page.$elem; + $elem.delegate("a.disabled", "click", S.Page._noop); + $elem.delegate("a.generate", "click", S.Page._generate); + $elem.delegate("a.remove", "click", S.Page._removeFile); + $elem.delegate("a.clear", "click", S.Page._removeAllFiles); }, // ### bindCabinet // // Bind all of the event listeners for the cabinet bindCabinet: function () { - var $elem = Stitches.Page.$elem; - var $stitches = Stitches.Page.$stitches; - var $options = Stitches.Page.$options; - var $drawer = Stitches.Page.$drawer; + var $elem = S.Page.$elem; + var $stitches = S.Page.$stitches; + var $options = S.Page.$options; + var $drawer = S.Page.$drawer; var $cabinet = $("form.cabinet", $drawer); var $input = $("input.files", $drawer); @@ -191,7 +195,7 @@ // on change event, use the drop event to handle files $input.bind("change", function () { if (this.files.length) { - Stitches.pub("page.drop.done", this.files); + S.pub("page.drop.done", this.files); } $cabinet.trigger("reset"); }); @@ -206,8 +210,8 @@ // // Bind all of the event listeners for the options panel bindOptions: function () { - var $options = Stitches.Page.$options; - var buttons = Stitches.Page.buttons; + var $options = S.Page.$options; + var buttons = S.Page.buttons; $options.delegate("a.close-options", "click", function () { $options.fadeOut(); @@ -219,34 +223,34 @@ }); $options.delegate("input[name=prefix]", "change", function () { - Stitches.settings.prefix = Stitches.Page.inputs.$prefix.val(); + S.settings.prefix = S.Page.inputs.$prefix.val(); }); $options.delegate("input[name=padding]", "change", function () { - var padding = Stitches.Page.inputs.$padding.val(); - Stitches.settings.padding = +padding; - Stitches.Page.updateIconDimensions(); + var padding = S.Page.inputs.$padding.val(); + S.settings.padding = +padding; + S.Page.updateIconDimensions(); }); $options.delegate("input[name=dataURI]", "change", function () { - var dataURI = Stitches.Page.inputs.$dataURI.filter(":checked").val(); - Stitches.settings.dataURI = dataURI === "true" ? true : false; + var dataURI = S.Page.inputs.$dataURI.filter(":checked").val(); + S.settings.dataURI = dataURI === "true" ? true : false; }); }, // #### *Private button methods* _generate: function (e) { /* [].concat to copy array */ - Stitches.pub("sprite.generate", [].concat(Stitches.iconQueue)); + S.pub("sprite.generate", [].concat(S.iconQueue)); }, _removeFile: function (e) { var icon = $(this).parent("li").data("icon"); - Stitches.pub("file.unqueue", icon); + S.pub("file.unqueue", icon); }, _removeAllFiles: function (e) { - Stitches.pub("file.unqueue.all"); + S.pub("file.unqueue.all"); }, // ### addIcon @@ -254,9 +258,9 @@ // Add an icon to the file list // @param {Icon} icon addIcon: function (icon) { - $(Stitches.Page.templates.icon(icon)) + $(S.Page.templates.icon(icon)) .data("icon", icon) - .appendTo(Stitches.Page.$filelist) + .appendTo(S.Page.$filelist) .fadeIn("fast"); }, @@ -265,7 +269,7 @@ // Remove an icon from the file list // @param {Icon} icon removeIcon: function (icon) { - Stitches.Page.$filelist.find("li") + S.Page.$filelist.find("li") .filter(function () { return $(this).data("icon") === icon; }) @@ -277,9 +281,9 @@ // // Update icon dimensions after changing padding setting updateIconDimensions: function () { - var padding = Stitches.settings.padding; + var padding = S.settings.padding; - $.each(Stitches.iconQueue, function (i, icon) { + $.each(S.iconQueue, function (i, icon) { icon.width = icon.image.width + padding; icon.height = icon.image.height + padding; }); diff --git a/src/stitches.css b/src/stitches.css index 4b047ba3..c67c0391 100644 --- a/src/stitches.css +++ b/src/stitches.css @@ -84,7 +84,7 @@ display: block; width: 125px; height: 30px; - background: #03669A; /* blue 0486CC 05A8FF */ + background: #039a27; /* green 04CC33 05FF3F */ border-radius: 0 0 10px 0; padding: 0; margin: 0; @@ -96,12 +96,12 @@ text-decoration: none; } -.stitches .drawer .open:hover { - background: #0486CC; +.stitches .drawer .open-options:hover { + background: #04CC33; } -.stitches .drawer .open:active { - background: #05A8FF; +.stitches .drawer .open-options:active { + background: #05FF3F; } /* dropbox */ diff --git a/src/stitches.html b/src/stitches.html index b2870d5c..cc7fc12f 100644 --- a/src/stitches.html +++ b/src/stitches.html @@ -27,10 +27,10 @@

options

diff --git a/src/stitches.js b/src/stitches.js index ba127f7f..0d84a269 100644 --- a/src/stitches.js +++ b/src/stitches.js @@ -13,8 +13,9 @@ // ## Stitches namespace // // Holds all methods - window.Stitches = (function () { - // **Some configuration defaults** + var S = window.Stitches = (function () { + + /* Some configuration defaults */ var defaults = { "jsdir": "js", "prefix": "sprite", @@ -22,10 +23,10 @@ "dataURI": false }; - return { - // **Pub/sub subscription manager** - _topics: {}, + /* Pub/sub subscription manager */ + var _topics = {}; + return { // ### init // // Readies everything for user interaction. @@ -33,30 +34,30 @@ // @param {jQuery} $elem A wrapped DOM node // @param {Object} config An optional settings object init: function ($elem, config) { - Stitches.settings = $.extend({}, defaults, config); - Stitches.iconQueue = []; - Stitches.Page.$elem = $elem; + S.settings = $.extend({}, defaults, config); + S.iconQueue = []; + S.Page.$elem = $elem; /* setup subscriptions */ - Stitches.sub("page.error", Stitches.Page.errorHandler); - Stitches.sub("page.init.done", Stitches.Page.fetchTemplates); - Stitches.sub("page.templates.done", Stitches.Page.render); - Stitches.sub("page.render.done", Stitches.checkAPIs); - Stitches.sub("page.apis.done", Stitches.Page.bindDragAndDrop); - Stitches.sub("page.apis.done", Stitches.Page.bindButtons); - Stitches.sub("page.apis.done", Stitches.Page.bindCabinet); - Stitches.sub("page.apis.done", Stitches.Page.bindOptions); - Stitches.sub("page.apis.done", Stitches.Page.subscribe); - Stitches.sub("page.drop.done", Stitches.File.queueFiles); - Stitches.sub("file.queue.done", Stitches.File.queueIcons); - Stitches.sub("file.icon.done", Stitches.Page.addIcon); - Stitches.sub("file.remove.done", Stitches.Page.removeIcon); - Stitches.sub("file.unqueue", Stitches.File.unqueueIcon); - Stitches.sub("file.unqueue.all", Stitches.File.unqueueAllIcons); - Stitches.sub("sprite.generate", Stitches.generateStitches); + S.sub("page.error", S.Page.errorHandler); + S.sub("page.init.done", S.Page.fetchTemplates); + S.sub("page.templates.done", S.Page.render); + S.sub("page.render.done", S.checkAPIs); + S.sub("page.apis.done", S.Page.bindDragAndDrop); + S.sub("page.apis.done", S.Page.bindButtons); + S.sub("page.apis.done", S.Page.bindCabinet); + S.sub("page.apis.done", S.Page.bindOptions); + S.sub("page.apis.done", S.Page.subscribe); + S.sub("page.drop.done", S.File.queueFiles); + S.sub("file.queue.done", S.File.queueIcons); + S.sub("file.icon.done", S.Page.addIcon); + S.sub("file.remove.done", S.Page.removeIcon); + S.sub("file.unqueue", S.File.unqueueIcon); + S.sub("file.unqueue.all", S.File.unqueueAllIcons); + S.sub("sprite.generate", S.generateStitches); /* notify */ - Stitches.pub("page.init.done"); + S.pub("page.init.done"); }, // ### sub @@ -66,11 +67,11 @@ // @param {String} topic The subscription topic name // @param {Function} fn A callback to fire sub: function (topic, fn) { - var callbacks = Stitches._topics[topic] || $.Callbacks("stopOnFalse"); + var callbacks = _topics[topic] || $.Callbacks("stopOnFalse"); if (fn) { callbacks.add(fn); } - Stitches._topics[topic] = callbacks; + _topics[topic] = callbacks; }, // ### unsub @@ -80,7 +81,7 @@ // @param {String} topic The subscription topic name // @param {Function} fn A callback to remove unsub: function (topic, fn) { - var callbacks = Stitches._topics[topic]; + var callbacks = _topics[topic]; if (callbacks) { callbacks.remove(fn); } @@ -92,7 +93,7 @@ // // @param {String} topic The subscription topic name pub: function (topic) { - var callbacks = Stitches._topics[topic], + var callbacks = _topics[topic], args = Array.prototype.slice.call(arguments, 1); if (callbacks) { callbacks.fire.apply(callbacks, args); @@ -108,16 +109,16 @@ Modernizr.load([ { test: typeof FileReader !== "undefined" && Modernizr.draganddrop, - nope: Stitches.settings.jsdir + "/dropfile/dropfile.js" + nope: S.settings.jsdir + "/dropfile/dropfile.js" }, { test: Modernizr.canvas, - nope: Stitches.settings.jsdir + "/flashcanvas/flashcanvas.js", + nope: S.settings.jsdir + "/flashcanvas/flashcanvas.js", complete: function () { if (typeof FileReader !== "undefined" && Modernizr.draganddrop && Modernizr.canvas) { - Stitches.pub("page.apis.done"); + S.pub("page.apis.done"); } else { - Stitches.pub("page.error", new Error("Required APIs are not present.")); + S.pub("page.error", new Error("Required APIs are not present.")); } } } @@ -132,12 +133,12 @@ // // @param {[Icon]} looseIcons An Icon array of images to place generateStitches: function (looseIcons) { - var placedIcons = Stitches.positionImages(looseIcons); - var sprite = Stitches.makeStitches(placedIcons); - var stylesheet = Stitches.makeStylesheet(placedIcons, sprite); + var placedIcons = S.positionImages(looseIcons); + var sprite = S.makeStitches(placedIcons); + var stylesheet = S.makeStylesheet(placedIcons, sprite); /* notify */ - Stitches.pub("sprite.generate.done", sprite, stylesheet); + S.pub("sprite.generate.done", sprite, stylesheet); }, // ### positionImages @@ -165,16 +166,16 @@ }); /* find the ideal sprite for this set of icons */ - Stitches.canvas = Stitches.Icons.idealCanvas(looseIcons); + S.canvas = S.Icons.idealCanvas(looseIcons); /* try to place all of the icons on the ideal canvas */ - Stitches.Icons.placeIcons(looseIcons, placedIcons, Stitches.canvas); + S.Icons.placeIcons(looseIcons, placedIcons, S.canvas); /* trim empty edges */ - Stitches.Icons.cropCanvas(placedIcons, Stitches.canvas); + S.Icons.cropCanvas(placedIcons, S.canvas); /* notify and return */ - Stitches.pub("sprite.position.done", placedIcons); + S.pub("sprite.position.done", placedIcons); return placedIcons; }, @@ -191,19 +192,19 @@ domain blocking in browses for access to write image data to the canvas */ try { - context = Stitches.canvas.getContext('2d'); + context = S.canvas.getContext('2d'); $(placedIcons).each(function (idx, icon) { context.drawImage(icon.image, icon.x, icon.y); }); /* create image link */ - data = Stitches.canvas.toDataURL(); + data = S.canvas.toDataURL(); } catch (e) { - Stitches.pub("page.error", e); + S.pub("page.error", e); } /* notify and return */ - Stitches.pub("sprite.image.done", data); + S.pub("sprite.image.done", data); return data; }, @@ -220,10 +221,10 @@ return a.name < b.name ? -1 : 1; }); - var prefix = Stitches.settings.prefix; + var prefix = S.settings.prefix; var backgroundImage - if (Stitches.settings.dataURI) { + if (S.settings.dataURI) { backgroundImage = sprite; } else { backgroundImage = "download.png"; @@ -249,7 +250,7 @@ var data = "data:," + encodeURIComponent(css.join("\n")); /* notify and return */ - Stitches.pub("sprite.stylesheet.done", data); + S.pub("sprite.stylesheet.done", data); return data; } };