Commit | Line | Data |
b2fc39a5 |
1 | var labelType, useGradients, nativeTextSupport, animate; |
2 | |
3 | (function() { |
4 | var ua = navigator.userAgent, |
5 | iStuff = ua.match(/iPhone/i) || ua.match(/iPad/i), |
6 | typeOfCanvas = typeof HTMLCanvasElement, |
7 | nativeCanvasSupport = (typeOfCanvas == 'object' || typeOfCanvas == 'function'), |
8 | textSupport = nativeCanvasSupport |
9 | && (typeof document.createElement('canvas').getContext('2d').fillText == 'function'); |
10 | //I'm setting this based on the fact that ExCanvas provides text support for IE |
11 | //and that as of today iPhone/iPad current text support is lame |
12 | labelType = (!nativeCanvasSupport || (textSupport && !iStuff))? 'Native' : 'HTML'; |
13 | nativeTextSupport = labelType == 'Native'; |
14 | useGradients = nativeCanvasSupport; |
15 | animate = !(iStuff || !nativeCanvasSupport); |
16 | })(); |
17 | |
18 | var Log = { |
19 | elem: false, |
20 | write: function(text){ |
21 | if (!this.elem) |
22 | this.elem = document.getElementById('log'); |
23 | this.elem.innerHTML = text; |
24 | this.elem.style.left = (500 - this.elem.offsetWidth / 2) + 'px'; |
25 | } |
26 | }; |
27 | |
28 | |
29 | function init(){ |
30 | //init data |
31 | //end |
32 | //init TreeMap |
33 | var tm = new $jit.TM.Squarified({ |
34 | //where to inject the visualization |
35 | injectInto: 'infovis', |
36 | //show only one tree level |
37 | levelsToShow: 1, |
38 | //parent box title heights |
39 | titleHeight: 0, |
40 | //enable animations |
41 | animate: animate, |
42 | //box offsets |
43 | offset: 1, |
44 | //use canvas text |
45 | Label: { |
46 | type: labelType, |
47 | size: 9, |
48 | family: 'Tahoma, Verdana, Arial' |
49 | }, |
50 | //enable specific canvas styles |
51 | //when rendering nodes |
52 | Node: { |
53 | CanvasStyles: { |
54 | shadowBlur: 0, |
55 | shadowColor: '#000' |
56 | } |
57 | }, |
58 | //Attach left and right click events |
59 | Events: { |
60 | enable: true, |
61 | onClick: function(node) { |
62 | if(node) tm.enter(node); |
63 | }, |
64 | onRightClick: function() { |
65 | tm.out(); |
66 | }, |
67 | //change node styles and canvas styles |
68 | //when hovering a node |
69 | onMouseEnter: function(node, eventInfo) { |
70 | if(node) { |
71 | //add node selected styles and replot node |
72 | node.setCanvasStyle('shadowBlur', 7); |
73 | node.setData('color', '#888'); |
74 | tm.fx.plotNode(node, tm.canvas); |
75 | tm.labels.plotLabel(tm.canvas, node); |
76 | } |
77 | }, |
78 | onMouseLeave: function(node) { |
79 | if(node) { |
80 | node.removeData('color'); |
81 | node.removeCanvasStyle('shadowBlur'); |
82 | tm.plot(); |
83 | } |
84 | } |
85 | }, |
86 | //duration of the animations |
87 | duration: 1000, |
88 | //Enable tips |
89 | Tips: { |
90 | enable: true, |
91 | type: 'Native', |
92 | //add positioning offsets |
93 | offsetX: 20, |
94 | offsetY: 20, |
95 | //implement the onShow method to |
96 | //add content to the tooltip when a node |
97 | //is hovered |
98 | onShow: function(tip, node, isLeaf, domElement) { |
99 | var html = "<div class=\"tip-title\">" + node.name |
100 | + "</div><div class=\"tip-text\">"; |
101 | var data = node.data; |
102 | if(data.artist) { |
103 | html += "Artist: " + data.artist + "<br />"; |
104 | } |
105 | if(data.playcount) { |
106 | html += "Play count: " + data.playcount; |
107 | } |
108 | if(data.image) { |
109 | html += "<img src=\""+ data.image +"\" class=\"album\" />"; |
110 | } |
111 | tip.innerHTML = html; |
112 | } |
113 | }, |
114 | //Implement this method for retrieving a requested |
115 | //subtree that has as root a node with id = nodeId, |
116 | //and level as depth. This method could also make a server-side |
117 | //call for the requested subtree. When completed, the onComplete |
118 | //callback method should be called. |
119 | request: function(nodeId, level, onComplete){ |
120 | if (true) { |
121 | jQuery.getJSON('jit_tree/'+nodeId+'/3', function(data) { |
122 | onComplete.onComplete(nodeId, data); |
123 | }); |
124 | } |
125 | else { |
126 | var tree = memnodes[0]; |
127 | var subtree = $jit.json.getSubtree(tree, nodeId); |
128 | $jit.json.prune(subtree, 2); |
129 | onComplete.onComplete(nodeId, subtree); |
130 | } |
131 | }, |
132 | //Add the name of the node in the corresponding label |
133 | //This method is called once, on label creation and only for DOM labels. |
134 | onCreateLabel: function(domElement, node){ |
135 | domElement.innerHTML = node.name; |
136 | } |
137 | }); |
138 | |
139 | if(true) { |
140 | jQuery.getJSON('jit_tree/1/2', function(data) { |
141 | console.log(data); |
142 | tm.loadJSON(data); |
143 | tm.refresh(); |
144 | }); |
145 | } |
146 | else { |
147 | //var pjson = eval('(' + json + ')'); |
148 | var pjson = memnodes[0]; |
149 | $jit.json.prune(pjson, 2); |
150 | console.log(pjson); |
151 | tm.loadJSON(pjson); |
152 | tm.refresh(); |
153 | } |
154 | |
155 | var sq = $jit.id('r-sq'), |
156 | st = $jit.id('r-st'), |
157 | sd = $jit.id('r-sd'); |
158 | var util = $jit.util; |
159 | util.addEvent(sq, 'change', function() { |
160 | if(!sq.checked) return; |
161 | util.extend(tm, new $jit.Layouts.TM.Squarified); |
162 | tm.refresh(); |
163 | }); |
164 | util.addEvent(st, 'change', function() { |
165 | if(!st.checked) return; |
166 | util.extend(tm, new $jit.Layouts.TM.Strip); |
167 | tm.layout.orientation = "v"; |
168 | tm.refresh(); |
169 | }); |
170 | util.addEvent(sd, 'change', function() { |
171 | if(!sd.checked) return; |
172 | util.extend(tm, new $jit.Layouts.TM.SliceAndDice); |
173 | tm.layout.orientation = "v"; |
174 | tm.refresh(); |
175 | }); |
176 | //add event to the back button |
177 | var back = $jit.id('back'); |
178 | $jit.util.addEvent(back, 'click', function() { |
179 | tm.out(); |
180 | }); |
181 | } |