(function($){
$.fn.mpmansory=function(options){
var settings=$.extend({
childrenClass: '',
breakpoints: {
xl: 3,
lg: 4,
md: 6,
sm: 12,
xs: 12
},
distributeBy: {
attr: 'data-order',
attrOrder: 'asc',
order: false,
height: false
},
onload: function(items){
return true;
}}, options);
Array.min=function(array){
return Math.min.apply(Math, array);
};
$.emptyArray=function(array){
for (var i=0; i<array.length; i++){
array[i].remove();
}
return new Array();
}
$.fn.initialize=function(columns, classStr){
var cols=[];
for (var i=0; i<columns; i++){
var wrap=$('<div></div>');
wrap.addClass(classStr);
$(this).append(wrap);
cols.push(wrap);
}
return cols;
}
$.fn.distributeItemsByHeight=function(wrappers, items){
var counter=0;
for (var k=0; k<items.length; k++){
var $heights=new Array();
for (var i=0; i<wrappers.length; i++){
$heights.push(wrappers[i].height());
}
var min=Array.min($heights)==Number.POSITIVE_INFINITY||Array.min($heights)==Number.NEGATIVE_INFINITY ? 0:Array.min($heights);
wrappers[$heights.indexOf(min)].append(items[k]);
}}
$.fn.getCurrentColumnSize=function (){
return $(window).width()>1140?"xl":$(window).width()>960?"lg":$(window).width()>720?"md":$(window).width()>540?"sm":($(window).width()>480,"xs")
}
$.fn.distributeItemsByOrder=function(wrappers, items){
var counter=0;
for (var k=0; k<items.length; k++){
if(counter==wrappers.length) counter=0;
wrappers[counter].append(items[k]);
counter++;
}}
$.fn.orderItemsByAttr=function (items, order){
var attrs=new Array();
for(var k=0; k<items.length; k++){
attrs.push($(items[k]).attr(order.attr));
}
if(order.attrOrder=='asc'){
attrs.sort(function (a, b){ return a-b });
}else{
attrs.sort(function (a, b){ return b-a });
}
var ordered_items=new Array();
for(var i=0; i<attrs.length; i++){
var item=$.grep(items, function (e){return $(e).attr(order.attr)==attrs[i]});
ordered_items.push(item);
}
return ordered_items;
}
$.fn.distributeItemsByAttr=function(wrappers, items, order){
var counter=0;
var counter2=0;
for (var i=0; i<items.length; i++){
if(counter==wrappers.length) counter=0;
if(items[i].length > 1){
if(counter2==items[i].length) counter2=0;
wrappers[counter].append($(items[i][counter2]));
counter2++;
}else{
wrappers[counter].append($(items[i]));
}
counter++;
}}
$.fn.apply=function(settings, nrOfColumns, wrappers, items){
var _this=$(this);
var currentSize=_this.getCurrentColumnSize();
var columns=nrOfColumns;
var classStr="col-xl-" + settings.breakpoints.xl + " col-lg-"+settings.breakpoints.lg + " col-md-" + settings.breakpoints.md + " col-sm-" + settings.breakpoints.sm +" col-xs-" + settings.breakpoints.xs + " " + settings.columnClasses;
wrappers=$(this).initialize(columns, classStr);
if(settings.distributeBy.order){
_this.distributeItemsByOrder(wrappers, items);
}else if(settings.distributeBy.height){
_this.distributeItemsByHeight(wrappers, items);
}else if(settings.distributeBy.attr){
_this.distributeItemsByAttr(wrappers, _this.orderItemsByAttr(items, settings.distributeBy), settings.distributeBy);
}
return { wrappers: wrappers, items: items };}
return this.each(function (){
var _this=$(this);
var currentSize=_this.getCurrentColumnSize();
var numberOfColumns=12 / settings.breakpoints[currentSize];
var items=_this.children((settings.childrenClass!='' ? '.'+settings.childrenClass:'div'));
var wrappers=new Array();
var returns=_this.apply(settings, numberOfColumns, wrappers, items);
wrappers=returns.wrappers;
$(window).on('resize', function(e){
if(_this.getCurrentColumnSize()!=currentSize){
numberOfColumns=12 / settings.breakpoints[_this.getCurrentColumnSize()];
wrappers=$.emptyArray(wrappers);
returns=_this.apply(settings , numberOfColumns, wrappers, items);
wrappers=returns.wrappers;
currentSize=_this.getCurrentColumnSize();
}});
if(settings.hasOwnProperty('onload')){
settings.onload(items);
}});
}})(jQuery);