outfielding-jqplot-rails 1.0.8 → 1.0.9

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 (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/CHANGELOG.md +8 -4
  4. data/changes-jqplot.txt +48 -37
  5. data/copyright-jqplot.txt +17 -17
  6. data/lib/outfielding-jqplot-rails/version.rb +1 -1
  7. data/vendor/assets/javascripts/excanvas.js +1438 -1438
  8. data/vendor/assets/javascripts/jqplot-plugins/jqplot.BezierCurveRenderer.js +313 -313
  9. data/vendor/assets/javascripts/jqplot-plugins/jqplot.barRenderer.js +801 -801
  10. data/vendor/assets/javascripts/jqplot-plugins/jqplot.blockRenderer.js +234 -234
  11. data/vendor/assets/javascripts/jqplot-plugins/jqplot.bubbleRenderer.js +758 -758
  12. data/vendor/assets/javascripts/jqplot-plugins/jqplot.canvasAxisLabelRenderer.js +202 -202
  13. data/vendor/assets/javascripts/jqplot-plugins/jqplot.canvasAxisTickRenderer.js +252 -252
  14. data/vendor/assets/javascripts/jqplot-plugins/jqplot.canvasOverlay.js +1020 -1020
  15. data/vendor/assets/javascripts/jqplot-plugins/jqplot.canvasTextRenderer.js +448 -448
  16. data/vendor/assets/javascripts/jqplot-plugins/jqplot.categoryAxisRenderer.js +679 -679
  17. data/vendor/assets/javascripts/jqplot-plugins/jqplot.ciParser.js +115 -115
  18. data/vendor/assets/javascripts/jqplot-plugins/jqplot.cursor.js +1108 -1108
  19. data/vendor/assets/javascripts/jqplot-plugins/jqplot.dateAxisRenderer.js +741 -741
  20. data/vendor/assets/javascripts/jqplot-plugins/jqplot.donutRenderer.js +816 -805
  21. data/vendor/assets/javascripts/jqplot-plugins/jqplot.dragable.js +224 -224
  22. data/vendor/assets/javascripts/jqplot-plugins/jqplot.enhancedLegendRenderer.js +305 -305
  23. data/vendor/assets/javascripts/jqplot-plugins/jqplot.enhancedPieLegendRenderer.js +261 -0
  24. data/vendor/assets/javascripts/jqplot-plugins/jqplot.funnelRenderer.js +942 -942
  25. data/vendor/assets/javascripts/jqplot-plugins/jqplot.highlighter.js +464 -464
  26. data/vendor/assets/javascripts/jqplot-plugins/jqplot.json2.js +475 -475
  27. data/vendor/assets/javascripts/jqplot-plugins/jqplot.logAxisRenderer.js +533 -533
  28. data/vendor/assets/javascripts/jqplot-plugins/jqplot.mekkoAxisRenderer.js +611 -611
  29. data/vendor/assets/javascripts/jqplot-plugins/jqplot.mekkoRenderer.js +437 -437
  30. data/vendor/assets/javascripts/jqplot-plugins/jqplot.meterGaugeRenderer.js +1029 -1029
  31. data/vendor/assets/javascripts/jqplot-plugins/jqplot.mobile.js +2 -2
  32. data/vendor/assets/javascripts/jqplot-plugins/jqplot.ohlcRenderer.js +373 -373
  33. data/vendor/assets/javascripts/jqplot-plugins/jqplot.pieRenderer.js +945 -903
  34. data/vendor/assets/javascripts/jqplot-plugins/jqplot.pointLabels.js +379 -377
  35. data/vendor/assets/javascripts/jqplot-plugins/jqplot.pyramidAxisRenderer.js +728 -728
  36. data/vendor/assets/javascripts/jqplot-plugins/jqplot.pyramidGridRenderer.js +428 -428
  37. data/vendor/assets/javascripts/jqplot-plugins/jqplot.pyramidRenderer.js +513 -513
  38. data/vendor/assets/javascripts/jqplot-plugins/jqplot.trendline.js +222 -222
  39. data/vendor/assets/javascripts/jquery.jqplot.js +11477 -11411
  40. data/vendor/assets/stylesheets/jquery.jqplot.css +259 -259
  41. metadata +9 -10
@@ -1,377 +1,379 @@
1
- /**
2
- * jqPlot
3
- * Pure JavaScript plotting plugin using jQuery
4
- *
5
- * Version: 1.0.8
6
- * Revision: 1250
7
- *
8
- * Copyright (c) 2009-2013 Chris Leonello
9
- * jqPlot is currently available for use in all personal or commercial projects
10
- * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
11
- * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
12
- * choose the license that best suits your project and use it accordingly.
13
- *
14
- * Although not required, the author would appreciate an email letting him
15
- * know of any substantial use of jqPlot. You can reach the author at:
16
- * chris at jqplot dot com or see http://www.jqplot.com/info.php .
17
- *
18
- * If you are feeling kind and generous, consider supporting the project by
19
- * making a donation at: http://www.jqplot.com/donate.php .
20
- *
21
- * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
22
- *
23
- * version 2007.04.27
24
- * author Ash Searle
25
- * http://hexmen.com/blog/2007/03/printf-sprintf/
26
- * http://hexmen.com/js/sprintf.js
27
- * The author (Ash Searle) has placed this code in the public domain:
28
- * "This code is unrestricted: you are free to use it however you like."
29
- *
30
- */
31
- (function($) {
32
-
33
- /**
34
- * Class: $.jqplot.PointLabels
35
- * Plugin for putting labels at the data points.
36
- *
37
- * To use this plugin, include the js
38
- * file in your source:
39
- *
40
- * > <script type="text/javascript" src="plugins/jqplot.pointLabels.js"></script>
41
- *
42
- * By default, the last value in the data ponit array in the data series is used
43
- * for the label. For most series renderers, extra data can be added to the
44
- * data point arrays and the last value will be used as the label.
45
- *
46
- * For instance,
47
- * this series:
48
- *
49
- * > [[1,4], [3,5], [7,2]]
50
- *
51
- * Would, by default, use the y values in the labels.
52
- * Extra data can be added to the series like so:
53
- *
54
- * > [[1,4,'mid'], [3 5,'hi'], [7,2,'low']]
55
- *
56
- * And now the point labels would be 'mid', 'low', and 'hi'.
57
- *
58
- * Options to the point labels and a custom labels array can be passed into the
59
- * "pointLabels" option on the series option like so:
60
- *
61
- * > series:[{pointLabels:{
62
- * > labels:['mid', 'hi', 'low'],
63
- * > location:'se',
64
- * > ypadding: 12
65
- * > }
66
- * > }]
67
- *
68
- * A custom labels array in the options takes precendence over any labels
69
- * in the series data. If you have a custom labels array in the options,
70
- * but still want to use values from the series array as labels, set the
71
- * "labelsFromSeries" option to true.
72
- *
73
- * By default, html entities (<, >, etc.) are escaped in point labels.
74
- * If you want to include actual html markup in the labels,
75
- * set the "escapeHTML" option to false.
76
- *
77
- */
78
- $.jqplot.PointLabels = function(options) {
79
- // Group: Properties
80
- //
81
- // prop: show
82
- // show the labels or not.
83
- this.show = $.jqplot.config.enablePlugins;
84
- // prop: location
85
- // compass location where to position the label around the point.
86
- // 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'
87
- this.location = 'n';
88
- // prop: labelsFromSeries
89
- // true to use labels within data point arrays.
90
- this.labelsFromSeries = false;
91
- // prop: seriesLabelIndex
92
- // array index for location of labels within data point arrays.
93
- // if null, will use the last element of the data point array.
94
- this.seriesLabelIndex = null;
95
- // prop: labels
96
- // array of arrays of labels, one array for each series.
97
- this.labels = [];
98
- // actual labels that will get displayed.
99
- // needed to preserve user specified labels in labels array.
100
- this._labels = [];
101
- // prop: stackedValue
102
- // true to display value as stacked in a stacked plot.
103
- // no effect if labels is specified.
104
- this.stackedValue = false;
105
- // prop: ypadding
106
- // vertical padding in pixels between point and label
107
- this.ypadding = 6;
108
- // prop: xpadding
109
- // horizontal padding in pixels between point and label
110
- this.xpadding = 6;
111
- // prop: escapeHTML
112
- // true to escape html entities in the labels.
113
- // If you want to include markup in the labels, set to false.
114
- this.escapeHTML = true;
115
- // prop: edgeTolerance
116
- // Number of pixels that the label must be away from an axis
117
- // boundary in order to be drawn. Negative values will allow overlap
118
- // with the grid boundaries.
119
- this.edgeTolerance = -5;
120
- // prop: formatter
121
- // A class of a formatter for the tick text. sprintf by default.
122
- this.formatter = $.jqplot.DefaultTickFormatter;
123
- // prop: formatString
124
- // string passed to the formatter.
125
- this.formatString = '';
126
- // prop: hideZeros
127
- // true to not show a label for a value which is 0.
128
- this.hideZeros = false;
129
- this._elems = [];
130
-
131
- $.extend(true, this, options);
132
- };
133
-
134
- var locations = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];
135
- var locationIndicies = {'nw':0, 'n':1, 'ne':2, 'e':3, 'se':4, 's':5, 'sw':6, 'w':7};
136
- var oppositeLocations = ['se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];
137
-
138
- // called with scope of a series
139
- $.jqplot.PointLabels.init = function (target, data, seriesDefaults, opts, plot){
140
- var options = $.extend(true, {}, seriesDefaults, opts);
141
- options.pointLabels = options.pointLabels || {};
142
- if (this.renderer.constructor === $.jqplot.BarRenderer && this.barDirection === 'horizontal' && !options.pointLabels.location) {
143
- options.pointLabels.location = 'e';
144
- }
145
- // add a pointLabels attribute to the series plugins
146
- this.plugins.pointLabels = new $.jqplot.PointLabels(options.pointLabels);
147
- this.plugins.pointLabels.setLabels.call(this);
148
- };
149
-
150
- // called with scope of series
151
- $.jqplot.PointLabels.prototype.setLabels = function() {
152
- var p = this.plugins.pointLabels;
153
- var labelIdx;
154
- if (p.seriesLabelIndex != null) {
155
- labelIdx = p.seriesLabelIndex;
156
- }
157
- else if (this.renderer.constructor === $.jqplot.BarRenderer && this.barDirection === 'horizontal') {
158
- labelIdx = (this._plotData[0].length < 3) ? 0 : this._plotData[0].length -1;
159
- }
160
- else {
161
- labelIdx = (this._plotData.length === 0) ? 0 : this._plotData[0].length -1;
162
- }
163
- p._labels = [];
164
- if (p.labels.length === 0 || p.labelsFromSeries) {
165
- if (p.stackedValue) {
166
- if (this._plotData.length && this._plotData[0].length){
167
- // var idx = p.seriesLabelIndex || this._plotData[0].length -1;
168
- for (var i=0; i<this._plotData.length; i++) {
169
- p._labels.push(this._plotData[i][labelIdx]);
170
- }
171
- }
172
- }
173
- else {
174
- // var d = this._plotData;
175
- var d = this.data;
176
- if (this.renderer.constructor === $.jqplot.BarRenderer && this.waterfall) {
177
- d = this._data;
178
- }
179
- if (d.length && d[0].length) {
180
- // var idx = p.seriesLabelIndex || d[0].length -1;
181
- for (var i=0; i<d.length; i++) {
182
- p._labels.push(d[i][labelIdx]);
183
- }
184
- }
185
- d = null;
186
- }
187
- }
188
- else if (p.labels.length){
189
- p._labels = p.labels;
190
- }
191
- };
192
-
193
- $.jqplot.PointLabels.prototype.xOffset = function(elem, location, padding) {
194
- location = location || this.location;
195
- padding = padding || this.xpadding;
196
- var offset;
197
-
198
- switch (location) {
199
- case 'nw':
200
- offset = -elem.outerWidth(true) - this.xpadding;
201
- break;
202
- case 'n':
203
- offset = -elem.outerWidth(true)/2;
204
- break;
205
- case 'ne':
206
- offset = this.xpadding;
207
- break;
208
- case 'e':
209
- offset = this.xpadding;
210
- break;
211
- case 'se':
212
- offset = this.xpadding;
213
- break;
214
- case 's':
215
- offset = -elem.outerWidth(true)/2;
216
- break;
217
- case 'sw':
218
- offset = -elem.outerWidth(true) - this.xpadding;
219
- break;
220
- case 'w':
221
- offset = -elem.outerWidth(true) - this.xpadding;
222
- break;
223
- default: // same as 'nw'
224
- offset = -elem.outerWidth(true) - this.xpadding;
225
- break;
226
- }
227
- return offset;
228
- };
229
-
230
- $.jqplot.PointLabels.prototype.yOffset = function(elem, location, padding) {
231
- location = location || this.location;
232
- padding = padding || this.xpadding;
233
- var offset;
234
-
235
- switch (location) {
236
- case 'nw':
237
- offset = -elem.outerHeight(true) - this.ypadding;
238
- break;
239
- case 'n':
240
- offset = -elem.outerHeight(true) - this.ypadding;
241
- break;
242
- case 'ne':
243
- offset = -elem.outerHeight(true) - this.ypadding;
244
- break;
245
- case 'e':
246
- offset = -elem.outerHeight(true)/2;
247
- break;
248
- case 'se':
249
- offset = this.ypadding;
250
- break;
251
- case 's':
252
- offset = this.ypadding;
253
- break;
254
- case 'sw':
255
- offset = this.ypadding;
256
- break;
257
- case 'w':
258
- offset = -elem.outerHeight(true)/2;
259
- break;
260
- default: // same as 'nw'
261
- offset = -elem.outerHeight(true) - this.ypadding;
262
- break;
263
- }
264
- return offset;
265
- };
266
-
267
- // called with scope of series
268
- $.jqplot.PointLabels.draw = function (sctx, options, plot) {
269
- var p = this.plugins.pointLabels;
270
- // set labels again in case they have changed.
271
- p.setLabels.call(this);
272
- // remove any previous labels
273
- for (var i=0; i<p._elems.length; i++) {
274
- // Memory Leaks patch
275
- // p._elems[i].remove();
276
- p._elems[i].emptyForce();
277
- }
278
- p._elems.splice(0, p._elems.length);
279
-
280
- if (p.show) {
281
- var ax = '_'+this._stackAxis+'axis';
282
-
283
- if (!p.formatString) {
284
- p.formatString = this[ax]._ticks[0].formatString;
285
- p.formatter = this[ax]._ticks[0].formatter;
286
- }
287
-
288
- var pd = this._plotData;
289
- var ppd = this._prevPlotData;
290
- var xax = this._xaxis;
291
- var yax = this._yaxis;
292
- var elem, helem;
293
-
294
- for (var i=0, l=p._labels.length; i < l; i++) {
295
- var label = p._labels[i];
296
-
297
- if (label == null || (p.hideZeros && parseInt(label, 10) == 0)) {
298
- continue;
299
- }
300
-
301
- label = p.formatter(p.formatString, label);
302
-
303
- helem = document.createElement('div');
304
- p._elems[i] = $(helem);
305
-
306
- elem = p._elems[i];
307
-
308
-
309
- elem.addClass('jqplot-point-label jqplot-series-'+this.index+' jqplot-point-'+i);
310
- elem.css('position', 'absolute');
311
- elem.insertAfter(sctx.canvas);
312
-
313
- if (p.escapeHTML) {
314
- elem.text(label);
315
- }
316
- else {
317
- elem.html(label);
318
- }
319
- var location = p.location;
320
- if ((this.fillToZero && pd[i][1] < 0) || (this.fillToZero && this._type === 'bar' && this.barDirection === 'horizontal' && pd[i][0] < 0) || (this.waterfall && parseInt(label, 10)) < 0) {
321
- location = oppositeLocations[locationIndicies[location]];
322
- }
323
-
324
-
325
- var ell = xax.u2p(pd[i][0]) + p.xOffset(elem, location);
326
- var elt = yax.u2p(pd[i][1]) + p.yOffset(elem, location);
327
-
328
- // we have stacked chart but are not showing stacked values,
329
- // place labels in center.
330
- if (this._stack && !p.stackedValue) {
331
- if (this.barDirection === "vertical") {
332
- elt = (this._barPoints[i][0][1] + this._barPoints[i][1][1]) / 2 + plot._gridPadding.top - 0.5 * elem.outerHeight(true);
333
- }
334
- else {
335
- ell = (this._barPoints[i][2][0] + this._barPoints[i][0][0]) / 2 + plot._gridPadding.left - 0.5 * elem.outerWidth(true);
336
- }
337
- }
338
-
339
- if (this.renderer.constructor == $.jqplot.BarRenderer) {
340
- if (this.barDirection == "vertical") {
341
- ell += this._barNudge;
342
- }
343
- else {
344
- elt -= this._barNudge;
345
- }
346
- }
347
- elem.css('left', ell);
348
- elem.css('top', elt);
349
- var elr = ell + elem.width();
350
- var elb = elt + elem.height();
351
- var et = p.edgeTolerance;
352
- var scl = $(sctx.canvas).position().left;
353
- var sct = $(sctx.canvas).position().top;
354
- var scr = sctx.canvas.width + scl;
355
- var scb = sctx.canvas.height + sct;
356
- // if label is outside of allowed area, remove it
357
- if (ell - et < scl || elt - et < sct || elr + et > scr || elb + et > scb) {
358
- elem.remove();
359
- }
360
-
361
- elem = null;
362
- helem = null;
363
- }
364
-
365
- // finally, animate them if the series is animated
366
- // if (this.renderer.animation && this.renderer.animation._supported && this.renderer.animation.show && plot._drawCount < 2) {
367
- // var sel = '.jqplot-point-label.jqplot-series-'+this.index;
368
- // $(sel).hide();
369
- // $(sel).fadeIn(1000);
370
- // }
371
-
372
- }
373
- };
374
-
375
- $.jqplot.postSeriesInitHooks.push($.jqplot.PointLabels.init);
376
- $.jqplot.postDrawSeriesHooks.push($.jqplot.PointLabels.draw);
377
- })(jQuery);
1
+ /**
2
+ * jqPlot
3
+ * Pure JavaScript plotting plugin using jQuery
4
+ *
5
+ * Version: 1.0.9
6
+ * Revision: d96a669
7
+ *
8
+ * Copyright (c) 2009-2016 Chris Leonello
9
+ * jqPlot is currently available for use in all personal or commercial projects
10
+ * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
11
+ * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
12
+ * choose the license that best suits your project and use it accordingly.
13
+ *
14
+ * Although not required, the author would appreciate an email letting him
15
+ * know of any substantial use of jqPlot. You can reach the author at:
16
+ * chris at jqplot dot com or see http://www.jqplot.com/info.php .
17
+ *
18
+ * If you are feeling kind and generous, consider supporting the project by
19
+ * making a donation at: http://www.jqplot.com/donate.php .
20
+ *
21
+ * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
22
+ *
23
+ * version 2007.04.27
24
+ * author Ash Searle
25
+ * http://hexmen.com/blog/2007/03/printf-sprintf/
26
+ * http://hexmen.com/js/sprintf.js
27
+ * The author (Ash Searle) has placed this code in the public domain:
28
+ * "This code is unrestricted: you are free to use it however you like."
29
+ *
30
+ */
31
+ (function($) {
32
+
33
+ /**
34
+ * Class: $.jqplot.PointLabels
35
+ * Plugin for putting labels at the data points.
36
+ *
37
+ * To use this plugin, include the js
38
+ * file in your source:
39
+ *
40
+ * > <script type="text/javascript" src="plugins/jqplot.pointLabels.js"></script>
41
+ *
42
+ * By default, the last value in the data ponit array in the data series is used
43
+ * for the label. For most series renderers, extra data can be added to the
44
+ * data point arrays and the last value will be used as the label.
45
+ *
46
+ * For instance,
47
+ * this series:
48
+ *
49
+ * > [[1,4], [3,5], [7,2]]
50
+ *
51
+ * Would, by default, use the y values in the labels.
52
+ * Extra data can be added to the series like so:
53
+ *
54
+ * > [[1,4,'mid'], [3 5,'hi'], [7,2,'low']]
55
+ *
56
+ * And now the point labels would be 'mid', 'low', and 'hi'.
57
+ *
58
+ * Options to the point labels and a custom labels array can be passed into the
59
+ * "pointLabels" option on the series option like so:
60
+ *
61
+ * > series:[{pointLabels:{
62
+ * > labels:['mid', 'hi', 'low'],
63
+ * > location:'se',
64
+ * > ypadding: 12
65
+ * > }
66
+ * > }]
67
+ *
68
+ * A custom labels array in the options takes precendence over any labels
69
+ * in the series data. If you have a custom labels array in the options,
70
+ * but still want to use values from the series array as labels, set the
71
+ * "labelsFromSeries" option to true.
72
+ *
73
+ * By default, html entities (<, >, etc.) are escaped in point labels.
74
+ * If you want to include actual html markup in the labels,
75
+ * set the "escapeHTML" option to false.
76
+ *
77
+ */
78
+ $.jqplot.PointLabels = function(options) {
79
+ // Group: Properties
80
+ //
81
+ // prop: show
82
+ // show the labels or not.
83
+ this.show = $.jqplot.config.enablePlugins;
84
+ // prop: location
85
+ // compass location where to position the label around the point.
86
+ // 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'
87
+ this.location = 'n';
88
+ // prop: labelsFromSeries
89
+ // true to use labels within data point arrays.
90
+ this.labelsFromSeries = false;
91
+ // prop: seriesLabelIndex
92
+ // array index for location of labels within data point arrays.
93
+ // if null, will use the last element of the data point array.
94
+ this.seriesLabelIndex = null;
95
+ // prop: labels
96
+ // array of arrays of labels, one array for each series.
97
+ this.labels = [];
98
+ // actual labels that will get displayed.
99
+ // needed to preserve user specified labels in labels array.
100
+ this._labels = [];
101
+ // prop: stackedValue
102
+ // true to display value as stacked in a stacked plot.
103
+ // no effect if labels is specified.
104
+ this.stackedValue = false;
105
+ // prop: ypadding
106
+ // vertical padding in pixels between point and label
107
+ this.ypadding = 6;
108
+ // prop: xpadding
109
+ // horizontal padding in pixels between point and label
110
+ this.xpadding = 6;
111
+ // prop: escapeHTML
112
+ // true to escape html entities in the labels.
113
+ // If you want to include markup in the labels, set to false.
114
+ this.escapeHTML = true;
115
+ // prop: edgeTolerance
116
+ // Number of pixels that the label must be away from an axis
117
+ // boundary in order to be drawn. Negative values will allow overlap
118
+ // with the grid boundaries.
119
+ this.edgeTolerance = -5;
120
+ // prop: formatter
121
+ // A class of a formatter for the tick text. sprintf by default.
122
+ this.formatter = $.jqplot.DefaultTickFormatter;
123
+ // prop: formatString
124
+ // string passed to the formatter.
125
+ this.formatString = '';
126
+ // prop: hideZeros
127
+ // true to not show a label for a value which is 0.
128
+ this.hideZeros = false;
129
+ this._elems = [];
130
+
131
+ $.extend(true, this, options);
132
+ };
133
+
134
+ var locations = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];
135
+ var locationIndicies = {'nw':0, 'n':1, 'ne':2, 'e':3, 'se':4, 's':5, 'sw':6, 'w':7};
136
+ var oppositeLocations = ['se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];
137
+
138
+ // called with scope of a series
139
+ $.jqplot.PointLabels.init = function (target, data, seriesDefaults, opts, plot){
140
+ var options = $.extend(true, {}, seriesDefaults, opts);
141
+ options.pointLabels = options.pointLabels || {};
142
+ if (this.renderer.constructor === $.jqplot.BarRenderer && this.barDirection === 'horizontal' && !options.pointLabels.location) {
143
+ options.pointLabels.location = 'e';
144
+ }
145
+ // add a pointLabels attribute to the series plugins
146
+ this.plugins.pointLabels = new $.jqplot.PointLabels(options.pointLabels);
147
+ this.plugins.pointLabels.setLabels.call(this);
148
+ };
149
+
150
+ // called with scope of series
151
+ $.jqplot.PointLabels.prototype.setLabels = function() {
152
+ var p = this.plugins.pointLabels;
153
+ var labelIdx;
154
+ if (p.seriesLabelIndex != null) {
155
+ labelIdx = p.seriesLabelIndex;
156
+ }
157
+ else if (this.renderer.constructor === $.jqplot.BarRenderer && this.barDirection === 'horizontal') {
158
+ labelIdx = (this._plotData[0].length < 3) ? 0 : this._plotData[0].length -1;
159
+ }
160
+ else {
161
+ labelIdx = (this._plotData.length === 0) ? 0 : this._plotData[0].length -1;
162
+ }
163
+ p._labels = [];
164
+ if (p.labels.length === 0 || p.labelsFromSeries) {
165
+ if (p.stackedValue) {
166
+ if (this._plotData.length && this._plotData[0].length){
167
+ // var idx = p.seriesLabelIndex || this._plotData[0].length -1;
168
+ for (var i=0; i<this._plotData.length; i++) {
169
+ p._labels.push(this._plotData[i][labelIdx]);
170
+ }
171
+ }
172
+ }
173
+ else {
174
+ // var d = this._plotData;
175
+ var d = this.data;
176
+ if (this.renderer.constructor === $.jqplot.BarRenderer && this.waterfall) {
177
+ d = this._data;
178
+ }
179
+ if (d.length && d[0].length) {
180
+ // var idx = p.seriesLabelIndex || d[0].length -1;
181
+ for (var i=0; i<d.length; i++) {
182
+ p._labels.push(d[i][labelIdx]);
183
+ }
184
+ }
185
+ d = null;
186
+ }
187
+ }
188
+ else if (p.labels.length){
189
+ p._labels = p.labels;
190
+ }
191
+ };
192
+
193
+ $.jqplot.PointLabels.prototype.xOffset = function(elem, location, padding) {
194
+ location = location || this.location;
195
+ padding = padding || this.xpadding;
196
+ var offset;
197
+
198
+ switch (location) {
199
+ case 'nw':
200
+ offset = -elem.outerWidth(true) - this.xpadding;
201
+ break;
202
+ case 'n':
203
+ offset = -elem.outerWidth(true)/2;
204
+ break;
205
+ case 'ne':
206
+ offset = this.xpadding;
207
+ break;
208
+ case 'e':
209
+ offset = this.xpadding;
210
+ break;
211
+ case 'se':
212
+ offset = this.xpadding;
213
+ break;
214
+ case 's':
215
+ offset = -elem.outerWidth(true)/2;
216
+ break;
217
+ case 'sw':
218
+ offset = -elem.outerWidth(true) - this.xpadding;
219
+ break;
220
+ case 'w':
221
+ offset = -elem.outerWidth(true) - this.xpadding;
222
+ break;
223
+ default: // same as 'nw'
224
+ offset = -elem.outerWidth(true) - this.xpadding;
225
+ break;
226
+ }
227
+ return offset;
228
+ };
229
+
230
+ $.jqplot.PointLabels.prototype.yOffset = function(elem, location, padding) {
231
+ location = location || this.location;
232
+ padding = padding || this.xpadding;
233
+ var offset;
234
+
235
+ switch (location) {
236
+ case 'nw':
237
+ offset = -elem.outerHeight(true) - this.ypadding;
238
+ break;
239
+ case 'n':
240
+ offset = -elem.outerHeight(true) - this.ypadding;
241
+ break;
242
+ case 'ne':
243
+ offset = -elem.outerHeight(true) - this.ypadding;
244
+ break;
245
+ case 'e':
246
+ offset = -elem.outerHeight(true)/2;
247
+ break;
248
+ case 'se':
249
+ offset = this.ypadding;
250
+ break;
251
+ case 's':
252
+ offset = this.ypadding;
253
+ break;
254
+ case 'sw':
255
+ offset = this.ypadding;
256
+ break;
257
+ case 'w':
258
+ offset = -elem.outerHeight(true)/2;
259
+ break;
260
+ default: // same as 'nw'
261
+ offset = -elem.outerHeight(true) - this.ypadding;
262
+ break;
263
+ }
264
+ return offset;
265
+ };
266
+
267
+ // called with scope of series
268
+ $.jqplot.PointLabels.draw = function (sctx, options, plot) {
269
+ var p = this.plugins.pointLabels;
270
+ // set labels again in case they have changed.
271
+ p.setLabels.call(this);
272
+ // remove any previous labels
273
+ for (var i=0; i<p._elems.length; i++) {
274
+ // Memory Leaks patch
275
+ // p._elems[i].remove();
276
+ if(p._elems[i]) {
277
+ p._elems[i].emptyForce();
278
+ }
279
+ }
280
+ p._elems.splice(0, p._elems.length);
281
+
282
+ if (p.show) {
283
+ var ax = '_'+this._stackAxis+'axis';
284
+
285
+ if (!p.formatString) {
286
+ p.formatString = this[ax]._ticks[0].formatString;
287
+ p.formatter = this[ax]._ticks[0].formatter;
288
+ }
289
+
290
+ var pd = this._plotData;
291
+ var ppd = this._prevPlotData;
292
+ var xax = this._xaxis;
293
+ var yax = this._yaxis;
294
+ var elem, helem;
295
+
296
+ for (var i=0, l=p._labels.length; i < l; i++) {
297
+ var label = p._labels[i];
298
+
299
+ if (label == null || (p.hideZeros && parseFloat(label) == 0)) {
300
+ continue;
301
+ }
302
+
303
+ label = p.formatter(p.formatString, label);
304
+
305
+ helem = document.createElement('div');
306
+ p._elems[i] = $(helem);
307
+
308
+ elem = p._elems[i];
309
+
310
+
311
+ elem.addClass('jqplot-point-label jqplot-series-'+this.index+' jqplot-point-'+i);
312
+ elem.css('position', 'absolute');
313
+ elem.insertAfter(sctx.canvas);
314
+
315
+ if (p.escapeHTML) {
316
+ elem.text(label);
317
+ }
318
+ else {
319
+ elem.html(label);
320
+ }
321
+ var location = p.location;
322
+ if ((this.fillToZero && pd[i][1] < 0) || (this.fillToZero && this._type === 'bar' && this.barDirection === 'horizontal' && pd[i][0] < 0) || (this.waterfall && parseInt(label, 10)) < 0) {
323
+ location = oppositeLocations[locationIndicies[location]];
324
+ }
325
+
326
+
327
+ var ell = xax.u2p(pd[i][0]) + p.xOffset(elem, location);
328
+ var elt = yax.u2p(pd[i][1]) + p.yOffset(elem, location);
329
+
330
+ // we have stacked chart but are not showing stacked values,
331
+ // place labels in center.
332
+ if (this._stack && !p.stackedValue) {
333
+ if (this.barDirection === "vertical") {
334
+ elt = (this._barPoints[i][0][1] + this._barPoints[i][1][1]) / 2 + plot._gridPadding.top - 0.5 * elem.outerHeight(true);
335
+ }
336
+ else {
337
+ ell = (this._barPoints[i][2][0] + this._barPoints[i][0][0]) / 2 + plot._gridPadding.left - 0.5 * elem.outerWidth(true);
338
+ }
339
+ }
340
+
341
+ if (this.renderer.constructor == $.jqplot.BarRenderer) {
342
+ if (this.barDirection == "vertical") {
343
+ ell += this._barNudge;
344
+ }
345
+ else {
346
+ elt -= this._barNudge;
347
+ }
348
+ }
349
+ elem.css('left', ell);
350
+ elem.css('top', elt);
351
+ var elr = ell + elem.width();
352
+ var elb = elt + elem.height();
353
+ var et = p.edgeTolerance;
354
+ var scl = $(sctx.canvas).position().left;
355
+ var sct = $(sctx.canvas).position().top;
356
+ var scr = sctx.canvas.width + scl;
357
+ var scb = sctx.canvas.height + sct;
358
+ // if label is outside of allowed area, remove it
359
+ if (ell - et < scl || elt - et < sct || elr + et > scr || elb + et > scb) {
360
+ elem.remove();
361
+ }
362
+
363
+ elem = null;
364
+ helem = null;
365
+ }
366
+
367
+ // finally, animate them if the series is animated
368
+ // if (this.renderer.animation && this.renderer.animation._supported && this.renderer.animation.show && plot._drawCount < 2) {
369
+ // var sel = '.jqplot-point-label.jqplot-series-'+this.index;
370
+ // $(sel).hide();
371
+ // $(sel).fadeIn(1000);
372
+ // }
373
+
374
+ }
375
+ };
376
+
377
+ $.jqplot.postSeriesInitHooks.push($.jqplot.PointLabels.init);
378
+ $.jqplot.postDrawSeriesHooks.push($.jqplot.PointLabels.draw);
379
+ })(jQuery);