(function($) { //BlocksIt default options var blocksOptions = { numOfCol: 3, offsetX: 5, offsetY: 5, blockElement: 'div' }; //dynamic variable var container, colwidth; var blockarr = []; //ie indexOf fix if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(elt /*, from*/) { var len = this.length >>> 0; var from = Number(arguments[1]) || 0; from = (from < 0) ? Math.ceil(from) : Math.floor(from); if (from < 0) from += len; for (; from < len; from++) { if (from in this && this[from] === elt) return from; } return -1; }; } //create empty blockarr var createEmptyBlockarr = function() { //empty blockarr blockarr = []; for(var i=0; i 1) { //prevent extra loop var arrlimit = blockarr.length - size; //define temp variable var defined = false; var tempHeight, tempIndex; for(var i=0; i= 0 && x <= arrlimit) { var heightarr = getHeightArr(x, size); //get shortest group blocks if(!defined) { defined = true; tempHeight = heightarr; tempIndex = x; } else { if(heightarr[1] < tempHeight[1]) { tempHeight = heightarr; tempIndex = x; } } } } return [tempIndex, tempHeight[1]]; } else { //simple check for block with width 1 tempHeight = getHeightArr(0, blockarr.length); return [tempHeight[2], tempHeight[0]]; } } //set block position var setPosition = function(obj, index) { //check block size if(!obj.data('size') || obj.data('size') < 0) { obj.data('size', 1); } else if(obj.data('size') > blocksOptions.numOfCol) { obj.data('size', blocksOptions.numOfCol); } //define block data var pos = getBlockPostion(obj.data('size')); var blockWidth = colwidth * obj.data('size') - (obj.outerWidth() - obj.width()); //update style first before get object height obj.css({ 'width': blockWidth - blocksOptions.offsetX*2, 'left': pos[0] * colwidth+blocksOptions.offsetX, 'top': pos[1], 'position': 'absolute' }); var blockHeight = obj.outerHeight(); //modify blockarr for new block blockarrRemove(pos[0], obj.data('size')); blockarrPush(obj.attr('id'), pos[0], pos[1], obj.data('size'), blockHeight); } $.fn.BlocksIt = function(options) { //BlocksIt options if (options && typeof options === 'object') { $.extend(blocksOptions, options); } container = $(this); colwidth = container.width() / blocksOptions.numOfCol; //create empty blockarr createEmptyBlockarr(); container.children(blocksOptions.blockElement).each(function(e) { setPosition($(this), e); }); //set final height of container var heightarr = getHeightArr(0, blockarr.length); container.height(heightarr[1] + blocksOptions.offsetY); return this; } })(jQuery);