/*! * Colcade v0.2.0 * Lightweight masonry layout * by David DeSandro * MIT license */ (function(window,factory){if(typeof define=='function'&&define.amd){define(factory)}else if(typeof module=='object'&&module.exports){module.exports=factory()}else{window.Colcade=factory()}}(window,function factory(){function Colcade(element,options){element=getQueryElement(element);if(element&&element.colcadeGUID){var instance=instances[element.colcadeGUID];instance.option(options);return instance} this.element=element;this.options={};this.option(options);this.lastAppend=[];this.lastColumnHeights=[];this.create();element.classList.add('cr-colcade-loaded')} var proto=Colcade.prototype;proto.option=function(options){this.options=extend(this.options,options)};var GUID=0;var instances={};proto.create=function(){this.errorCheck();var guid=this.guid=++GUID;this.element.colcadeGUID=guid;instances[guid]=this;this.reload();this._windowResizeHandler=this.onWindowResize.bind(this);this._loadHandler=this.onLoad.bind(this);window.addEventListener('resize',this._windowResizeHandler);this.element.addEventListener('load',this._loadHandler,!0)};proto.errorCheck=function(){var errors=[];if(!this.element){errors.push('Bad element: '+this.element)} if(!this.options.columns){errors.push('columns option required: '+this.options.columns)} if(!this.options.items){errors.push('items option required: '+this.options.items)} if(errors.length){throw new Error('[Colcade error] '+errors.join('. '))}};proto.reload=function(){this.updateColumns();this.updateItems();this.layout()};proto.updateColumns=function(){this.columns=querySelect(this.options.columns,this.element)};proto.updateItems=function(){this.items=querySelect(this.options.items,this.element)};proto.getActiveColumns=function(){return this.columns.filter(function(column){var style=getComputedStyle(column);return style.display!='none'})};proto.layout=function(){this.activeColumns=this.getActiveColumns();this._layout()};proto._layout=function(){this.columnHeights=this.activeColumns.map(function(){return 0});this.layoutItems(this.items)};proto.layoutItems=function(items){items.forEach(this.layoutItem,this)};proto.layoutItem=function(item){var minHeight=Math.min.apply(Math,this.columnHeights);var index=this.columnHeights.indexOf(minHeight);this.activeColumns[index].appendChild(item);this.columnHeights[index]+=item.offsetHeight||1};proto.append=function(elems){var items=this.getQueryItems(elems);this.items=this.items.concat(items);this.lastAppend.length=0;this.lastAppend=items.slice();this.lastColumnHeights.length=0;this.lastColumnHeights=this.columnHeights.slice();this.layoutItems(items)};proto.prepend=function(elems){var items=this.getQueryItems(elems);this.items=items.concat(this.items);this._layout()};proto.getQueryItems=function(elems){elems=makeArray(elems);var fragment=document.createDocumentFragment();elems.forEach(function(elem){fragment.appendChild(elem)});return querySelect(this.options.items,fragment)};proto.empty=function(){this.lastAppend.length=0;this.lastColumnHeights.length=0;this.items.forEach(function(item){item.remove()},this);this.items.length=0;this._layout()};proto.measureColumnHeight=function(elem){var boundingRect=this.element.getBoundingClientRect();this.activeColumns.forEach(function(column,i){if(!elem||column.contains(elem)){var lastChildRect=column.lastElementChild.getBoundingClientRect();this.columnHeights[i]=lastChildRect.bottom-boundingRect.top}},this)};proto.onWindowResize=function(){clearTimeout(this.resizeTimeout);this.resizeTimeout=setTimeout(function(){this.onDebouncedResize()}.bind(this),100)};proto.onDebouncedResize=function(){var activeColumns=this.getActiveColumns();var isSameLength=activeColumns.length==this.activeColumns.length;var isSameColumns=!0;this.activeColumns.forEach(function(column,i){isSameColumns=isSameColumns&&column==activeColumns[i]});if(isSameLength&&isSameColumns){return} this.activeColumns=activeColumns;this._layout()};proto.onLoad=function(event){this.measureColumnHeight(event.target);if(0