dojo-util
Version:
Dojo utilities including build system for optimizing JavaScript application performance, and DOH testing tool
112 lines (89 loc) • 2.77 kB
JavaScript
dojo.provide("util.docscripts.cheat.floatup");
(function(d){
function getMax(list){
return Math.max.apply(Math, list)
}
function getMin(list){
return Math.min.apply(Math, list);
}
function sum(ar){
var t = 0;
dojo.forEach(ar, function(v){ t += v });
return t;
}
d.NodeList.prototype.floatup = function(selector){
selector = selector || "> *";
return this.forEach(function(n){
var targets = d.query(selector, n),
colWidth = 254,
cols = 4,
useHighest = true,
numTargets = targets.length,
targetData = d.map(targets, function(n){ return [n, Math.floor(d.position(n).h)] });
heights = d.map(targetData, function(o){ return o[1]; }),
totalHeight = sum(heights),
// optimum is either the largest height or an average of the total height over the cols
avgHeight = totalHeight / cols,
maxHeight = getMax(heights),
optimumHeight = Math.max(avgHeight, maxHeight),
threshold = 75 // pixels to allow over/under optimum
;
function inBounds(val){
// returns bool if passed height is within bounds of optimum
var upper = optimumHeight + threshold, lower = optimumHeight - threshold;
if(val == optimumHeight || (val <= upper && val >= lower)){
return true;
}else{
return false;
}
}
function getOptimumPositions(data, sizes, cols){
// return an Array of Arrays. Each item in the top level array will be an Array
// of reference to the nodes that needs to be in the corresponding col
var col = 0;
var ret = new Array(cols + 1);
d.forEach(ret, function(i, idx){ ret[idx] = []; });
function colFromHeap(ar){
//console.warn("making col", col, ar, sum(ar), sizes.length, data.length, ret[col]);
d.forEach(ar, function(size){
var idx = d.indexOf(sizes, size);
if(~idx){
ret[col].push(data[idx][0]);
data.splice(idx, 1);
sizes.splice(idx, 1);
}else{
// console.warn("ugh?", size, sizes, idx);
}
});
// console.log(ret[col]);
col++;
}
var pass = 0;
while(sizes.length){
var heap = [];
// first size
heap.push(useHighest ? getMax(sizes) : sizes[0]);
if(!inBounds(sum(heap))){
d.forEach(sizes, function(size){
var now = sum(heap);
if(inBounds(now + size) || size < optimumHeight - now){
heap.push(size);
}
});
}
colFromHeap(heap);
}
return ret;
}
var stuff = getOptimumPositions(targetData, heights, cols);
d.forEach(stuff, function(col, idx){
var colNode = d.create("div", {
style:{ width: colWidth + "px", "float":"left" }
}, n);
d.forEach(col, function(node){
d.place(node, colNode);
});
});
});
};
})(dojo);