Moved project files to wolnelektury directory.
[wolnelektury.git] / wolnelektury / media / js / jquery.autocolumn.js
diff --git a/wolnelektury/media/js/jquery.autocolumn.js b/wolnelektury/media/js/jquery.autocolumn.js
new file mode 100644 (file)
index 0000000..ea896b6
--- /dev/null
@@ -0,0 +1,202 @@
+// 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);