var labelType, useGradients, nativeTextSupport, animate;
(function() {
var ua = navigator.userAgent,
iStuff = ua.match(/iPhone/i) || ua.match(/iPad/i),
typeOfCanvas = typeof HTMLCanvasElement,
nativeCanvasSupport = (typeOfCanvas == 'object' || typeOfCanvas == 'function'),
textSupport = nativeCanvasSupport
&& (typeof document.createElement('canvas').getContext('2d').fillText == 'function');
//I'm setting this based on the fact that ExCanvas provides text support for IE
//and that as of today iPhone/iPad current text support is lame
labelType = (!nativeCanvasSupport || (textSupport && !iStuff))? 'Native' : 'HTML';
nativeTextSupport = labelType == 'Native';
useGradients = nativeCanvasSupport;
animate = !(iStuff || !nativeCanvasSupport);
})();
var icicle;
function icicle_init(icicle_json){
//left panel controls
controls();
// end
// init Icicle
icicle = new $jit.Icicle({
// id of the visualization container
injectInto: 'infovis',
// whether to add transition animations
animate: animate,
// nodes offset
offset: 1,
// whether to add cushion type nodes
cushion: false,
//show only three levels at a time
constrained: true,
levelsToShow: 3,
// enable tips
Tips: {
enable: true,
type: 'Native',
// add positioning offsets
offsetX: 20,
offsetY: 20,
// implement the onShow method to
// add content to the tooltip when a node
// is hovered
onShow: function(tip, node){
// count children
var count = 0;
node.eachSubnode(function(){
count++;
});
// add tooltip info
prettyPath = node.id.substring( 5 ).replace( /:/g, '/' );
prettyPath = prettyPath.replace(/\^/g, ' Size: ' );
prettyPath = prettyPath.replace(/~/g, ' ' );
tip.innerHTML = "
Path: " + prettyPath
+ "
" + count + " subdirectories
";
}
},
// Add events to nodes
Events: {
enable: true,
onMouseEnter: function(node) {
//add border and replot node
node.setData('border', '#33dddd');
icicle.fx.plotNode(node, icicle.canvas);
icicle.labels.plotLabel(icicle.canvas, node, icicle.controller);
},
onMouseLeave: function(node) {
node.removeData('border');
icicle.fx.plot();
},
onClick: function(node){
if (node) {
//hide tips and selections
icicle.tips.hide();
if(icicle.events.hoveredNode)
this.onMouseLeave(icicle.events.hoveredNode);
//perform the enter animation
icicle.enter(node);
}
},
onRightClick: function(){
//hide tips and selections
icicle.tips.hide();
if(icicle.events.hoveredNode)
this.onMouseLeave(icicle.events.hoveredNode);
//perform the out animation
icicle.out();
}
},
// Add canvas label styling
Label: {
type: labelType // "Native" or "HTML"
},
// Add the name of the node in the corresponding label
// This method is called once, on label creation and only for DOM and not
// Native labels.
onCreateLabel: function(domElement, node){
domElement.innerHTML = node.name;
var style = domElement.style;
style.fontSize = '0.9em';
style.display = '';
style.cursor = 'pointer';
style.color = '#333';
style.overflow = 'hidden';
},
// Change some label dom properties.
// This method is called each time a label is plotted.
onPlaceLabel: function(domElement, node){
var style = domElement.style,
width = node.getData('width'),
height = node.getData('height');
if(width < 7 || height < 7) {
style.display = 'none';
} else {
style.display = '';
style.width = width + 'px';
style.height = height + 'px';
}
}
});
// load data
//alert( icicle_json);
icicle.loadJSON( jQuery.parseJSON(icicle_json) );
// compute positions and plot
icicle.refresh();
//end
}
//init controls
function controls() {
var jit = $jit;
var gotoparent = jit.id('update');
jit.util.addEvent(gotoparent, 'click', function() {
icicle.out();
});
var select = jit.id('s-orientation');
jit.util.addEvent(select, 'change', function () {
icicle.layout.orientation = select[select.selectedIndex].value;
icicle.refresh();
});
var levelsToShowSelect = jit.id('i-levels-to-show');
jit.util.addEvent(levelsToShowSelect, 'change', function () {
var index = levelsToShowSelect.selectedIndex;
if(index == 0) {
icicle.config.constrained = false;
} else {
icicle.config.constrained = true;
icicle.config.levelsToShow = index;
}
icicle.refresh();
});
}
//end
function strrchr (haystack, needle) {
// Finds the last occurrence of a character in a string within another
//
// version: 1101.3117
// discuss at: http://phpjs.org/functions/strrchr // + original by: Brett Zamir (http://brett-zamir.me)
// + input by: Jason Wong (http://carrot.org/)
// + bugfixed by: Brett Zamir (http://brett-zamir.me)
// * example 1: strrchr("Line 1\nLine 2\nLine 3", 10).substr(1)
// * returns 1: 'Line 3' var pos = 0;
if (typeof needle !== 'string') {
needle = String.fromCharCode(parseInt(needle, 10));
} needle = needle.charAt(0);
pos = haystack.lastIndexOf(needle);
if (pos === -1) {
return false;
}
return haystack.substr(pos);
}