forked from repp/BalancedGallery
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjquery.balanced-gallery.min.js
1 lines (1 loc) · 8.2 KB
/
jquery.balanced-gallery.min.js
1
(function(l,E,L){function p(b,f){a=this;q.push(this);this.container=l(b);this.container[0].innerHTML='<div class="balanced-gallery-wrapper">'+this.container[0].innerHTML+"</div>";this.wrapper=l(this.container[0].children[0]);this.elements=[];for(var d=this.wrapper[0].children,c=0;c<d.length;c++){var h=d[c].querySelector("img");null===h&&(h=d[c]);this.elements.push({element:d[c],image:l(h)})}this.options=r(F,f);this.options.orientation=this.options.orientation.toLowerCase();this.options.autoResize&&(this.unadulteratedCSS={width:this.container[0].style.width},this.unadulteratedOptions=r(this.options),G());this.quickResize=!1;this.init();this.createGallery()}function r(){var b={},a;for(a in arguments){var d=arguments[a],c;for(c in d)d.hasOwnProperty(c)&&(b[c]=d[c])}return b}function G(){l(E).resize(function(){clearTimeout(u);u=setTimeout(function(){for(var b=0;b<q.length;b++)q[b].options.autoResize&&(a=q[b],q[b].recreate())},500)})}function z(){var b=a.options.padding,f=a.options.gridAspectRatio,d=parseInt(a.options.idealWidth-b,10),c=1/f*d,h=parseInt(a.options.viewportWidth%a.options.widthDivisor/2,10);0<h&&a.wrapper.css({paddingLeft:h+b+"px",width:a.options.viewportWidth-h+"px"});for(h=0;h<a.elements.length;h++){var e=a.elements[h].image,g=n(e);if(g>=f){var k=(d-c*g)/2;e.css({left:k+"px",position:"absolute",maxWidth:"none",height:c+"px",width:c*g+"px"})}else g<f&&(k=(c-1/g*d)/2,e.css({top:k+"px",position:"absolute",maxWidth:"none",width:d,height:1/g*d+"px"}));a.quickResize?(e=e[0].parentNode,e.style.width=d+"px",e.style.height=c+"px"):(g=document.createElement("div"),e[0].parentNode.insertBefore(g,e[0]),g.appendChild(e[0]),l(e[0].parentNode).css({position:"relative","float":"left",overflow:"hidden",width:d+"px",height:c+"px",margin:0,marginRight:b+"px",marginBottom:b+"px"}))}}function H(){return a.elements.map(function(b,a,d){return{element:b.element,image:b.image,weight:n(b.image)}})}function I(){return a.elements.map(function(b,a,d){return{element:b.element,image:b.image,weight:1/n(b.image)}})}function n(b){return b[0].naturalWidth/b[0].naturalHeight}function A(b,f){if(a.options.maintainOrder){var d=f;var c=b.length;if(0>=d)c=[];else{var h=J(b,d);--c;d-=2;for(var e=[],g;0<=d;){g=[];for(var k=h[c-1][d]+1;k<c+1;k++)g.push(b[k]);e=[g].concat(e);c=h[c-1][d];--d}d=[];for(h=0;h<c+1;h++)d.push(b[h]);c=[d].concat(e)}return c}c=K(b,f);if(a.options.shuffleUnorderedPartitions){for(e=0;e<c.length;e++)c[e]=x(c[e]);c=x(c)}e=c;for(d=0;d<e.length;d++)for(h=e[d],g=0;g<h.length;g++)a.wrapper.append(h[g].element);return c}function J(b,a){for(var d=b.length,c=[],f=0;f<d;f++){for(var e=[],g=0;g<a;g++)e.push(0);c.push(e)}f=[];for(e=0;e<d-1;e++){g=[];for(var k=0;k<a-1;k++)g.push(0);f.push(g)}for(e=0;e<d;e++)c[e][0]=b[e].weight+(0!==e?c[e-1][0]:0);for(e=0;e<a;e++)c[0][e]=b[0].weight;e=function(b,a){return b[0]-a[0]};for(g=1;g<d;g++)for(k=1;k<a;k++){for(var m=[],l=0;l<g;l++)m.push([Math.max(c[l][k-1],c[g][0]-c[l][0]),l]);m=m.sort(e)[0];c[g][k]=m[0];f[g-1][k-1]=m[1]}return f}function K(b,a){for(var d=b.sort(function(b,a){return a.weight-b.weight}),c=Array(a),f=0;f<a;f++)c[f]=[];for(f=0;f<d.length;f++){for(var e=c[0],g=B(e),k=0;k<c.length;k++){var l=B(c[k]);l<g&&(e=c[k],g=l)}e.push(d[f])}return c}function B(b){for(var a=0,d=0;d<b.length;d++)a+=b[d].weight;return a}function x(b){for(var a=b.length,d,c;a--;)c=Math.random()*a|0,d=b[a],b[a]=b[c],b[c]=d;return b}function C(){for(var b=a.options.padding,f=0,d=0,c,h=0;h<a.elements.length;h++){h==d&&(c=b*a.resizingValue[f].length,c=(a.options.viewportWidth-c)/a.resizingValue[f].ratio,d+=a.resizingValue[f].length,f++,t=0);var e=a.elements[h].image,g=parseInt(c,10),k=c*n(e);k=w(k);e[0].style.width=k+"px";e[0].style.height=g+"px"}}function D(){var b=a.options.padding,f=-1,d=0;t=0;for(var c,h,e=0;e<a.elements.length;e++){e==d&&(f++,a.resizingValue[f].columnHeight=0,c=a.options.viewportWidth/a.summedColRatios*a.resizingValue[f].ratio,c-=b,h=w(c),d+=a.resizingValue[f].length);var g=a.elements[e].image,k=parseInt(c*(1/n(g)),10);a.resizingValue[f].columnHeight+=k+b;g[0].style.width=h+"px";g[0].style.height=k+"px"}}function w(b){var a=parseInt(b,10);t+=b-a;.99999<=t&&(a+=1,--t);return a}function y(b){a.options.viewportWidth+a.options.padding!==a.container.width()&&(a.options.viewportWidth=a.container.width()-a.options.padding,a.wrapper[0].style.width=a.options.viewportWidth+"px","horizontal"==b?C():"vertical"==b?D():"grid"==b&&(a.options.idealWidth=a.options.viewportWidth/a.options.widthDivisor,z()))}var q=[],a,F={autoResize:!0,background:null,idealHeight:null,idealWidth:null,maintainOrder:!0,orientation:"horizontal",padding:5,shuffleUnorderedPartitions:!0,gridAspectRatio:1,widthDivisor:4},u=null,t=0;l.fn.BalancedGallery=function(b){return this.each(function(){l.data(this,"plugin_BalancedGallery")||l.data(this,"plugin_BalancedGallery",new p(this,b))})};p.prototype.recreate=function(){this.options=r(this.unadulteratedOptions);this.container.css(this.unadulteratedCSS);this.quickResize=!0;this.init();this.createGallery()};p.prototype.init=function(){if(!1===this.quickResize){var b="inline-block";"vertical"==this.options.orientation&&(b="block");for(var a=0;a<this.elements.length;a++)l(this.elements[a].element).css({display:b,padding:0,margin:0}),this.elements[a].image.css({display:b,padding:0,margin:0});b=this.options.padding+"px";this.wrapper.css({fontSize:0,paddingTop:b,paddingLeft:b});null!==this.options.background&&this.wrapper.css({background:this.options.background})}this.options.viewportWidth=this.container.width()-this.options.padding;null===this.options.idealWidth&&(this.options.idealWidth=this.options.viewportWidth/this.options.widthDivisor);null===this.options.idealHeight&&(this.options.idealHeight=this.options.viewportWidth/this.options.widthDivisor);this.wrapper[0].style.width=this.options.viewportWidth+"px"};p.prototype.createGallery=function(){var b=this.options.orientation;if("horizontal"===b){var f;if(a.quickResize)C();else{for(f=b=0;f<a.elements.length;f++)b+=n(a.elements[f].image)*a.options.idealHeight+a.options.padding;b/=a.options.viewportWidth;0<b&&1>b&&(b=1);b=Math.round(b);f=H();b=A(f,b);f=a.options.padding;var d=0;a.resizingValue=[];for(var c=0;c<b.length;c++){for(var h=0,e=0;e<b[c].length;e++)h+=b[c][e].weight;a.resizingValue[c]={ratio:h,length:b[c].length};t=0;h=(a.options.viewportWidth-f*b[c].length)/h;for(e=0;e<b[c].length;e++){var g=b[c][e].image;a.elements[d++]={element:b[c][e].element,image:g};var k=parseInt(h,10),m=h*n(g);m=w(m);g.css({width:m+"px",height:k+"px",margin:0,marginRight:f+"px",marginBottom:f+"px"})}}}y(a.options.orientation)}else if("vertical"===b){if(a.quickResize)D();else{b=Math.round(a.options.viewportWidth/a.options.idealWidth);f=a.elements.length;b=b<=f?b:f;f=I();b=A(f,b);for(f=0;f<b.length;f++)for(d="balanced-gallery-col"+f,a.wrapper.append('<div class="balanced-gallery-column '+d+'" style="display: inline-block; padding: 0; margin: 0;"></div>'),d=l(a.wrapper[0].querySelector("div."+d)),c=0;c<b[f].length;c++)d.append(b[f][c].element);f=a.options.padding;d=[];h=c=0;a.resizingValue=[];for(e=t=0;e<b.length;e++){for(g=d[e]=0;g<b[e].length;g++)d[e]+=b[e][g].weight;d[e]+=f/(a.options.idealWidth-f)*b[e].length;c+=d[e]}a.summedColRatios=c;e=c/b.length;for(g=0;g<b.length;g++){k=e+(e-d[g]);m=a.options.viewportWidth/c*k-f;for(var q=w(m),p=0,v=0;v<b[g].length;v++){var r=b[g][v].image;a.elements[h++]={element:b[g][v].element,image:r};var u=Math.round(m*(1/n(r)));p+=u+f;r.css({width:q+"px",height:u+"px",margin:0,marginRight:f+"px",marginBottom:f+"px"})}a.resizingValue[g]={ratio:k,length:b[g].length,columnHeight:p}}}y(a.options.orientation);for(d=f=b=0;d<a.resizingValue.length;d++)b+=a.resizingValue[d].columnHeight;b=Math.round(b/a.resizingValue.length);for(d=0;d<a.resizingValue.length;d++)for(f+=a.resizingValue[d].length,c=Math.sign(b-a.resizingValue[d].columnHeight),h=f-1;b!=a.resizingValue[d].columnHeight;)a.elements[h].image[0].style.height=a.elements[h].image.height()+c+"px",a.resizingValue[d].columnHeight+=c,h--,h<f-a.resizingValue[d].length&&(h=f-1)}else if("grid"===b){if(!a.quickResize){if(!a.options.maintainOrder&&a.options.shuffleUnorderedPartitions)for(x(a.elements),b=0;b<a.elements.length;b++)a.wrapper.append(a.elements[b].element);a.wrapper.append('<div style="clear: both;"></div>')}z();y(a.options.orientation)}else throw"BalancedGallery: Invalid Orientation.";}})(jQuery,window);