/*! * shuffle.js by @vestride * categorize, sort, and filter a responsive grid of items. * dependencies: jquery 1.9+, modernizr 2.6.2+ * @license mit license * @version 3.1.1 */ (function(factory){if(typeof define==='function'&&define.amd){define(['jquery','modernizr'],factory);}else if(typeof exports==='object'){module.exports=factory(require('jquery'),window.modernizr);}else{window.shuffle=factory(window.jquery,window.modernizr);}})(function($,modernizr,undefined){'use strict';if(typeof modernizr!=='object'){throw new error('shuffle.js requires modernizr.\n'+'http://vestride.github.io/shuffle/#dependencies');} function dashify(prop){if(!prop){return'';} return prop.replace(/([a-z])/g,function(str,m1){return'-'+m1.tolowercase();}).replace(/^ms-/,'-ms-');} var transition=modernizr.prefixed('transition');var transition_delay=modernizr.prefixed('transitiondelay');var transition_duration=modernizr.prefixed('transitionduration');var transitionend={'webkittransition':'webkittransitionend','transition':'transitionend'}[transition];var transform=modernizr.prefixed('transform');var css_transform=dashify(transform);var can_transition_transforms=modernizr.csstransforms&&modernizr.csstransitions;var has_transforms_3d=modernizr.csstransforms3d;var has_computed_style=!!window.getcomputedstyle;var shuffle='shuffle';var all_items='all';var filter_attribute_key='groups';var default_scale=1;var concealed_scale=0.001;function throttle(func,wait,options){var context,args,result;var timeout=null;var previous=0;options=options||{};var later=function(){previous=options.leading===false?0:$.now();timeout=null;result=func.apply(context,args);context=args=null;};return function(){var now=$.now();if(!previous&&options.leading===false){previous=now;} var remaining=wait-(now-previous);context=this;args=arguments;if(remaining<=0||remaining>wait){cleartimeout(timeout);timeout=null;previous=now;result=func.apply(context,args);context=args=null;}else if(!timeout&&options.trailing!==false){timeout=settimeout(later,remaining);} return result;};} function each(obj,iterator,context){for(var i=0,length=obj.length;i-1;}};shuffle.prototype._togglefilterclasses=function($filtered,$concealed){$filtered.removeclass(shuffle.classname.concealed).addclass(shuffle.classname.filtered);$concealed.removeclass(shuffle.classname.filtered).addclass(shuffle.classname.concealed);};shuffle.prototype._inititems=function($items){$items=$items||this.$items;$items.addclass([shuffle.classname.shuffle_item,shuffle.classname.filtered].join(' '));$items.css(this.itemcss).data('point',new point()).data('scale',default_scale);};shuffle.prototype._updateitemcount=function(){this.visibleitems=this._getfiltereditems().length;};shuffle.prototype._settransition=function(element){element.style[transition]=css_transform+' '+this.speed+'ms '+ this.easing+', opacity '+this.speed+'ms '+this.easing;};shuffle.prototype._settransitions=function($items){$items=$items||this.$items;each($items,function(el){this._settransition(el);},this);};shuffle.prototype._setsequentialdelay=function($collection){if(!this.supported){return;} each($collection,function(el,i){el.style[transition_delay]='0ms,'+((i+1)*this.sequentialfadedelay)+'ms';},this);};shuffle.prototype._getitems=function(){return this.$el.children(this.itemselector);};shuffle.prototype._getfiltereditems=function(){return this.$items.filter('.'+shuffle.classname.filtered);};shuffle.prototype._getconcealeditems=function(){return this.$items.filter('.'+shuffle.classname.concealed);};shuffle.prototype._getcolumnsize=function(containerwidth,guttersize){var size;if($.isfunction(this.columnwidth)){size=this.columnwidth(containerwidth);}else if(this.usesizer){size=shuffle._getouterwidth(this.sizer);}else if(this.columnwidth){size=this.columnwidth;}else if(this.$items.length>0){size=shuffle._getouterwidth(this.$items[0],true);}else{size=containerwidth;} if(size===0){size=containerwidth;} return size+guttersize;};shuffle.prototype._getguttersize=function(containerwidth){var size;if($.isfunction(this.gutterwidth)){size=this.gutterwidth(containerwidth);}else if(this.usesizer){size=shuffle._getnumberstyle(this.sizer,'marginleft');}else{size=this.gutterwidth;} return size;};shuffle.prototype._setcolumns=function(thecontainerwidth){var containerwidth=thecontainerwidth||shuffle._getouterwidth(this.element);var gutter=this._getguttersize(containerwidth);var columnwidth=this._getcolumnsize(containerwidth,gutter);var calculatedcolumns=(containerwidth+gutter)/columnwidth;if(math.abs(math.round(calculatedcolumns)-calculatedcolumns)=minposition-buffer&&positions[i]<=minposition+buffer){return i;}} return 0;};shuffle.prototype._shrink=function($collection){var $concealed=$collection||this._getconcealeditems();each($concealed,function(item){var $item=$(item);var itemdata=$item.data();if(itemdata.scale===concealed_scale){return;} itemdata.scale=concealed_scale;this.stylequeue.push({$item:$item,point:itemdata.point,scale:concealed_scale,opacity:0,callback:function(){$item.css('visibility','hidden');}});},this);};shuffle.prototype._onresize=function(){if(!this.enabled||this.destroyed){return;} var containerwidth=shuffle._getouterwidth(this.element);if(containerwidth===this.containerwidth){return;} this.update();};shuffle.prototype._getstylesfortransition=function(opts){var styles={opacity:opts.opacity};if(this.supported){styles[transform]=shuffle._getitemtransformstring(opts.point,opts.scale);}else{styles.left=opts.point.x;styles.top=opts.point.y;} return styles;};shuffle.prototype._transition=function(opts){var styles=this._getstylesfortransition(opts);this._startitemanimation(opts.$item,styles,opts.callfront||$.noop,opts.callback||$.noop);};shuffle.prototype._startitemanimation=function($item,styles,callfront,callback){var _this=this;function handletransitionend(evt){if(evt.target===evt.currenttarget){$(evt.target).off(transitionend,handletransitionend);_this._removetransitionreference(reference);callback();}} var reference={$element:$item,handler:handletransitionend};callfront();if(!this.initialized){$item.css(styles);callback();return;} if(this.supported){$item.css(styles);$item.on(transitionend,handletransitionend);this._transitions.push(reference);}else{var anim=$item.stop(true).animate(styles,this.speed,'swing',callback);this._animations.push(anim.promise());}};shuffle.prototype._processstylequeue=function(nolayout){if(this.istransitioning){this._cancelmovement();} var $transitions=$();each(this.stylequeue,function(transitionobj){if(transitionobj.skiptransition){this._styleimmediately(transitionobj);}else{$transitions=$transitions.add(transitionobj.$item);this._transition(transitionobj);}},this);if($transitions.length>0&&this.initialized&&this.speed>0){this.istransitioning=true;if(this.supported){this._whencollectiondone($transitions,transitionend,this._movementfinished);}else{this._whenanimationsdone(this._movementfinished);}}else if(!nolayout){defer(this._layoutend,this);} this.stylequeue.length=0;};shuffle.prototype._cancelmovement=function(){if(this.supported){each(this._transitions,function(transition){transition.$element.off(transitionend,transition.handler);});}else{this._ismovementcanceled=true;this.$items.stop(true);this._ismovementcanceled=false;} this._transitions.length=0;this.istransitioning=false;};shuffle.prototype._removetransitionreference=function(ref){var indexinarray=$.inarray(ref,this._transitions);if(indexinarray>-1){this._transitions.splice(indexinarray,1);}};shuffle.prototype._styleimmediately=function(opts){shuffle._skiptransition(opts.$item[0],function(){opts.$item.css(this._getstylesfortransition(opts));},this);};shuffle.prototype._movementfinished=function(){this.istransitioning=false;this._layoutend();};shuffle.prototype._layoutend=function(){this._fire(shuffle.eventtype.layout);};shuffle.prototype._additems=function($newitems,addtoend,issequential){this._inititems($newitems);this._settransitions($newitems);this.$items=this._getitems();this._shrink($newitems);each(this.stylequeue,function(transitionobj){transitionobj.skiptransition=true;});this._processstylequeue(true);if(addtoend){this._additemstoend($newitems,issequential);}else{this.shuffle(this.lastfilter);}};shuffle.prototype._additemstoend=function($newitems,issequential){var $passed=this._filter(null,$newitems);var passed=$passed.get();this._updateitemcount();this._layout(passed,true);if(issequential&&this.supported){this._setsequentialdelay(passed);} this._revealappended(passed);};shuffle.prototype._revealappended=function(newfiltereditems){defer(function(){each(newfiltereditems,function(el){var $item=$(el);this._transition({$item:$item,opacity:1,point:$item.data('point'),scale:default_scale});},this);this._whencollectiondone($(newfiltereditems),transitionend,function(){$(newfiltereditems).css(transition_delay,'0ms');this._movementfinished();});},this,this.revealappendeddelay);};shuffle.prototype._whencollectiondone=function($collection,eventname,callback){var done=0;var items=$collection.length;var self=this;function handleeventname(evt){if(evt.target===evt.currenttarget){$(evt.target).off(eventname,handleeventname);done++;if(done===items){self._removetransitionreference(reference);callback.call(self);}}} var reference={$element:$collection,handler:handleeventname};$collection.on(eventname,handleeventname);this._transitions.push(reference);};shuffle.prototype._whenanimationsdone=function(callback){$.when.apply(null,this._animations).always($.proxy(function(){this._animations.length=0;if(!this._ismovementcanceled){callback.call(this);}},this));};shuffle.prototype.shuffle=function(category,sortobj){if(!this.enabled){return;} if(!category){category=all_items;} this._filter(category);this._updateitemcount();this._shrink();this.sort(sortobj);};shuffle.prototype.sort=function(opts){if(this.enabled){this._resetcols();var sortoptions=opts||this.lastsort;var items=this._getfiltereditems().sorted(sortoptions);this._layout(items);this.lastsort=sortoptions;}};shuffle.prototype.update=function(isonlylayout){if(this.enabled){if(!isonlylayout){this._setcolumns();} this.sort();}};shuffle.prototype.layout=function(){this.update(true);};shuffle.prototype.appended=function($newitems,addtoend,issequential){this._additems($newitems,addtoend===true,issequential!==false);};shuffle.prototype.disable=function(){this.enabled=false;};shuffle.prototype.enable=function(isupdatelayout){this.enabled=true;if(isupdatelayout!==false){this.update();}};shuffle.prototype.remove=function($collection){if(!$collection.length||!$collection.jquery){return;} function handleremoved(){$collection.remove();this.$items=this._getitems();this._updateitemcount();this._fire(shuffle.eventtype.removed,[$collection,this]);$collection=null;} this._togglefilterclasses($(),$collection);this._shrink($collection);this.sort();this.$el.one(shuffle.eventtype.layout+'.'+shuffle,$.proxy(handleremoved,this));};shuffle.prototype.destroy=function(){$window.off('.'+this.unique);this.$el.removeclass(shuffle).removeattr('style').removedata(shuffle);this.$items.removeattr('style').removedata('point').removedata('scale').removeclass([shuffle.classname.concealed,shuffle.classname.filtered,shuffle.classname.shuffle_item].join(' '));this.$items=null;this.$el=null;this.sizer=null;this.element=null;this._transitions=null;this.destroyed=true;};$.fn.shuffle=function(opts){var args=array.prototype.slice.call(arguments,1);return this.each(function(){var $this=$(this);var shuffle=$this.data(shuffle);if(!shuffle){shuffle=new shuffle(this,opts);$this.data(shuffle,shuffle);}else if(typeof opts==='string'&&shuffle[opts]){shuffle[opts].apply(shuffle,args);}});};function randomize(array){var tmp,current;var top=array.length;if(!top){return array;} while(--top){current=math.floor(math.random()*(top+1));tmp=array[current];array[current]=array[top];array[top]=tmp;} return array;} $.fn.sorted=function(options){var opts=$.extend({},$.fn.sorted.defaults,options);var arr=this.get();var revert=false;if(!arr.length){return[];} if(opts.randomize){return randomize(arr);} if($.isfunction(opts.by)){arr.sort(function(a,b){if(revert){return 0;} var vala=opts.by($(a));var valb=opts.by($(b));if(vala===undefined&&valb===undefined){revert=true;return 0;} if(valavalb||vala==='sortlast'||valb==='sortfirst'){return 1;} return 0;});} if(revert){return this.get();} if(opts.reverse){arr.reverse();} return arr;};$.fn.sorted.defaults={reverse:false,by:null,randomize:false};return shuffle;});