pyk 0.2.6 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. checksums.yaml +8 -8
  2. data/app/assets/javascripts/lib/chardinjs.min.js +2 -0
  3. data/app/assets/javascripts/lib/crossfilter.js +1383 -1
  4. data/app/assets/javascripts/lib/{d3.js → d3.v3.js} +0 -0
  5. data/app/assets/javascripts/lib/dc.js +3492 -757
  6. data/app/assets/javascripts/lib/jquery.gridster.js +2 -3621
  7. data/app/assets/javascripts/lib/markermanager.js +2 -980
  8. data/app/assets/javascripts/lib/underscore.js +1276 -0
  9. data/app/assets/javascripts/nvd3/lib/colorbrewer.js +302 -0
  10. data/app/assets/javascripts/nvd3/lib/crossfilter.js +1180 -0
  11. data/app/assets/javascripts/nvd3/lib/crossfilter.min.js +1 -0
  12. data/app/assets/javascripts/nvd3/lib/d3.v2.js +7033 -0
  13. data/app/assets/javascripts/nvd3/lib/d3.v2.min.js +4 -0
  14. data/app/assets/javascripts/nvd3/lib/d3.v3.js +8436 -0
  15. data/app/assets/javascripts/nvd3/lib/fisheye.js +86 -0
  16. data/app/assets/javascripts/nvd3/lib/hive.js +80 -0
  17. data/app/assets/javascripts/nvd3/lib/horizon.js +192 -0
  18. data/app/assets/javascripts/nvd3/lib/sankey.js +292 -0
  19. data/app/assets/javascripts/nvd3/nv.d3.js +14312 -0
  20. data/app/assets/javascripts/nvd3/nv.d3.min.js +6 -0
  21. data/app/assets/javascripts/nvd3/src/core.js +122 -0
  22. data/app/assets/javascripts/nvd3/src/interactiveLayer.js +251 -0
  23. data/app/assets/javascripts/nvd3/src/models/axis.js +405 -0
  24. data/app/assets/javascripts/nvd3/src/models/backup/bullet.js +250 -0
  25. data/app/assets/javascripts/nvd3/src/models/backup/bulletChart.js +349 -0
  26. data/app/assets/javascripts/nvd3/src/models/boilerplate.js +104 -0
  27. data/app/assets/javascripts/nvd3/src/models/bullet.js +385 -0
  28. data/app/assets/javascripts/nvd3/src/models/bulletChart.js +343 -0
  29. data/app/assets/javascripts/nvd3/src/models/cumulativeLineChart.js +782 -0
  30. data/app/assets/javascripts/nvd3/src/models/discreteBar.js +349 -0
  31. data/app/assets/javascripts/nvd3/src/models/discreteBarChart.js +333 -0
  32. data/app/assets/javascripts/nvd3/src/models/distribution.js +148 -0
  33. data/app/assets/javascripts/nvd3/src/models/historicalBar.js +331 -0
  34. data/app/assets/javascripts/nvd3/src/models/historicalBarChart.js +419 -0
  35. data/app/assets/javascripts/nvd3/src/models/indentedTree.js +337 -0
  36. data/app/assets/javascripts/nvd3/src/models/legend.js +270 -0
  37. data/app/assets/javascripts/nvd3/src/models/line.js +284 -0
  38. data/app/assets/javascripts/nvd3/src/models/lineChart.js +465 -0
  39. data/app/assets/javascripts/nvd3/src/models/linePlusBarChart.js +433 -0
  40. data/app/assets/javascripts/nvd3/src/models/linePlusBarWithFocusChart.js +658 -0
  41. data/app/assets/javascripts/nvd3/src/models/lineWithFisheye.js +200 -0
  42. data/app/assets/javascripts/nvd3/src/models/lineWithFisheyeChart.js +297 -0
  43. data/app/assets/javascripts/nvd3/src/models/lineWithFocusChart.js +574 -0
  44. data/app/assets/javascripts/nvd3/src/models/multiBar.js +461 -0
  45. data/app/assets/javascripts/nvd3/src/models/multiBarChart.js +524 -0
  46. data/app/assets/javascripts/nvd3/src/models/multiBarHorizontal.js +424 -0
  47. data/app/assets/javascripts/nvd3/src/models/multiBarHorizontalChart.js +434 -0
  48. data/app/assets/javascripts/nvd3/src/models/multiBarTimeSeries.js +384 -0
  49. data/app/assets/javascripts/nvd3/src/models/multiBarTimeSeriesChart.js +405 -0
  50. data/app/assets/javascripts/nvd3/src/models/multiChart.js +452 -0
  51. data/app/assets/javascripts/nvd3/src/models/ohlcBar.js +380 -0
  52. data/app/assets/javascripts/nvd3/src/models/parallelCoordinates.js +239 -0
  53. data/app/assets/javascripts/nvd3/src/models/pie.js +398 -0
  54. data/app/assets/javascripts/nvd3/src/models/pieChart.js +292 -0
  55. data/app/assets/javascripts/nvd3/src/models/scatter.js +674 -0
  56. data/app/assets/javascripts/nvd3/src/models/scatterChart.js +628 -0
  57. data/app/assets/javascripts/nvd3/src/models/scatterPlusLineChart.js +620 -0
  58. data/app/assets/javascripts/nvd3/src/models/sparkline.js +194 -0
  59. data/app/assets/javascripts/nvd3/src/models/sparklinePlus.js +295 -0
  60. data/app/assets/javascripts/nvd3/src/models/stackedArea.js +368 -0
  61. data/app/assets/javascripts/nvd3/src/models/stackedAreaChart.js +629 -0
  62. data/app/assets/javascripts/nvd3/src/tooltip.js +490 -0
  63. data/app/assets/javascripts/nvd3/src/utils.js +152 -0
  64. data/app/assets/javascripts/pyk.js +1 -0
  65. data/app/assets/stylesheets/lib/chardinjs.css +82 -0
  66. data/app/assets/stylesheets/nvd3/nv.d3.css +769 -0
  67. data/app/assets/stylesheets/pyk.css.scss +1 -0
  68. metadata +61 -2
@@ -0,0 +1,250 @@
1
+
2
+ // Chart design based on the recommendations of Stephen Few. Implementation
3
+ // based on the work of Clint Ivy, Jamie Love, and Jason Davies.
4
+ // http://projects.instantcognition.com/protovis/bulletchart/
5
+
6
+ nv.models.bullet = function() {
7
+
8
+ //============================================================
9
+ // Public Variables with Default Settings
10
+ //------------------------------------------------------------
11
+
12
+ var margin = {top: 0, right: 0, bottom: 0, left: 0}
13
+ , orient = 'left' // TODO top & bottom
14
+ , reverse = false
15
+ , ranges = function(d) { return d.ranges }
16
+ , markers = function(d) { return d.markers }
17
+ , measures = function(d) { return d.measures }
18
+ , forceX = [0] // List of numbers to Force into the X scale (ie. 0, or a max / min, etc.)
19
+ , width = 380
20
+ , height = 30
21
+ , tickFormat = null
22
+ , dispatch = d3.dispatch('elementMouseover', 'elementMouseout')
23
+ ;
24
+
25
+ //============================================================
26
+
27
+
28
+ function chart(selection) {
29
+ selection.each(function(d, i) {
30
+ var availableWidth = width - margin.left - margin.right,
31
+ availableHeight = height - margin.top - margin.bottom,
32
+ container = d3.select(this),
33
+ mainGroup = nv.log(this.parentNode.parentNode).getAttribute('transform'),
34
+ heightFromTop = nv.log(parseInt(mainGroup.replace(/.*,(\d+)\)/,"$1"))); //TODO: There should be a smarter way to get this value
35
+
36
+ var rangez = ranges.call(this, d, i).slice().sort(d3.descending),
37
+ markerz = markers.call(this, d, i).slice().sort(d3.descending),
38
+ measurez = measures.call(this, d, i).slice().sort(d3.descending);
39
+
40
+
41
+ //------------------------------------------------------------
42
+ // Setup Scales
43
+
44
+ // Compute the new x-scale.
45
+ var MaxX = Math.max(rangez[0] ? rangez[0]:0 , markerz[0] ? markerz[0] : 0 , measurez[0] ? measurez[0] : 0)
46
+ var x1 = d3.scale.linear()
47
+ .domain([0, MaxX]).nice() // TODO: need to allow forceX and forceY, and xDomain, yDomain
48
+ .range(reverse ? [availableWidth, 0] : [0, availableWidth]);
49
+
50
+ // Retrieve the old x-scale, if this is an update.
51
+ var x0 = this.__chart__ || d3.scale.linear()
52
+ .domain([0, Infinity])
53
+ .range(x1.range());
54
+
55
+ // Stash the new scale.
56
+ this.__chart__ = x1;
57
+
58
+ //------------------------------------------------------------
59
+
60
+
61
+ //------------------------------------------------------------
62
+ // Setup containers and skeleton of chart
63
+
64
+ var wrap = container.selectAll('g.nv-wrap.nv-bullet').data([d]);
65
+ var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-bullet');
66
+ var gEnter = wrapEnter.append('g');
67
+ var g = wrap.select('g');
68
+
69
+ wrap.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
70
+
71
+ //------------------------------------------------------------
72
+
73
+
74
+
75
+ var w0 = function(d) { return Math.abs(x0(d) - x0(0)) }, // TODO: could optimize by precalculating x0(0) and x1(0)
76
+ w1 = function(d) { return Math.abs(x1(d) - x1(0)) };
77
+
78
+
79
+ // Update the range rects.
80
+ var range = g.selectAll('rect.nv-range')
81
+ .data(rangez);
82
+
83
+ range.enter().append('rect')
84
+ .attr('class', function(d, i) { return 'nv-range nv-s' + i; })
85
+ .attr('width', w0)
86
+ .attr('height', availableHeight)
87
+ .attr('x', reverse ? x0 : 0)
88
+ .on('mouseover', function(d,i) {
89
+ dispatch.elementMouseover({
90
+ value: d,
91
+ label: (i <= 0) ? 'Maximum' : (i > 1) ? 'Minimum' : 'Mean', //TODO: make these labels a variable
92
+ pos: [x1(d), heightFromTop]
93
+ })
94
+ })
95
+ .on('mouseout', function(d,i) {
96
+ dispatch.elementMouseout({
97
+ value: d,
98
+ label: (i <= 0) ? 'Minimum' : (i >=1) ? 'Maximum' : 'Mean' //TODO: make these labels a variable
99
+ })
100
+ })
101
+
102
+ d3.transition(range)
103
+ .attr('x', reverse ? x1 : 0)
104
+ .attr('width', w1)
105
+ .attr('height', availableHeight);
106
+
107
+
108
+ // Update the measure rects.
109
+ var measure = g.selectAll('rect.nv-measure')
110
+ .data(measurez);
111
+
112
+ measure.enter().append('rect')
113
+ .attr('class', function(d, i) { return 'nv-measure nv-s' + i; })
114
+ .attr('width', w0)
115
+ .attr('height', availableHeight / 3)
116
+ .attr('x', reverse ? x0 : 0)
117
+ .attr('y', availableHeight / 3)
118
+ .on('mouseover', function(d) {
119
+ dispatch.elementMouseover({
120
+ value: d,
121
+ label: 'Current', //TODO: make these labels a variable
122
+ pos: [x1(d), heightFromTop]
123
+ })
124
+ })
125
+ .on('mouseout', function(d) {
126
+ dispatch.elementMouseout({
127
+ value: d,
128
+ label: 'Current' //TODO: make these labels a variable
129
+ })
130
+ })
131
+
132
+ d3.transition(measure)
133
+ .attr('width', w1)
134
+ .attr('height', availableHeight / 3)
135
+ .attr('x', reverse ? x1 : 0)
136
+ .attr('y', availableHeight / 3);
137
+
138
+
139
+
140
+ // Update the marker lines.
141
+ var marker = g.selectAll('path.nv-markerTriangle')
142
+ .data(markerz);
143
+
144
+ var h3 = availableHeight / 6;
145
+ marker.enter().append('path')
146
+ .attr('class', 'nv-markerTriangle')
147
+ .attr('transform', function(d) { return 'translate(' + x0(d) + ',' + (availableHeight / 2) + ')' })
148
+ .attr('d', 'M0,' + h3 + 'L' + h3 + ',' + (-h3) + ' ' + (-h3) + ',' + (-h3) + 'Z')
149
+ .on('mouseover', function(d,i) {
150
+ dispatch.elementMouseover({
151
+ value: d,
152
+ label: 'Previous',
153
+ pos: [x1(d), heightFromTop]
154
+ })
155
+ })
156
+ .on('mouseout', function(d,i) {
157
+ dispatch.elementMouseout({
158
+ value: d,
159
+ label: 'Previous'
160
+ })
161
+ });
162
+
163
+ d3.transition(marker)
164
+ .attr('transform', function(d) { return 'translate(' + x1(d) + ',' + (availableHeight / 2) + ')' });
165
+
166
+ marker.exit().remove();
167
+
168
+ });
169
+
170
+ d3.timer.flush();
171
+
172
+ return chart;
173
+ }
174
+
175
+
176
+ //============================================================
177
+ // Expose Public Variables
178
+ //------------------------------------------------------------
179
+
180
+ chart.dispatch = dispatch;
181
+
182
+ // left, right, top, bottom
183
+ chart.orient = function(_) {
184
+ if (!arguments.length) return orient;
185
+ orient = _;
186
+ reverse = orient == 'right' || orient == 'bottom';
187
+ return chart;
188
+ };
189
+
190
+ // ranges (bad, satisfactory, good)
191
+ chart.ranges = function(_) {
192
+ if (!arguments.length) return ranges;
193
+ ranges = _;
194
+ return chart;
195
+ };
196
+
197
+ // markers (previous, goal)
198
+ chart.markers = function(_) {
199
+ if (!arguments.length) return markers;
200
+ markers = _;
201
+ return chart;
202
+ };
203
+
204
+ // measures (actual, forecast)
205
+ chart.measures = function(_) {
206
+ if (!arguments.length) return measures;
207
+ measures = _;
208
+ return chart;
209
+ };
210
+
211
+ chart.forceX = function(_) {
212
+ if (!arguments.length) return forceX;
213
+ forceX = _;
214
+ return chart;
215
+ };
216
+
217
+ chart.width = function(_) {
218
+ if (!arguments.length) return width;
219
+ width = _;
220
+ return chart;
221
+ };
222
+
223
+ chart.height = function(_) {
224
+ if (!arguments.length) return height;
225
+ height = _;
226
+ return chart;
227
+ };
228
+
229
+ chart.margin = function(_) {
230
+ if (!arguments.length) return margin;
231
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
232
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
233
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
234
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
235
+ return chart;
236
+ };
237
+
238
+ chart.tickFormat = function(_) {
239
+ if (!arguments.length) return tickFormat;
240
+ tickFormat = _;
241
+ return chart;
242
+ };
243
+
244
+ //============================================================
245
+
246
+
247
+ return chart;
248
+ };
249
+
250
+
@@ -0,0 +1,349 @@
1
+
2
+ // Chart design based on the recommendations of Stephen Few. Implementation
3
+ // based on the work of Clint Ivy, Jamie Love, and Jason Davies.
4
+ // http://projects.instantcognition.com/protovis/bulletchart/
5
+ nv.models.bulletChart = function() {
6
+
7
+ //============================================================
8
+ // Public Variables with Default Settings
9
+ //------------------------------------------------------------
10
+
11
+ var bullet = nv.models.bullet()
12
+ ;
13
+
14
+ var orient = 'left' // TODO top & bottom
15
+ , reverse = false
16
+ , margin = {top: 5, right: 40, bottom: 20, left: 120}
17
+ , ranges = function(d) { return d.ranges }
18
+ , markers = function(d) { return d.markers }
19
+ , measures = function(d) { return d.measures }
20
+ , width = null
21
+ , height = 55
22
+ , tickFormat = null
23
+ , tooltips = true
24
+ , tooltip = function(key, x, y, e, graph) {
25
+ return '<h3>' + e.label + '</h3>' +
26
+ '<p>' + e.value + '</p>'
27
+ }
28
+ , noData = "No Data Available."
29
+ , dispatch = d3.dispatch('tooltipShow', 'tooltipHide')
30
+ ;
31
+
32
+ //============================================================
33
+
34
+
35
+ //============================================================
36
+ // Private Variables
37
+ //------------------------------------------------------------
38
+
39
+ var showTooltip = function(e, parentElement) {
40
+ var offsetElement = parentElement.parentNode.parentNode,
41
+ left = e.pos[0] + offsetElement.offsetLeft + margin.left,
42
+ top = e.pos[1] + offsetElement.offsetTop + margin.top;
43
+
44
+ var content = '<h3>' + e.label + '</h3>' +
45
+ '<p>' + e.value + '</p>';
46
+
47
+ nv.tooltip.show([left, top], content, e.value < 0 ? 'e' : 'w', null, offsetElement.parentNode);
48
+ };
49
+
50
+ //============================================================
51
+
52
+
53
+ function chart(selection) {
54
+ selection.each(function(d, i) {
55
+ var container = d3.select(this);
56
+
57
+ var availableWidth = (width || parseInt(container.style('width')) || 960)
58
+ - margin.left - margin.right,
59
+ availableHeight = height - margin.top - margin.bottom,
60
+ that = this;
61
+
62
+
63
+ chart.update = function() { chart(selection) };
64
+ chart.container = this;
65
+
66
+ //------------------------------------------------------------
67
+ // Display No Data message if there's nothing to show.
68
+
69
+ /*
70
+ // Disabled until I figure out a better way to check for no data with the bullet chart
71
+ if (!data || !data.length || !data.filter(function(d) { return d.values.length }).length) {
72
+ var noDataText = container.selectAll('.nv-noData').data([noData]);
73
+
74
+ noDataText.enter().append('text')
75
+ .attr('class', 'nvd3 nv-noData')
76
+ .attr('dy', '-.7em')
77
+ .style('text-anchor', 'middle');
78
+
79
+ noDataText
80
+ .attr('x', margin.left + availableWidth / 2)
81
+ .attr('y', margin.top + availableHeight / 2)
82
+ .text(function(d) { return d });
83
+
84
+ return chart;
85
+ } else {
86
+ container.selectAll('.nv-noData').remove();
87
+ }
88
+ */
89
+
90
+ //------------------------------------------------------------
91
+
92
+
93
+
94
+ var rangez = ranges.call(this, d, i).slice().sort(d3.descending),
95
+ markerz = markers.call(this, d, i).slice().sort(d3.descending),
96
+ measurez = measures.call(this, d, i).slice().sort(d3.descending);
97
+
98
+
99
+ //------------------------------------------------------------
100
+ // Setup containers and skeleton of chart
101
+
102
+ var wrap = container.selectAll('g.nv-wrap.nv-bulletChart').data([d]);
103
+ var wrapEnter = wrap.enter().append('g').attr('class', 'nvd3 nv-wrap nv-bulletChart');
104
+ var gEnter = wrapEnter.append('g');
105
+ var g = wrap.select('g');
106
+
107
+ gEnter.append('g').attr('class', 'nv-bulletWrap');
108
+ gEnter.append('g').attr('class', 'nv-titles');
109
+
110
+ wrap.attr('transform', 'translate(' + margin.left + ',' + ( margin.top + i*height )+ ')');
111
+
112
+ //------------------------------------------------------------
113
+
114
+
115
+ // Compute the new x-scale.
116
+ var MaxX = Math.max(rangez[0] ? rangez[0]:0 , markerz[0] ? markerz[0] : 0 , measurez[0] ? measurez[0] : 0)
117
+ var x1 = d3.scale.linear()
118
+ .domain([0, MaxX]).nice() // TODO: need to allow forceX and forceY, and xDomain, yDomain
119
+ .range(reverse ? [availableWidth, 0] : [0, availableWidth]);
120
+
121
+ // Retrieve the old x-scale, if this is an update.
122
+ var x0 = this.__chart__ || d3.scale.linear()
123
+ .domain([0, Infinity])
124
+ .range(x1.range());
125
+
126
+ // Stash the new scale.
127
+ this.__chart__ = x1;
128
+
129
+ /*
130
+ // Derive width-scales from the x-scales.
131
+ var w0 = bulletWidth(x0),
132
+ w1 = bulletWidth(x1);
133
+
134
+ function bulletWidth(x) {
135
+ var x0 = x(0);
136
+ return function(d) {
137
+ return Math.abs(x(d) - x(0));
138
+ };
139
+ }
140
+
141
+ function bulletTranslate(x) {
142
+ return function(d) {
143
+ return 'translate(' + x(d) + ',0)';
144
+ };
145
+ }
146
+ */
147
+
148
+ var w0 = function(d) { return Math.abs(x0(d) - x0(0)) }, // TODO: could optimize by precalculating x0(0) and x1(0)
149
+ w1 = function(d) { return Math.abs(x1(d) - x1(0)) };
150
+
151
+
152
+ var title = gEnter.select('.nv-titles').append("g")
153
+ .attr("text-anchor", "end")
154
+ .attr("transform", "translate(-6," + (height - margin.top - margin.bottom) / 2 + ")");
155
+ title.append("text")
156
+ .attr("class", "nv-title")
157
+ .text(function(d) { return d.title; });
158
+
159
+ title.append("text")
160
+ .attr("class", "nv-subtitle")
161
+ .attr("dy", "1em")
162
+ .text(function(d) { return d.subtitle; });
163
+
164
+
165
+
166
+ bullet
167
+ .width(availableWidth)
168
+ .height(availableHeight)
169
+
170
+ var bulletWrap = g.select('.nv-bulletWrap');
171
+
172
+ d3.transition(bulletWrap).call(bullet);
173
+
174
+
175
+
176
+ // Compute the tick format.
177
+ var format = tickFormat || x1.tickFormat(8);
178
+
179
+ // Update the tick groups.
180
+ var tick = g.selectAll('g.nv-tick')
181
+ .data(x1.ticks(8), function(d) {
182
+ return this.textContent || format(d);
183
+ });
184
+
185
+ // Initialize the ticks with the old scale, x0.
186
+ var tickEnter = tick.enter().append('g')
187
+ .attr('class', 'nv-tick')
188
+ .attr('transform', function(d) { return 'translate(' + x0(d) + ',0)' })
189
+ .style('opacity', 1e-6);
190
+
191
+ tickEnter.append('line')
192
+ .attr('y1', availableHeight)
193
+ .attr('y2', availableHeight * 7 / 6);
194
+
195
+ tickEnter.append('text')
196
+ .attr('text-anchor', 'middle')
197
+ .attr('dy', '1em')
198
+ .attr('y', availableHeight * 7 / 6)
199
+ .text(format);
200
+
201
+ // Transition the entering ticks to the new scale, x1.
202
+ d3.transition(tickEnter)
203
+ .attr('transform', function(d) { return 'translate(' + x1(d) + ',0)' })
204
+ .style('opacity', 1);
205
+
206
+ // Transition the updating ticks to the new scale, x1.
207
+ var tickUpdate = d3.transition(tick)
208
+ .attr('transform', function(d) { return 'translate(' + x1(d) + ',0)' })
209
+ .style('opacity', 1);
210
+
211
+ tickUpdate.select('line')
212
+ .attr('y1', availableHeight)
213
+ .attr('y2', availableHeight * 7 / 6);
214
+
215
+ tickUpdate.select('text')
216
+ .attr('y', availableHeight * 7 / 6);
217
+
218
+ // Transition the exiting ticks to the new scale, x1.
219
+ d3.transition(tick.exit())
220
+ .attr('transform', function(d) { return 'translate(' + x1(d) + ',0)' })
221
+ .style('opacity', 1e-6)
222
+ .remove();
223
+
224
+
225
+ //============================================================
226
+ // Event Handling/Dispatching (in chart's scope)
227
+ //------------------------------------------------------------
228
+
229
+ dispatch.on('tooltipShow', function(e) {
230
+ if (tooltips) showTooltip(e, that.parentNode);
231
+ });
232
+
233
+ //============================================================
234
+
235
+ });
236
+
237
+ d3.timer.flush();
238
+
239
+ return chart;
240
+ }
241
+
242
+
243
+ //============================================================
244
+ // Event Handling/Dispatching (out of chart's scope)
245
+ //------------------------------------------------------------
246
+
247
+ bullet.dispatch.on('elementMouseover.tooltip', function(e) {
248
+ dispatch.tooltipShow(e);
249
+ });
250
+
251
+ bullet.dispatch.on('elementMouseout.tooltip', function(e) {
252
+ dispatch.tooltipHide(e);
253
+ });
254
+
255
+ dispatch.on('tooltipHide', function() {
256
+ if (tooltips) nv.tooltip.cleanup();
257
+ });
258
+
259
+ //============================================================
260
+
261
+
262
+ //============================================================
263
+ // Expose Public Variables
264
+ //------------------------------------------------------------
265
+
266
+ chart.dispatch = dispatch;
267
+ chart.bullet = bullet;
268
+
269
+ // left, right, top, bottom
270
+ chart.orient = function(x) {
271
+ if (!arguments.length) return orient;
272
+ orient = x;
273
+ reverse = orient == 'right' || orient == 'bottom';
274
+ return chart;
275
+ };
276
+
277
+ // ranges (bad, satisfactory, good)
278
+ chart.ranges = function(x) {
279
+ if (!arguments.length) return ranges;
280
+ ranges = x;
281
+ return chart;
282
+ };
283
+
284
+ // markers (previous, goal)
285
+ chart.markers = function(x) {
286
+ if (!arguments.length) return markers;
287
+ markers = x;
288
+ return chart;
289
+ };
290
+
291
+ // measures (actual, forecast)
292
+ chart.measures = function(x) {
293
+ if (!arguments.length) return measures;
294
+ measures = x;
295
+ return chart;
296
+ };
297
+
298
+ chart.width = function(x) {
299
+ if (!arguments.length) return width;
300
+ width = x;
301
+ return chart;
302
+ };
303
+
304
+ chart.height = function(x) {
305
+ if (!arguments.length) return height;
306
+ height = x;
307
+ return chart;
308
+ };
309
+
310
+ chart.margin = function(_) {
311
+ if (!arguments.length) return margin;
312
+ margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
313
+ margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
314
+ margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
315
+ margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
316
+ return chart;
317
+ };
318
+
319
+ chart.tickFormat = function(x) {
320
+ if (!arguments.length) return tickFormat;
321
+ tickFormat = x;
322
+ return chart;
323
+ };
324
+
325
+ chart.tooltips = function(_) {
326
+ if (!arguments.length) return tooltips;
327
+ tooltips = _;
328
+ return chart;
329
+ };
330
+
331
+ chart.tooltipContent = function(_) {
332
+ if (!arguments.length) return tooltip;
333
+ tooltip = _;
334
+ return chart;
335
+ };
336
+
337
+ chart.noData = function(_) {
338
+ if (!arguments.length) return noData;
339
+ noData = _;
340
+ return chart;
341
+ };
342
+
343
+ //============================================================
344
+
345
+
346
+ return chart;
347
+ };
348
+
349
+