/**

* Justified Gallery - v3.6.4
* http://miromannino.github.io/Justified-Gallery/
*
* Copyright (C) 2016 Miro Mannino
* Licensed under the MIT license.
*/

(function(d){function b(){return d("body").height()>d(window).height()}var a=function(e,f){this.settings=f;this.checkSettings();this.imgAnalyzerTimeout=null;this.entries=null;this.buildingRow={entriesBuff:[],width:0,height:0,aspectRatio:0};this.lastFetchedEntry=null;this.lastAnalyzedIndex=-1;this.yield={every:2,flushed:0};this.border=f.border>=0?f.border:f.margins;this.maxRowHeight=this.retrieveMaxRowHeight();this.suffixRanges=this.retrieveSuffixRanges();this.offY=this.border;this.rows=0;this.spinner={phase:0,timeSlot:150,$el:d('<div class="spinner"><span></span><span></span><span></span></div>'),intervalId:null};this.checkWidthIntervalId=null;this.galleryWidth=e.width();this.$gallery=e};a.prototype.getSuffix=function(g,e){var h,f;h=(g>e)?g:e;for(f=0;f<this.suffixRanges.length;f++){if(h<=this.suffixRanges[f]){return this.settings.sizeRangeSuffixes[this.suffixRanges[f]]}}return this.settings.sizeRangeSuffixes[this.suffixRanges[f-1]]};a.prototype.removeSuffix=function(f,e){return f.substring(0,f.length-e.length)};a.prototype.endsWith=function(f,e){return f.indexOf(e,f.length-e.length)!==-1};a.prototype.getUsedSuffix=function(f){for(var e in this.settings.sizeRangeSuffixes){if(this.settings.sizeRangeSuffixes.hasOwnProperty(e)){if(this.settings.sizeRangeSuffixes[e].length===0){continue}if(this.endsWith(f,this.settings.sizeRangeSuffixes[e])){return this.settings.sizeRangeSuffixes[e]}}}return""};a.prototype.newSrc=function(k,f,e,j){var g;if(this.settings.thumbnailPath){g=this.settings.thumbnailPath(k,f,e,j)}else{var i=k.match(this.settings.extension);var h=(i!==null)?i[0]:"";g=k.replace(this.settings.extension,"");g=this.removeSuffix(g,this.getUsedSuffix(g));g+=this.getSuffix(f,e)+h}return g};a.prototype.showImg=function(e,f){if(this.settings.cssAnimation){e.addClass("entry-visible");if(f){f()}}else{e.stop().fadeTo(this.settings.imagesAnimationDuration,1,f);e.find("> img, > a > img").stop().fadeTo(this.settings.imagesAnimationDuration,1,f)}};a.prototype.extractImgSrcFromImage=function(e){var f=(typeof e.data("safe-src")!=="undefined")?e.data("safe-src"):e.attr("src");e.data("jg.originalSrc",f);return f};a.prototype.imgFromEntry=function(e){var f=e.find("> img");if(f.length===0){f=e.find("> a > img")}return f.length===0?null:f};a.prototype.captionFromEntry=function(e){var f=e.find("> .caption");return f.length===0?null:f};a.prototype.displayEntry=function(l,m,h,i,j,e){l.width(i);l.height(e);l.css("top",h);l.css("left",m);var g=this.imgFromEntry(l);if(g!==null){g.css("width",i);g.css("height",j);g.css("margin-left",-i/2);g.css("margin-top",-j/2);var k=g.attr("src");var n=this.newSrc(k,i,j,g[0]);g.one("error",function(){g.attr("src",g.data("jg.originalSrc"))});var f=function(){if(k!==n){g.attr("src",n)}};if(l.data("jg.loaded")==="skipped"){this.onImageEvent(k,d.proxy(function(){this.showImg(l,f);l.data("jg.loaded",true)},this))}else{this.showImg(l,f)}}else{this.showImg(l)}this.displayEntryCaption(l)};a.prototype.displayEntryCaption=function(f){var h=this.imgFromEntry(f);if(h!==null&&this.settings.captions){var g=this.captionFromEntry(f);if(g===null){var e=h.attr("alt");if(!this.isValidCaption(e)){e=f.attr("title")}if(this.isValidCaption(e)){g=d('<div class="caption">'+e+"</div>");f.append(g);f.data("jg.createdCaption",true)}}if(g!==null){if(!this.settings.cssAnimation){g.stop().fadeTo(0,this.settings.captionSettings.nonVisibleOpacity)}this.addCaptionEventsHandlers(f)}}else{this.removeCaptionEventsHandlers(f)}};a.prototype.isValidCaption=function(e){return(typeof e!=="undefined"&&e.length>0)};a.prototype.onEntryMouseEnterForCaption=function(e){var f=this.captionFromEntry(d(e.currentTarget));if(this.settings.cssAnimation){f.addClass("caption-visible").removeClass("caption-hidden")}else{f.stop().fadeTo(this.settings.captionSettings.animationDuration,this.settings.captionSettings.visibleOpacity)}};a.prototype.onEntryMouseLeaveForCaption=function(e){var f=this.captionFromEntry(d(e.currentTarget));if(this.settings.cssAnimation){f.removeClass("caption-visible").removeClass("caption-hidden")}else{f.stop().fadeTo(this.settings.captionSettings.animationDuration,this.settings.captionSettings.nonVisibleOpacity)}};a.prototype.addCaptionEventsHandlers=function(e){var f=e.data("jg.captionMouseEvents");if(typeof f==="undefined"){f={mouseenter:d.proxy(this.onEntryMouseEnterForCaption,this),mouseleave:d.proxy(this.onEntryMouseLeaveForCaption,this)};e.on("mouseenter",undefined,undefined,f.mouseenter);e.on("mouseleave",undefined,undefined,f.mouseleave);e.data("jg.captionMouseEvents",f)}};a.prototype.removeCaptionEventsHandlers=function(e){var f=e.data("jg.captionMouseEvents");if(typeof f!=="undefined"){e.off("mouseenter",undefined,f.mouseenter);e.off("mouseleave",undefined,f.mouseleave);e.removeData("jg.captionMouseEvents")}};a.prototype.prepareBuildingRow=function(l){var k,n,j,f,p,g=true;var q=0;var o=this.galleryWidth-2*this.border-((this.buildingRow.entriesBuff.length-1)*this.settings.margins);var e=o/this.buildingRow.aspectRatio;var m=this.settings.rowHeight;var h=this.buildingRow.width/o>this.settings.justifyThreshold;if(l&&this.settings.lastRow==="hide"&&!h){for(k=0;k<this.buildingRow.entriesBuff.length;k++){n=this.buildingRow.entriesBuff[k];if(this.settings.cssAnimation){n.removeClass("entry-visible")}else{n.stop().fadeTo(0,0.1);n.find("> img, > a > img").fadeTo(0,0)}}return -1}if(l&&!h&&this.settings.lastRow!=="justify"&&this.settings.lastRow!=="hide"){g=false;if(this.rows>0){m=(this.offY-this.border-this.settings.margins*this.rows)/this.rows;g=m*this.buildingRow.aspectRatio/o>this.settings.justifyThreshold}}for(k=0;k<this.buildingRow.entriesBuff.length;k++){n=this.buildingRow.entriesBuff[k];j=n.data("jg.width")/n.data("jg.height");if(g){f=(k===this.buildingRow.entriesBuff.length-1)?o:e*j;p=e}else{f=m*j;p=m}o-=Math.round(f);n.data("jg.jwidth",Math.round(f));n.data("jg.jheight",Math.ceil(p));if(k===0||q>p){q=p}}this.buildingRow.height=q;return g};a.prototype.clearBuildingRow=function(){this.buildingRow.entriesBuff=[];this.buildingRow.aspectRatio=0;this.buildingRow.width=0};a.prototype.flushRow=function(l){var h=this.settings;var f,k,e=this.border,g;k=this.prepareBuildingRow(l);if(l&&h.lastRow==="hide"&&k===-1){this.clearBuildingRow();return}if(this.maxRowHeight){if(this.maxRowHeight.isPercentage&&this.maxRowHeight.value*h.rowHeight<this.buildingRow.height){this.buildingRow.height=this.maxRowHeight.value*h.rowHeight}else{if(this.maxRowHeight.value>=h.rowHeight&&this.maxRowHeight.value<this.buildingRow.height){this.buildingRow.height=this.maxRowHeight.value}}}if(h.lastRow==="center"||h.lastRow==="right"){var j=this.galleryWidth-2*this.border-(this.buildingRow.entriesBuff.length-1)*h.margins;for(g=0;g<this.buildingRow.entriesBuff.length;g++){f=this.buildingRow.entriesBuff[g];j-=f.data("jg.jwidth")}if(h.lastRow==="center"){e+=j/2}else{if(h.lastRow==="right"){e+=j}}}for(g=0;g<this.buildingRow.entriesBuff.length;g++){f=this.buildingRow.entriesBuff[g];this.displayEntry(f,e,this.offY,f.data("jg.jwidth"),f.data("jg.jheight"),this.buildingRow.height);e+=f.data("jg.jwidth")+h.margins}this.galleryHeightToSet=this.offY+this.buildingRow.height+this.border;this.$gallery.height(this.galleryHeightToSet+this.getSpinnerHeight());if(!l||(this.buildingRow.height<=h.rowHeight&&k)){this.offY+=this.buildingRow.height+h.margins;this.rows+=1;this.clearBuildingRow();this.$gallery.trigger("jg.rowflush")}};var c=false;a.prototype.checkWidth=function(){this.checkWidthIntervalId=setInterval(d.proxy(function(){var e=parseFloat(this.$gallery.width());if(b()===c){if(Math.abs(e-this.galleryWidth)>this.settings.refreshSensitivity){this.galleryWidth=e;this.rewind();this.startImgAnalyzer(true)}}else{c=b();this.galleryWidth=e}},this),this.settings.refreshTime)};a.prototype.isSpinnerActive=function(){return this.spinner.intervalId!==null};a.prototype.getSpinnerHeight=function(){return this.spinner.$el.innerHeight()};a.prototype.stopLoadingSpinnerAnimation=function(){clearInterval(this.spinner.intervalId);this.spinner.intervalId=null;this.$gallery.height(this.$gallery.height()-this.getSpinnerHeight());this.spinner.$el.detach()};a.prototype.startLoadingSpinnerAnimation=function(){var f=this.spinner;var e=f.$el.find("span");clearInterval(f.intervalId);this.$gallery.append(f.$el);this.$gallery.height(this.offY+this.buildingRow.height+this.getSpinnerHeight());f.intervalId=setInterval(function(){if(f.phase<e.length){e.eq(f.phase).fadeTo(f.timeSlot,1)}else{e.eq(f.phase-e.length).fadeTo(f.timeSlot,0)}f.phase=(f.phase+1)%(e.length*2)},f.timeSlot)};a.prototype.rewind=function(){this.lastFetchedEntry=null;this.lastAnalyzedIndex=-1;this.offY=this.border;this.rows=0;this.clearBuildingRow()};a.prototype.updateEntries=function(f){var e;if(f&&this.lastFetchedEntry!=null){e=d(this.lastFetchedEntry).nextAll(this.settings.selector).toArray()}else{this.entries=[];e=this.$gallery.children(this.settings.selector).toArray()}if(e.length>0){if(d.isFunction(this.settings.sort)){e=this.sortArray(e)}else{if(this.settings.randomize){e=this.shuffleArray(e)}}this.lastFetchedEntry=e[e.length-1];if(this.settings.filter){e=this.filterArray(e)}else{this.resetFilters(e)}}this.entries=this.entries.concat(e);return true};a.prototype.insertToGallery=function(e){var f=this;d.each(e,function(){d(this).appendTo(f.$gallery)})};a.prototype.shuffleArray=function(e){var h,g,f;for(h=e.length-1;h>0;h--){g=Math.floor(Math.random()*(h+1));f=e[h];e[h]=e[g];e[g]=f}this.insertToGallery(e);return e};a.prototype.sortArray=function(e){e.sort(this.settings.sort);this.insertToGallery(e);return e};a.prototype.resetFilters=function(e){for(var f=0;f<e.length;f++){d(e[f]).removeClass("jg-filtered")}};a.prototype.filterArray=function(e){var h=this.settings;if(d.type(h.filter)==="string"){return e.filter(function(j){var i=d(j);if(i.is(h.filter)){i.removeClass("jg-filtered");return true}else{i.addClass("jg-filtered").removeClass("jg-visible");return false}})}else{if(d.isFunction(h.filter)){var f=e.filter(h.filter);for(var g=0;g<e.length;g++){if(f.indexOf(e[g])===-1){d(e[g]).addClass("jg-filtered").removeClass("jg-visible")}else{d(e[g]).removeClass("jg-filtered")}}return f}}};a.prototype.destroy=function(){clearInterval(this.checkWidthIntervalId);d.each(this.entries,d.proxy(function(f,h){var e=d(h);e.css("width","");e.css("height","");e.css("top","");e.css("left","");e.data("jg.loaded",undefined);e.removeClass("jg-entry");var g=this.imgFromEntry(e);g.css("width","");g.css("height","");g.css("margin-left","");g.css("margin-top","");g.attr("src",g.data("jg.originalSrc"));g.data("jg.originalSrc",undefined);this.removeCaptionEventsHandlers(e);var i=this.captionFromEntry(e);if(e.data("jg.createdCaption")){e.data("jg.createdCaption",undefined);if(i!==null){i.remove()}}else{if(i!==null){i.fadeTo(0,1)}}},this));this.$gallery.css("height","");this.$gallery.removeClass("justified-gallery");this.$gallery.data("jg.controller",undefined)};a.prototype.analyzeImages=function(j){for(var f=this.lastAnalyzedIndex+1;f<this.entries.length;f++){var e=d(this.entries[f]);if(e.data("jg.loaded")===true||e.data("jg.loaded")==="skipped"){var h=this.galleryWidth-2*this.border-((this.buildingRow.entriesBuff.length-1)*this.settings.margins);var g=e.data("jg.width")/e.data("jg.height");if(h/(this.buildingRow.aspectRatio+g)<this.settings.rowHeight){this.flushRow(false);if(++this.yield.flushed>=this.yield.every){this.startImgAnalyzer(j);return}}this.buildingRow.entriesBuff.push(e);this.buildingRow.aspectRatio+=g;this.buildingRow.width+=g*this.settings.rowHeight;this.lastAnalyzedIndex=f}else{if(e.data("jg.loaded")!=="error"){return}}}if(this.buildingRow.entriesBuff.length>0){this.flushRow(true)}if(this.isSpinnerActive()){this.stopLoadingSpinnerAnimation()}this.stopImgAnalyzerStarter();this.$gallery.trigger(j?"jg.resize":"jg.complete");this.$gallery.height(this.galleryHeightToSet)};a.prototype.stopImgAnalyzerStarter=function(){this.yield.flushed=0;if(this.imgAnalyzerTimeout!==null){clearTimeout(this.imgAnalyzerTimeout)}};a.prototype.startImgAnalyzer=function(f){var e=this;this.stopImgAnalyzerStarter();this.imgAnalyzerTimeout=setTimeout(function(){e.analyzeImages(f)},0.001)};a.prototype.onImageEvent=function(i,e,g){if(!e&&!g){return}var h=new Image();var f=d(h);if(e){f.one("load",function(){f.off("load error");e(h)})}if(g){f.one("error",function(){f.off("load error");g(h)})}h.src=i};a.prototype.init=function(){var g=false,f=false,e=this;d.each(this.entries,function(j,m){var i=d(m);var l=e.imgFromEntry(i);i.addClass("jg-entry");if(i.data("jg.loaded")!==true&&i.data("jg.loaded")!=="skipped"){if(e.settings.rel!==null){i.attr("rel",e.settings.rel)}if(e.settings.target!==null){i.attr("target",e.settings.target)}if(l!==null){var n=e.extractImgSrcFromImage(l);l.attr("src",n);if(e.settings.waitThumbnailsLoad===false){var k=parseFloat(l.attr("width"));var h=parseFloat(l.attr("height"));if(!isNaN(k)&&!isNaN(h)){i.data("jg.width",k);i.data("jg.height",h);i.data("jg.loaded","skipped");f=true;e.startImgAnalyzer(false);return true}}i.data("jg.loaded",false);g=true;if(!e.isSpinnerActive()){e.startLoadingSpinnerAnimation()}e.onImageEvent(n,function(o){i.data("jg.width",o.width);i.data("jg.height",o.height);i.data("jg.loaded",true);e.startImgAnalyzer(false)},function(){i.data("jg.loaded","error");e.startImgAnalyzer(false)})}else{i.data("jg.loaded",true);i.data("jg.width",i.width()|parseFloat(i.css("width"))|1);i.data("jg.height",i.height()|parseFloat(i.css("height"))|1)}}});if(!g&&!f){this.startImgAnalyzer(false)}this.checkWidth()};a.prototype.checkOrConvertNumber=function(f,e){if(d.type(f[e])==="string"){f[e]=parseFloat(f[e])}if(d.type(f[e])==="number"){if(isNaN(f[e])){throw"invalid number for "+e}}else{throw e+" must be a number"}};a.prototype.checkSizeRangesSuffixes=function(){if(d.type(this.settings.sizeRangeSuffixes)!=="object"){throw"sizeRangeSuffixes must be defined and must be an object"}var k=[];for(var h in this.settings.sizeRangeSuffixes){if(this.settings.sizeRangeSuffixes.hasOwnProperty(h)){k.push(h)}}var g={0:""};for(var f=0;f<k.length;f++){if(d.type(k[f])==="string"){try{var l=parseInt(k[f].replace(/^[a-z]+/,""),10);g[l]=this.settings.sizeRangeSuffixes[k[f]]}catch(j){throw"sizeRangeSuffixes keys must contains correct numbers ("+j+")"}}else{g[k[f]]=this.settings.sizeRangeSuffixes[k[f]]}}this.settings.sizeRangeSuffixes=g};a.prototype.retrieveMaxRowHeight=function(){var e={};if(d.type(this.settings.maxRowHeight)==="string"){if(this.settings.maxRowHeight.match(/^[0-9]+%$/)){e.value=parseFloat(this.settings.maxRowHeight.match(/^([0-9]+)%$/)[1])/100;e.isPercentage=false}else{e.value=parseFloat(this.settings.maxRowHeight);e.isPercentage=true}}else{if(d.type(this.settings.maxRowHeight)==="number"){e.value=this.settings.maxRowHeight;e.isPercentage=false}else{if(this.settings.maxRowHeight===false||this.settings.maxRowHeight===null||typeof this.settings.maxRowHeight==="undefined"){return null}else{throw"maxRowHeight must be a number or a percentage"}}}if(isNaN(e.value)){throw"invalid number for maxRowHeight"}if(e.isPercentage){if(e.value<100){e.value=100}}return e};a.prototype.checkSettings=function(){this.checkSizeRangesSuffixes();this.checkOrConvertNumber(this.settings,"rowHeight");this.checkOrConvertNumber(this.settings,"margins");this.checkOrConvertNumber(this.settings,"border");var e=["justify","nojustify","left","center","right","hide"];if(e.indexOf(this.settings.lastRow)===-1){throw"lastRow must be one of: "+e.join(", ")}this.checkOrConvertNumber(this.settings,"justifyThreshold");if(this.settings.justifyThreshold<0||this.settings.justifyThreshold>1){throw"justifyThreshold must be in the interval [0,1]"}if(d.type(this.settings.cssAnimation)!=="boolean"){throw"cssAnimation must be a boolean"}if(d.type(this.settings.captions)!=="boolean"){throw"captions must be a boolean"}this.checkOrConvertNumber(this.settings.captionSettings,"animationDuration");this.checkOrConvertNumber(this.settings.captionSettings,"visibleOpacity");if(this.settings.captionSettings.visibleOpacity<0||this.settings.captionSettings.visibleOpacity>1){throw"captionSettings.visibleOpacity must be in the interval [0, 1]"}this.checkOrConvertNumber(this.settings.captionSettings,"nonVisibleOpacity");if(this.settings.captionSettings.nonVisibleOpacity<0||this.settings.captionSettings.nonVisibleOpacity>1){throw"captionSettings.nonVisibleOpacity must be in the interval [0, 1]"}this.checkOrConvertNumber(this.settings,"imagesAnimationDuration");this.checkOrConvertNumber(this.settings,"refreshTime");this.checkOrConvertNumber(this.settings,"refreshSensitivity");if(d.type(this.settings.randomize)!=="boolean"){throw"randomize must be a boolean"}if(d.type(this.settings.selector)!=="string"){throw"selector must be a string"}if(this.settings.sort!==false&&!d.isFunction(this.settings.sort)){throw"sort must be false or a comparison function"}if(this.settings.filter!==false&&!d.isFunction(this.settings.filter)&&d.type(this.settings.filter)!=="string"){throw"filter must be false, a string or a filter function"}};a.prototype.retrieveSuffixRanges=function(){var f=[];for(var e in this.settings.sizeRangeSuffixes){if(this.settings.sizeRangeSuffixes.hasOwnProperty(e)){f.push(parseInt(e,10))}}f.sort(function(h,g){return h>g?1:h<g?-1:0});return f};a.prototype.updateSettings=function(e){this.settings=d.extend({},this.settings,e);this.checkSettings();this.border=this.settings.border>=0?this.settings.border:this.settings.margins;this.maxRowHeight=this.retrieveMaxRowHeight();this.suffixRanges=this.retrieveSuffixRanges()};d.fn.justifiedGallery=function(e){return this.each(function(i,h){var f=d(h);f.addClass("justified-gallery");var g=f.data("jg.controller");if(typeof g==="undefined"){if(typeof e!=="undefined"&&e!==null&&d.type(e)!=="object"){if(e==="destroy"){return}throw"The argument must be an object"}g=new a(f,d.extend({},d.fn.justifiedGallery.defaults,e));f.data("jg.controller",g)}else{if(e==="norewind"){}else{if(e==="destroy"){g.destroy();return}else{g.updateSettings(e);g.rewind()}}}if(!g.updateEntries(e==="norewind")){return}g.init()})};d.fn.justifiedGallery.defaults={sizeRangeSuffixes:{},thumbnailPath:undefined,rowHeight:120,maxRowHeight:false,margins:1,border:-1,lastRow:"nojustify",justifyThreshold:0.9,waitThumbnailsLoad:true,captions:true,cssAnimation:true,imagesAnimationDuration:500,captionSettings:{animationDuration:500,visibleOpacity:0.7,nonVisibleOpacity:0},rel:null,target:null,extension:/\.[^.\\/]+$/,refreshTime:200,refreshSensitivity:0,randomize:false,sort:false,filter:false,selector:"a, div:not(.spinner)"}}(jQuery));