/* * Project: Chroma Gallery * Description: A Gallery that shows the colors of the pictures * Author: codecrafting.net * License:under the MIT license: http://www.opensource.org/licenses/mit-license.php * * Color Thief v2.0 * by Lokesh Dhakar - http://www.lokeshdhakar.com * * License * ------- * Creative Commons Attribution 2.5 License: * http://creativecommons.org/licenses/by/2.5/ * * Thanks * ------ * Nick Rabinowitz - For creating quantize.js. * John Schulz - For clean up and optimization. @JFSIII * Nathan Spady - For adding drag and drop support to the demo page. * * quantize.js Copyright 2008 Nick Rabinowitz. * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php * * Block below copied from Protovis: http://mbostock.github.com/protovis/ * Copyright 2010 Stanford Visualization Group * Licensed under the BSD License: http://www.opensource.org/licenses/bsd-license.php */ !function(t,e,i,n){function r(){for(var t,e=["transform","msTransform","webkitTransform","mozTransform","oTransform"],n=0;n"),setTimeout(function(){n.$el.find(".chrg-loadicon").remove()},100)),this._init()}function l(){this.colorThief=new u,this.settings=null,this.isOpen=!1,this.isFullscreen=!1,this.curItem=null,this.curGallery=null,this.init()}var h=function(t){this.canvas=i.createElement("canvas"),this.context=this.canvas.getContext("2d"),i.body.appendChild(this.canvas),this.width=this.canvas.width=t.width,this.height=this.canvas.height=t.height,this.context.drawImage(t,0,0,this.width,this.height)};h.prototype.clear=function(){this.context.clearRect(0,0,this.width,this.height)},h.prototype.update=function(t){this.context.putImageData(t,0,0)},h.prototype.getPixelCount=function(){return this.width*this.height},h.prototype.getImageData=function(){return this.context.getImageData(0,0,this.width,this.height)},h.prototype.removeCanvas=function(){this.canvas.parentNode.removeChild(this.canvas)};var u=function(){};if(u.prototype.getColor=function(t,e){var i=this.getPalette(t,5,e),n=i[0];return n},u.prototype.getPalette=function(t,e,i){"undefined"==typeof e&&(e=10),("undefined"==typeof i||1>i)&&(i=10);for(var n,r,s,o,c,a=new h(t),l=a.getImageData(),u=l.data,g=a.getPixelCount(),f=[],p=0;g>p;p+=i)n=4*p,r=u[n+0],s=u[n+1],o=u[n+2],c=u[n+3],c>=125&&(r>250&&s>250&&o>250||f.push([r,s,o]));var m=d.quantize(f,e),v=m?m.palette():null;return a.removeCanvas(),v},!g)var g={map:function(t,e){var i={};return e?t.map(function(t,n){return i.index=n,e.call(i,t)}):t.slice()},naturalOrder:function(t,e){return e>t?-1:t>e?1:0},sum:function(t,e){var i={};return t.reduce(e?function(t,n,r){return i.index=r,t+e.call(i,n)}:function(t,e){return t+e},0)},max:function(t,e){return Math.max.apply(null,e?g.map(t,e):t)}};var d=function(){function t(t,e,i){return(t<<2*a)+(e<>l,r=e[1]>>l,s=e[2]>>l,i=t(n,r,s),c[i]=(c[i]||0)+1}),c}function s(t,e){var n,r,s,o=1e6,c=0,a=1e6,h=0,u=1e6,g=0;return t.forEach(function(t){n=t[0]>>l,r=t[1]>>l,s=t[2]>>l,o>n?o=n:n>c&&(c=n),a>r?a=r:r>h&&(h=r),u>s?u=s:s>g&&(g=s)}),new i(o,c,a,h,u,g,e)}function o(e,i){function n(t){var e,n,r,s,o,c=t+"1",l=t+"2",h=0;for(a=i[c];a<=i[l];a++)if(p[a]>f/2){for(r=i.copy(),s=i.copy(),e=a-i[c],n=i[l]-a,o=n>=e?Math.min(i[l]-1,~~(a+n/2)):Math.max(i[c],~~(a-1-e/2));!p[o];)o++;for(h=m[o];!h&&p[o-1];)h=m[--o];return r[l]=o,s[c]=r[l]+1,[r,s]}}if(i.count()){var r=i.r2-i.r1+1,s=i.g2-i.g1+1,o=i.b2-i.b1+1,c=g.max([r,s,o]);if(1==i.count())return[i.copy()];var a,l,h,u,d,f=0,p=[],m=[];if(c==r)for(a=i.r1;a<=i.r2;a++){for(u=0,l=i.g1;l<=i.g2;l++)for(h=i.b1;h<=i.b2;h++)d=t(a,l,h),u+=e[d]||0;f+=u,p[a]=f}else if(c==s)for(a=i.g1;a<=i.g2;a++){for(u=0,l=i.r1;l<=i.r2;l++)for(h=i.b1;h<=i.b2;h++)d=t(l,a,h),u+=e[d]||0;f+=u,p[a]=f}else for(a=i.b1;a<=i.b2;a++){for(u=0,l=i.r1;l<=i.r2;l++)for(h=i.g1;h<=i.g2;h++)d=t(l,h,a),u+=e[d]||0;f+=u,p[a]=f}return p.forEach(function(t,e){m[e]=f-t}),n(c==r?"r":c==s?"g":"b")}}function c(t,i){function c(t,e){for(var i,n=1,r=0;h>r;)if(i=t.pop(),i.count()){var s=o(a,i),c=s[0],l=s[1];if(!c)return;if(t.push(c),l&&(t.push(l),n++),n>=e)return;if(r++>h)return}else t.push(i),r++}if(!t.length||2>i||i>256)return!1;var a=r(t),l=0;a.forEach(function(){l++});var d=s(t,a),f=new e(function(t,e){return g.naturalOrder(t.count(),e.count())});f.push(d),c(f,u*i);for(var p=new e(function(t,e){return g.naturalOrder(t.count()*t.volume(),e.count()*e.volume())});f.size();)p.push(f.pop());c(p,i-p.size());for(var m=new n;p.size();)m.push(p.pop());return m}var a=5,l=8-a,h=1e3,u=.75;return i.prototype={volume:function(t){var e=this;return(!e._volume||t)&&(e._volume=(e.r2-e.r1+1)*(e.g2-e.g1+1)*(e.b2-e.b1+1)),e._volume},count:function(e){var i=this,n=i.histo;if(!i._count_set||e){var r,s,o,c=0;for(r=i.r1;r<=i.r2;r++)for(s=i.g1;s<=i.g2;s++)for(o=i.b1;o<=i.b2;o++)index=t(r,s,o),c+=n[index]||0;i._count=c,i._count_set=!0}return i._count},copy:function(){var t=this;return new i(t.r1,t.r2,t.g1,t.g2,t.b1,t.b2,t.histo)},avg:function(e){var i=this,n=i.histo;if(!i._avg||e){var r,s,o,c,l,h=0,u=1<<8-a,g=0,d=0,f=0;for(s=i.r1;s<=i.r2;s++)for(o=i.g1;o<=i.g2;o++)for(c=i.b1;c<=i.b2;c++)l=t(s,o,c),r=n[l]||0,h+=r,g+=r*(s+.5)*u,d+=r*(o+.5)*u,f+=r*(c+.5)*u;i._avg=h?[~~(g/h),~~(d/h),~~(f/h)]:[~~(u*(i.r1+i.r2+1)/2),~~(u*(i.g1+i.g2+1)/2),~~(u*(i.b1+i.b2+1)/2)]}return i._avg},contains:function(t){var e=this,i=t[0]>>l;return gval=t[1]>>l,bval=t[2]>>l,i>=e.r1&&i<=e.r2&&gval>=e.g1&&gval<=e.g2&&bval>=e.b1&&bval<=e.b2}},n.prototype={push:function(t){this.vboxes.push({vbox:t,color:t.avg()})},palette:function(){return this.vboxes.map(function(t){return t.color})},size:function(){return this.vboxes.size()},map:function(t){for(var e=this.vboxes,i=0;ii||void 0===e)&&(e=i,n=r.peek(s).color);return n},forcebw:function(){var t=this.vboxes;t.sort(function(t,e){return g.naturalOrder(g.sum(t.color),g.sum(e.color))});var e=t[0].color;e[0]<5&&e[1]<5&&e[2]<5&&(t[0].color=[0,0,0]);var i=t.length-1,n=t[i].color;n[0]>251&&n[1]>251&&n[2]>251&&(t[i].color=[255,255,255])}},{quantize:c}}(),f="chromaGallery",p=t(e),m=t("body"),v=350,y=null,b=r(),w=(e.location.protocol+"//"+e.location.host+e.location.pathname,{color:"chroma",maxColumns:4,items:null,dof:!1,screenOpacity:.98,lazyLoad:!0,gridMargin:7,fullscreen:!0,easing:"easeInOutQuart",onLoad:function(){},onOpen:function(){},onClose:function(){},onNext:function(){},onPrev:function(){},onFullscreen:function(){}}),x={next:39,prev:37,fullscreen:70,close:27};t.extend(a.prototype,{_init:function(){var e=this;this.$el.hasClass("chroma-gallery")||this.$el.addClass("chroma-gallery"),this.$el.show(),setTimeout(function(){var i=0;e._createGrid(),e._setEvents(),e.grid.find("img").imagesLoaded().always(function(){e.isLoaded=!0,e.$el.trigger("chrg.load")}).progress(function(r,s){var c=t(s.img),a=e.settings.lazyLoad?150*i:0;if(i++,s.isLoaded){var l=c.attr("alt")!==n?c.attr("alt").substring(0,144):"";c.parent().attr("data-isloaded","true"),c.parent().find("p").append(l),setTimeout(function(){c.parent().css({opacity:"1"}),e.grid.masonry("layout")},a)}else c.parent().find("p").append("
"+o(c.attr("src"))+" failed to load"),c.parent().attr("data-isloaded","false").css({cursor:"default"}),c.css({height:"200px",opacity:"0"}),setTimeout(function(){c.parent().css({opacity:"1"}),c.parent().find(".chrg-description").css({opacity:"1"}),e.grid.masonry("layout")},a)})},50)},_getColumnWidth:function(t){var e,i=this.$el.width();return e=400>=i?2:i/this.settings.maxColumns>=200?Math.min(this.settings.maxColumns,t):Math.floor(i/200),this.settings.gridMargin>0?100/e*((i-e*this.settings.gridMargin)/i):100/e},_createGrid:function(){var t=this;if(this.settings.items){var e=this._getColumnWidth(this.settings.items.length);this.$el.html("
"),this.grid=this.$el.find(".chrg-grid");for(var i=0;i"+this.settings.items[i].alt+"

")}else{var e=this._getColumnWidth(this.$el.find("img").length);this.$el.append("
"),this.grid=this.$el.find(".chrg-grid"),this.$el.find("img").wrap("
").parent().append("

"),this.grid.append(this.$el.find(".chrg-item"))}this.grid.masonry({itemSelector:".chrg-item",gutter:t.settings.gridMargin,percentPosition:!0})},_reloadGrid:function(){var t=this._getColumnWidth(this.grid.find(".chrg-item").length);this.grid.find(".chrg-item").css("width",t+"%"),this.grid.masonry("layout")},_setEvents:function(){var i=this;this.grid.find(".chrg-item").on("click",function(){i.openImg(t(this).index())}),this.$el.on("chrg.load",function(){i.settings.onLoad.call(i.$el)}),this.$el.on("chrg.openImg",function(){i.settings.onOpen.call(i.$el)}),this.$el.on("chrg.closeImg",function(){i.settings.onClose.call(i.$el)}),this.$el.on("chrg.next",function(){i.settings.onNext.call(i.$el)}),this.$el.on("chrg.prev",function(){i.settings.onPrev.call(i.$el)}),this.$el.on("chrg.fullscreen",function(){i.settings.onFullscreen.call(i.$el)}),p.resize(function(){i.isLoaded&&i._reloadGrid()}),e.addEventListener("orientationchange",function(){i.isLoaded&&i._reloadGrid()})},openImg:function(e){if(!y.isOpen&&this.isLoaded){var i=t(this.grid.find(".chrg-item").get(e));i.length>0&&i.data("isloaded")&&(y.curGallery=this.$el,y.curItem=i,y.settings={color:this.settings.color,dof:this.settings.dof,screenOpacity:this.settings.screenOpacity,fullscreen:this.settings.fullscreen,easing:this.settings.easing},y.openImg())}},closeImg:function(){y.isOpen&&y.closeImg()},goTo:function(e){if(y.isOpen&&!y.lock){var i=t(this.grid.find(".chrg-item").get(e));i.length>0&&i.data("isloaded")&&y.goTo(i)}},next:function(){y.isOpen&&!y.lock&&y.next()},prev:function(){y.isOpen&&!y.lock&&y.prev()}}),t.extend(l.prototype,{init:function(){m.append("
"),this.$screen=m.find(".chroma-screen"),this.$imgWrap=this.$screen.find(".chrg-imgwrap"),this.$fullscreenBtn=this.$screen.find(".chrg-fullscreen"),this.$loader=this.$screen.find(".chrg-loader"),this.$ui=this.$screen.find(".chrg-ui"),this.$bg=this.$screen.find(".chrg-bg"),this.lock=!1,this.setEvents()},setEvents:function(){var t=this;this.$screen.find(".chrgi-close").on("click",function(e){e.stopPropagation(),t.closeImg()}),this.$screen.find(".chrgi-next").on("click",function(e){e.stopPropagation(),t.next()}),this.$imgWrap.on("click",function(t){t.stopPropagation()}),this.$screen.find(".chrgi-previous").on("click",function(e){e.stopPropagation(),t.prev()}),p.resize(function(){t.isOpen&&t.resizeImgWrap()}),e.addEventListener("orientationchange",function(){t.isOpen&&t.resizeImgWrap()}),p.keydown(function(e){if(t.isOpen)switch(e.keyCode){case x.next:t.next();break;case x.prev:t.prev();break;case x.close:t.closeImg()}}),Modernizr.touchevents||this.$screen.find(".chrg-wrap").on("click",function(){t.closeImg()}),Modernizr.fullscreen&&this.$fullscreenBtn.on("click",function(e){e.stopPropagation(),t.toggleFullscreen()})},toggleFullscreen:function(){i.fullscreenElement||i.mozFullScreenElement||i.webkitFullscreenElement||i.msFullscreenElement?(this.isFullscreen=!1,this.$fullscreenBtn.removeClass("chrgi-minimize").addClass("chrgi-maximize"),i.exitFullscreen?i.exitFullscreen():i.msExitFullscreen?i.msExitFullscreen():i.mozCancelFullScreen?i.mozCancelFullScreen():i.webkitExitFullscreen&&i.webkitExitFullscreen()):(this.isFullscreen=!0,this.$fullscreenBtn.removeClass("chrgi-maximize").addClass("chrgi-minimize"),this.curGallery.trigger("chrg.fullscreen"),i.documentElement.requestFullscreen?i.documentElement.requestFullscreen():i.documentElement.msRequestFullscreen?i.documentElement.msRequestFullscreen():i.documentElement.mozRequestFullScreen?i.documentElement.mozRequestFullScreen():i.documentElement.webkitRequestFullscreen&&i.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT))},resizeImgWrap:function(){var t,e={w:this.curItem.width(),h:this.curItem.height()},i=Math.min(.92*p.width()/e.w,.92*p.height()/e.h),n={x:(p.width()-e.w*i)/2,y:(p.height()-e.h*i)/2};t={width:e.w*i,height:e.h*i},t[b+"transform"]=Modernizr.csstransforms3d?"translate3d("+n.x+"px,"+n.y+"px,0) scale(1)":"translate("+n.x+"px,"+n.y+"px) scale(1)",this.$imgWrap.css(t)},loadImg:function(t){var e=this,i=new Image;Modernizr.cssanimations&&this.$loader.show(),i.onload=function(){e.$imgWrap.append(this),Modernizr.cssanimations&&e.$loader.hide()},i.onerror=function(){e.$loader.hide()},i.src=t.data("largesrc")},getRGBColor:function(t){if("chroma"==this.settings.color){if(t.data("color")===n){var e,i=this.colorThief.getColor(t[0]);return e=i&&3==i.length?"rgb("+i[0]+","+i[1]+","+i[2]+")":"rgb(0,0,0)",t.attr("data-color",e),e}return t.data("color")}return this.settings.color},openImg:function(){if(!this.lock){this.lock=!0;var t,e,i=this,n=this.curItem.offset(),r=this.getRGBColor(this.curItem.find("img")),s={width:.92*p.width(),height:.92*p.height()},o=this.curItem.find("img").clone();this.$imgWrap.html(""),this.settings.fullscreen?this.$fullscreenBtn.show():this.$fullscreenBtn.hide(),t=Math.min(s.width/this.curItem.width(),s.height/this.curItem.height()),e={x:n.left-p.scrollLeft(),y:n.top-p.scrollTop(),width:this.curItem.width()*t,height:this.curItem.height()*t},this.$imgWrap.css({width:e.width,height:e.height}),Modernizr.csstransforms3d?this.$imgWrap.css(b+"transform","translate3d("+e.x+"px,"+e.y+"px,0) scale("+1/t+")"):this.$imgWrap.css(b+"transform","translate("+e.x+"px,"+e.y+"px) scale("+1/t+")"),this.settings.dof&&(m.wrapInner("
"),this.$screen.appendTo(m)),e.x=(p.width()-e.width)/2,e.y=(p.height()-e.height)/2,this.$imgWrap.addClass("chrg-animation chrg-easing-"+this.settings.easing),this.$imgWrap.append(o),this.$screen.show(),this.isOpen=!0,setTimeout(function(){i.curItem.css("visibility","hidden"),i.$ui.css("opacity",.01),i.$ui.css("opacity",1),i.$bg.css("opacity",.01),i.$bg.css({opacity:i.settings.screenOpacity,"background-color":r}),i.settings.dof&&m.find(".chrg-dof-body").addClass("chrg-dof-effect"),Modernizr.cssanimations&&i.$loader.show(),Modernizr.csstransforms3d?i.$imgWrap.css(b+"transform","translate3d("+e.x+"px,"+e.y+"px,0) scale(1)"):i.$imgWrap.css(b+"transform","translate("+e.x+"px,"+e.y+"px) scale(1)"),setTimeout(function(){i.lock=!1,i.curGallery.trigger("chrg.openImg"),i.loadImg(o)},v+50)},80)}},closeImg:function(){if(this.isOpen&&!this.lock){this.lock=!0;var t=this,e=this.curItem.width()/this.$imgWrap.width(),i=this.curItem.offset(),n={x:i.left-p.scrollLeft(),y:i.top-p.scrollTop()};this.$imgWrap.find("img:nth-child(2)").hide(),this.$ui.css("opacity",""),this.$bg.css("opacity",""),this.settings.dof&&m.find(".chrg-dof-body").contents().unwrap(),setTimeout(function(){Modernizr.csstransforms3d?t.$imgWrap.css(b+"transform","translate3d("+n.x+"px,"+n.y+"px,0) scale("+e+")"):t.$imgWrap.css(b+"transform","translate("+n.x+"px,"+n.y+"px) scale("+e+")"),setTimeout(function(){t.curItem.css("visibility",""),t.$imgWrap.attr("class","chrg-imgwrap"),t.curGallery.trigger("chrg.closeImg"),setTimeout(function(){t.curItem=null,t.$screen.hide(),Modernizr.fullscreen&&t.isFullscreen&&t.toggleFullscreen(),t.curGallery=null,t.isOpen=!1,t.lock=!1},50)},v+50)},50)}},next:function(){if(!this.lock){this.lock=!0;var t=this,e=this.curItem.index(),i=e+1==this.curGallery.find(".chrg-item").length?0:e+1,n=this.curGallery.find(".chrg-item:eq("+i+")");this.goTo(n),t.curGallery.trigger("chrg.next")}},swipeNext:function(){},prev:function(){if(!this.lock){this.lock=!0;var t=this,e=this.curItem.index(),i=0==e?this.curGallery.find(".chrg-item").length-1:e-1,n=this.curGallery.find(".chrg-item:eq("+i+")");this.goTo(n),t.curGallery.trigger("chrg.prev")}},swipePrev:function(){},goTo:function(t){var e,i,n,r=this,s=t.find("img").clone(),o=this.getRGBColor(t.find("img")),c={width:.92*p.width(),height:.92*p.height()};e=Math.min(c.width/t.width(),c.height/t.height()),i={width:t.width()*e,height:t.height()*e,x:(p.width()-t.width()*e)/2,y:(p.height()-t.height()*e)/2},n={width:i.width,height:i.height},n[b+"transform"]=Modernizr.csstransforms3d?"translate3d("+i.x+"px,"+i.y+"px,0) scale(1)":"translate("+i.x+"px,"+i.y+"px) scale(1)",this.$imgWrap.removeClass("chrg-animation"),r.curItem.css("visibility","visible"),r.$imgWrap.css(n),r.$imgWrap.html(""),r.$imgWrap.append(s),r.$bg.css({"background-color":o}),r.curItem=t,r.curItem.css("visibility","hidden"),r.loadImg(s),setTimeout(function(){r.$imgWrap.addClass("chrg-animation"),r.lock=!1},50)}}),t.fn[f]=function(e){var i=arguments;if(e===n||"object"==typeof e)return this.each(function(){t.data(this,"plugin_"+f)||t.data(this,"plugin_"+f,new a(this,e))});if("string"==typeof e&&"_"!==e[0]&&"init"!==e){var r;return this.each(function(){var n=t.data(this,"plugin_"+f);n instanceof a&&"function"==typeof n[e]&&(r=n[e].apply(n,Array.prototype.slice.call(i,1))),"destroy"===e&&t.data(this,"plugin_"+f,null)}),r!==n?r:this}}}(jQuery,window,document);