/**
 * Select blocks and spread them across column nodes to equalize the column heights.
 * @author Karl von Randow
 * @version 1.0
 */

jQuery.fn.blockColumnize = function(options) {
	$(this).each(function() {
		var blocks = $(this).find(options.elements);
		var columns = $(this).find(options.columns);
		
		var totalHeight = 0;
		for (var i = 0; i < blocks.length; i++)
			totalHeight += $(blocks[i]).height();
			
		var heightPerColumn = Math.round(totalHeight / columns.length);
		var j = 0;
		for (var i = 0; i < columns.length; i++) {
			var columnHeight = 0;
			/* Place a block in a column if the column is under height and there are blocks remaining, and
			 * there are enough blocks remaining to fill all remaining columns and we've already put something
			 * in this column.
			 */
			while (columnHeight < heightPerColumn && j < blocks.length && (columnHeight == 0 || (blocks.length - j) >= (columns.length - i))) {
				var block = $(blocks[j++]);
				block.appendTo($(columns[i]));
				columnHeight += block.height();
			}
		}
	});
	
	return this;
};

jQuery.fn.blockDistribute = function(options) {
	$(this).each(function() {
		var columns = $(this).find(options.columns);
		
		var blocksPerColumn = [];
		for (var i = 0; i < columns.length; i++) {
			blocksPerColumn.push($(columns[i]).find(options.elements));
		}
		var blocks = interleave(blocksPerColumn);
		
		var col = 0;
		var row = [];
		for (var i = 0; i < blocks.length; i++) {
			$(blocks[i]).appendTo($(columns[col]));
			row.push(blocks[i]);
			if (++col >= columns.length) {
				$(row).equalize("height");
				col = 0;
				row = [];
			}
		}
	});
	
	return this;
	
	function interleave(arrays) {
		var n = 0;
		for (var i = 0; i < arrays.length; i++)
			if (arrays[i].length > n)
				n = arrays[i].length;
		
		var result = [];
		for (var i = 0; i < n; i++)
			for (var j = 0; j < arrays.length; j++)
				if (i < arrays[j].length)
					result.push(arrays[j][i]);
		return result;
	}
};

/*

		for (var i = 0; i < columns.length && j < blocks.length; i++) {
			var columnHeight = 0;
			while (j < blocks.length) {
				var block = $(blocks[j]);
				var blockHeight = block.height();
				if (columnHeight == 0 || columnHeight + blockHeight < heightPerColumn) {
					block.appendTo($(columns[i]));
					columnHeight += blockHeight;
					j++;
				} else {
					break;
				}
			}
		}
*/
