--- /dev/null
+// version 1.1.0
+// http://welcome.totheinter.net/columnizer-jquery-plugin/
+// created by: Adam Wulf adam.wulf@gmail.com
+
+(function($){
+ $.fn.columnize = function(options) {
+
+
+ var defaults = {
+ width: 400,
+ columns : false,
+ buildOnce : false
+ };
+ var options = $.extend(defaults, options);
+
+ return this.each(function() {
+ var $inBox = $(this);
+ var maxHeight = $inBox.height();
+ var $cache = $('<div></div>'); // this is where we'll put the real content
+ var lastWidth = 0;
+ var columnizing = false;
+ $cache.append($inBox.children().clone());
+
+ columnizeIt();
+
+ $(window).resize(function() {
+ if(!options.buildOnce && $.browser.msie){
+ if($inBox.data("timeout")){
+ clearTimeout($inBox.data("timeout"));
+ }
+ $inBox.data("timeout", setTimeout(columnizeIt, 200));
+ }else if(!options.buildOnce){
+ columnizeIt();
+ }else{
+ // don't rebuild
+ }
+ });
+
+ /**
+ * return a node that has a height
+ * less than or equal to height
+ *
+ * @param putInHere, a dom element
+ * @$pullOutHere, a jQuery element
+ */
+ function columnize($putInHere, $pullOutHere, $parentColumn, height){
+ while($parentColumn.height() < height &&
+ $pullOutHere[0].childNodes.length){
+ $putInHere.append($pullOutHere[0].childNodes[0]);
+ }
+ if($putInHere[0].childNodes.length == 0) return;
+
+ // now we're too tall, undo the last one
+ var kids = $putInHere[0].childNodes;
+ var lastKid = kids[kids.length-1];
+ $putInHere[0].removeChild(lastKid);
+ var $item = $(lastKid);
+ if($item[0].nodeType == 3){
+ // it's a text node, split it up
+ var oText = $item[0].nodeValue;
+ var counter2 = options.width / 8;
+ var columnText;
+ while($parentColumn.height() < height && oText.length){
+ if (oText.indexOf(' ', counter2) != '-1') {
+ columnText = oText.substring(0, oText.indexOf(' ', counter2));
+ } else {
+ columnText = oText;
+ }
+ $putInHere.append(document.createTextNode(columnText));
+ if(oText.length > counter2){
+ oText = oText.substring(oText.indexOf(' ', counter2));
+ }else{
+ oText = "";
+ }
+ }
+ if(oText.length){
+ $item[0].nodeValue = oText;
+ }else{
+ return;
+ }
+ }
+
+ if($pullOutHere.children().length){
+ $pullOutHere.prepend($item);
+ }else{
+ $pullOutHere.append($item);
+ }
+ }
+
+ function split($putInHere, $pullOutHere, $parentColumn, height){
+ if($pullOutHere.children().length){
+ $cloneMe = $pullOutHere.children(":first");
+ $clone = $cloneMe.clone();
+ if($clone.attr("nodeType") == 1){
+ $putInHere.append($clone);
+ if($clone.is("img") && $parentColumn.height() < height + 20){
+ $cloneMe.remove();
+ }else if(!$cloneMe.hasClass("dontsplit") && $parentColumn.height() < height + 20){
+ $cloneMe.remove();
+ }else if($clone.is("img") || $cloneMe.hasClass("dontsplit")){
+ $clone.remove();
+ }else{
+ $clone.empty();
+ columnize($clone, $cloneMe, $parentColumn, height);
+ if($cloneMe.children().length){
+ split($clone, $cloneMe, $parentColumn, height);
+ }
+ }
+ }
+ }
+ }
+
+
+ function singleColumnizeIt() {
+ if ($inBox.data("columnized") && $inBox.children().length == 1) {
+ return;
+ }
+ $inBox.data("columnized", true);
+ $inBox.data("columnizing", true);
+
+ $inBox.empty();
+ $inBox.append($("<div class='first last column'></div>")); //"
+ $col = $inBox.children().eq($inBox.children().length-1);
+ $col.append($cache.clone());
+
+ $inBox.data("columnizing", false);
+ }
+
+
+ function columnizeIt() {
+ if(lastWidth == $inBox.width()) return;
+ lastWidth = $inBox.width();
+
+ var numCols = Math.round($inBox.width() / options.width);
+ if(options.columns) numCols = options.columns;
+// if ($inBox.data("columnized") && numCols == $inBox.children().length) {
+// return;
+// }
+ if(numCols <= 1){
+ return singleColumnizeIt();
+ }
+ if($inBox.data("columnizing")) return;
+ $inBox.data("columnized", true);
+ $inBox.data("columnizing", true);
+
+ $inBox.empty();
+ $inBox.append($("<div style='width:" + (Math.round(100 / numCols) - 2)+ "%; padding: 3px; float: left;'></div>")); //"
+ $col = $inBox.children(":last");
+ $col.append($cache.clone());
+ maxHeight = $col.height();
+ $inBox.empty();
+
+ var targetHeight = maxHeight / numCols;
+ var firstTime = true;
+ var maxLoops = 3;
+ for(var loopCount=0;loopCount<maxLoops;loopCount++){
+ $inBox.empty();
+ var $destroyable = $cache.clone();
+ $destroyable.css("visibility", "hidden");
+ // create the columns
+ for (var i = 0; i < numCols; i++) {
+ /* create column */
+ var className = (i == 0) ? "first column" : "column";
+ var className = (i == numCols - 1) ? ("last " + className) : className;
+ $inBox.append($("<div class='" + className + "' style='width:" + (Math.round(100 / numCols) - 2)+ "%; float: left;'></div>")); //"
+ }
+
+ // fill all but the last column
+ for (var i = 0; i < numCols-1; i++) {
+ var $col = $inBox.children().eq(i);
+ columnize($col, $destroyable, $col, targetHeight);
+ split($col, $destroyable, $col, targetHeight);
+ }
+ // the last column in the series
+ $col = $inBox.children().eq($inBox.children().length-1);
+ while($destroyable.children().length) $col.append($destroyable.children(":first"));
+ var afterH = $col.height();
+ var diff = afterH - targetHeight;
+ var totalH = 0;
+ var min = 10000000;
+ var max = 0;
+ $inBox.children().each(function($inBox){ return function($item){
+ var h = $inBox.children().eq($item).height();
+ totalH += h;
+ if(h > max) max = h;
+ if(h < min) min = h;
+ }}($inBox));
+ var avgH = totalH / numCols;
+ if(max - min > 30){
+ targetHeight = avgH + 30;
+ }else if(Math.abs(avgH-targetHeight) > 20){
+ targetHeight = avgH;
+ }else{
+ loopCount = maxLoops;
+ }
+ $inBox.append($("<br style='clear:both;'>"));
+ }
+ $inBox.data("columnizing", false);
+ }
+ });
+ };
+})(jQuery);