jqplot-rails 0.1 → 0.3
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.
- data/lib/jqplot-rails.rb +6 -4
- data/lib/jqplot-rails/railtie.rb +9 -0
- data/lib/jqplot-rails/view_helpers.rb +11 -0
- data/vendor/assets/javascripts/jqplot/excanvas.js +1438 -0
- data/vendor/assets/javascripts/jqplot/index.js +66 -0
- data/vendor/assets/javascripts/{jqplot.1.0.0b2_r792.js → jqplot/jquery.jqplot.js} +3458 -793
- data/vendor/assets/javascripts/jqplot/plugins/BezierCurveRenderer.js +313 -0
- data/vendor/assets/javascripts/jqplot/plugins/barRenderer.js +797 -0
- data/vendor/assets/javascripts/jqplot/plugins/blockRenderer.js +235 -0
- data/vendor/assets/javascripts/jqplot/plugins/bubbleRenderer.js +759 -0
- data/vendor/assets/javascripts/jqplot/plugins/canvasAxisLabelRenderer.js +203 -0
- data/vendor/assets/javascripts/jqplot/plugins/canvasAxisTickRenderer.js +243 -0
- data/vendor/assets/javascripts/jqplot/plugins/canvasOverlay.js +865 -0
- data/vendor/assets/javascripts/jqplot/plugins/canvasTextRenderer.js +449 -0
- data/vendor/assets/javascripts/jqplot/plugins/categoryAxisRenderer.js +673 -0
- data/vendor/assets/javascripts/jqplot/plugins/ciParser.js +116 -0
- data/vendor/assets/javascripts/jqplot/plugins/cursor.js +1108 -0
- data/vendor/assets/javascripts/jqplot/plugins/dateAxisRenderer.js +737 -0
- data/vendor/assets/javascripts/jqplot/plugins/donutRenderer.js +805 -0
- data/vendor/assets/javascripts/jqplot/plugins/dragable.js +225 -0
- data/vendor/assets/javascripts/jqplot/plugins/enhancedLegendRenderer.js +305 -0
- data/vendor/assets/javascripts/jqplot/plugins/funnelRenderer.js +943 -0
- data/vendor/assets/javascripts/jqplot/plugins/highlighter.js +465 -0
- data/vendor/assets/javascripts/jqplot/plugins/json2.js +475 -0
- data/vendor/assets/javascripts/jqplot/plugins/logAxisRenderer.js +529 -0
- data/vendor/assets/javascripts/jqplot/plugins/mekkoAxisRenderer.js +611 -0
- data/vendor/assets/javascripts/jqplot/plugins/mekkoRenderer.js +437 -0
- data/vendor/assets/javascripts/jqplot/plugins/meterGaugeRenderer.js +1030 -0
- data/vendor/assets/javascripts/jqplot/plugins/mobile.js +45 -0
- data/vendor/assets/javascripts/jqplot/plugins/ohlcRenderer.js +373 -0
- data/vendor/assets/javascripts/jqplot/plugins/pieRenderer.js +904 -0
- data/vendor/assets/javascripts/jqplot/plugins/pointLabels.js +379 -0
- data/vendor/assets/javascripts/jqplot/plugins/pyramidAxisRenderer.js +728 -0
- data/vendor/assets/javascripts/jqplot/plugins/pyramidGridRenderer.js +429 -0
- data/vendor/assets/javascripts/jqplot/plugins/pyramidRenderer.js +514 -0
- data/vendor/assets/javascripts/jqplot/plugins/trendline.js +223 -0
- data/vendor/assets/stylesheets/{jqplot.1.0.0b2_r792.css → jqplot.css} +48 -15
- metadata +64 -25
@@ -0,0 +1,379 @@
|
|
1
|
+
/**
|
2
|
+
* jqPlot
|
3
|
+
* Pure JavaScript plotting plugin using jQuery
|
4
|
+
*
|
5
|
+
* Version: 1.0.5
|
6
|
+
* Revision: 1122+
|
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 = 0;
|
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 (p.hideZeros && parseInt(p._labels[i], 10) == 0) {
|
298
|
+
label = '';
|
299
|
+
}
|
300
|
+
|
301
|
+
if (label != null) {
|
302
|
+
label = p.formatter(p.formatString, label);
|
303
|
+
}
|
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);
|
@@ -0,0 +1,728 @@
|
|
1
|
+
/**
|
2
|
+
* jqPlot
|
3
|
+
* Pure JavaScript plotting plugin using jQuery
|
4
|
+
*
|
5
|
+
* Version: 1.0.5
|
6
|
+
* Revision: 1122+
|
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
|
+
$.jqplot.PyramidAxisRenderer = function() {
|
33
|
+
$.jqplot.LinearAxisRenderer.call(this);
|
34
|
+
};
|
35
|
+
|
36
|
+
$.jqplot.PyramidAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();
|
37
|
+
$.jqplot.PyramidAxisRenderer.prototype.constructor = $.jqplot.PyramidAxisRenderer;
|
38
|
+
|
39
|
+
// called with scope of axis
|
40
|
+
$.jqplot.PyramidAxisRenderer.prototype.init = function(options){
|
41
|
+
// Group: Properties
|
42
|
+
//
|
43
|
+
// prop: position
|
44
|
+
// Position of axis. Values are: top, bottom , left, center, right.
|
45
|
+
// By default, x and x2 axes are bottom, y axis is center.
|
46
|
+
this.position = null;
|
47
|
+
// prop: drawBaseline
|
48
|
+
// True to draw the axis baseline.
|
49
|
+
this.drawBaseline = true;
|
50
|
+
// prop: baselineWidth
|
51
|
+
// width of the baseline in pixels.
|
52
|
+
this.baselineWidth = null;
|
53
|
+
// prop: baselineColor
|
54
|
+
// CSS color spec for the baseline.
|
55
|
+
this.baselineColor = null;
|
56
|
+
this.tickSpacingFactor = 25;
|
57
|
+
this._type = 'pyramid';
|
58
|
+
this._splitAxis = false;
|
59
|
+
this._splitLength = null;
|
60
|
+
this.category = false;
|
61
|
+
this._autoFormatString = '';
|
62
|
+
this._overrideFormatString = false;
|
63
|
+
|
64
|
+
$.extend(true, this, options);
|
65
|
+
this.renderer.options = options;
|
66
|
+
|
67
|
+
this.resetDataBounds = this.renderer.resetDataBounds;
|
68
|
+
this.resetDataBounds();
|
69
|
+
|
70
|
+
};
|
71
|
+
|
72
|
+
$.jqplot.PyramidAxisRenderer.prototype.resetDataBounds = function() {
|
73
|
+
// Go through all the series attached to this axis and find
|
74
|
+
// the min/max bounds for this axis.
|
75
|
+
var db = this._dataBounds;
|
76
|
+
db.min = null;
|
77
|
+
db.max = null;
|
78
|
+
var temp;
|
79
|
+
for (var i=0; i<this._series.length; i++) {
|
80
|
+
var s = this._series[i];
|
81
|
+
var d = s._plotData;
|
82
|
+
|
83
|
+
for (var j=0, l=d.length; j<l; j++) {
|
84
|
+
if (this.name.charAt(0) === 'x') {
|
85
|
+
temp = d[j][1];
|
86
|
+
if ((temp !== null && temp < db.min) || db.min === null) {
|
87
|
+
db.min = temp;
|
88
|
+
}
|
89
|
+
if ((temp !== null && temp > db.max) || db.max === null) {
|
90
|
+
db.max = temp;
|
91
|
+
}
|
92
|
+
}
|
93
|
+
else {
|
94
|
+
temp = d[j][0];
|
95
|
+
if ((temp !== null && temp < db.min) || db.min === null) {
|
96
|
+
db.min = temp;
|
97
|
+
}
|
98
|
+
if ((temp !== null && temp > db.max) || db.max === null) {
|
99
|
+
db.max = temp;
|
100
|
+
}
|
101
|
+
}
|
102
|
+
}
|
103
|
+
}
|
104
|
+
};
|
105
|
+
|
106
|
+
// called with scope of axis
|
107
|
+
$.jqplot.PyramidAxisRenderer.prototype.draw = function(ctx, plot) {
|
108
|
+
if (this.show) {
|
109
|
+
// populate the axis label and value properties.
|
110
|
+
// createTicks is a method on the renderer, but
|
111
|
+
// call it within the scope of the axis.
|
112
|
+
this.renderer.createTicks.call(this, plot);
|
113
|
+
// fill a div with axes labels in the right direction.
|
114
|
+
// Need to pregenerate each axis to get it's bounds and
|
115
|
+
// position it and the labels correctly on the plot.
|
116
|
+
var dim=0;
|
117
|
+
var temp;
|
118
|
+
// Added for theming.
|
119
|
+
if (this._elem) {
|
120
|
+
// Memory Leaks patch
|
121
|
+
//this._elem.empty();
|
122
|
+
this._elem.emptyForce();
|
123
|
+
this._elem = null;
|
124
|
+
}
|
125
|
+
|
126
|
+
this._elem = $(document.createElement('div'));
|
127
|
+
this._elem.addClass('jqplot-axis jqplot-'+this.name);
|
128
|
+
this._elem.css('position', 'absolute');
|
129
|
+
|
130
|
+
|
131
|
+
if (this.name == 'xaxis' || this.name == 'x2axis') {
|
132
|
+
this._elem.width(this._plotDimensions.width);
|
133
|
+
}
|
134
|
+
else {
|
135
|
+
this._elem.height(this._plotDimensions.height);
|
136
|
+
}
|
137
|
+
|
138
|
+
// create a _label object.
|
139
|
+
this.labelOptions.axis = this.name;
|
140
|
+
this._label = new this.labelRenderer(this.labelOptions);
|
141
|
+
if (this._label.show) {
|
142
|
+
var elem = this._label.draw(ctx, plot);
|
143
|
+
elem.appendTo(this._elem);
|
144
|
+
elem = null;
|
145
|
+
}
|
146
|
+
|
147
|
+
var t = this._ticks;
|
148
|
+
var tick;
|
149
|
+
for (var i=0; i<t.length; i++) {
|
150
|
+
tick = t[i];
|
151
|
+
if (tick.show && tick.showLabel && (!tick.isMinorTick)) {
|
152
|
+
this._elem.append(tick.draw(ctx, plot));
|
153
|
+
}
|
154
|
+
}
|
155
|
+
tick = null;
|
156
|
+
t = null;
|
157
|
+
}
|
158
|
+
return this._elem;
|
159
|
+
};
|
160
|
+
|
161
|
+
// Note, primes can be found on http://primes.utm.edu/
|
162
|
+
var _primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];
|
163
|
+
|
164
|
+
|
165
|
+
var _primesHash = {};
|
166
|
+
|
167
|
+
for (var i =0, l = _primes.length; i < l; i++) {
|
168
|
+
_primesHash[_primes[i]] = _primes[i];
|
169
|
+
}
|
170
|
+
|
171
|
+
// called with scope of axis
|
172
|
+
$.jqplot.PyramidAxisRenderer.prototype.createTicks = function(plot) {
|
173
|
+
// we're are operating on an axis here
|
174
|
+
var userTicks = this.ticks;
|
175
|
+
// databounds were set on axis initialization.
|
176
|
+
var db = this._dataBounds;
|
177
|
+
var dim;
|
178
|
+
var interval;
|
179
|
+
var min;
|
180
|
+
var max;
|
181
|
+
var range;
|
182
|
+
var pos1;
|
183
|
+
var pos2;
|
184
|
+
var tt;
|
185
|
+
var i;
|
186
|
+
var l;
|
187
|
+
var s;
|
188
|
+
// get a copy of user's settings for min/max.
|
189
|
+
var userMin = this.min;
|
190
|
+
var userMax = this.max;
|
191
|
+
var ut;
|
192
|
+
var t;
|
193
|
+
var threshold;
|
194
|
+
var tdim;
|
195
|
+
var scalefact;
|
196
|
+
var ret;
|
197
|
+
var tumin;
|
198
|
+
var tumax;
|
199
|
+
var maxVisibleTicks;
|
200
|
+
var val;
|
201
|
+
var skip = null;
|
202
|
+
var temp;
|
203
|
+
|
204
|
+
// if we already have ticks, use them.
|
205
|
+
// ticks must be in order of increasing value.
|
206
|
+
|
207
|
+
if (userTicks.length) {
|
208
|
+
// ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed
|
209
|
+
for (i=0, l=userTicks.length; i<l; i++){
|
210
|
+
ut = userTicks[i];
|
211
|
+
t = new this.tickRenderer(this.tickOptions);
|
212
|
+
if ($.isArray(ut)) {
|
213
|
+
t.value = ut[0];
|
214
|
+
t.label = ut[1];
|
215
|
+
t.setTick(ut[0], this.name);
|
216
|
+
this._ticks.push(t);
|
217
|
+
}
|
218
|
+
|
219
|
+
else if ($.isPlainObject(ut)) {
|
220
|
+
$.extend(true, t, ut);
|
221
|
+
t.axis = this.name;
|
222
|
+
this._ticks.push(t);
|
223
|
+
}
|
224
|
+
|
225
|
+
else {
|
226
|
+
if (typeof ut === 'string') {
|
227
|
+
val = i + plot.defaultAxisStart;
|
228
|
+
}
|
229
|
+
else {
|
230
|
+
val = ut;
|
231
|
+
}
|
232
|
+
t.value = val;
|
233
|
+
t.label = ut;
|
234
|
+
t.axis = this.name;
|
235
|
+
this._ticks.push(t);
|
236
|
+
}
|
237
|
+
}
|
238
|
+
this.numberTicks = userTicks.length;
|
239
|
+
this.min = this._ticks[0].value;
|
240
|
+
this.max = this._ticks[this.numberTicks-1].value;
|
241
|
+
this.tickInterval = (this.max - this.min) / (this.numberTicks - 1);
|
242
|
+
|
243
|
+
// use user specified tickInterval if there is one
|
244
|
+
if (this._options.tickInterval) {
|
245
|
+
// hide every tick except for ticks on interval
|
246
|
+
var ti = this._options.tickInterval;
|
247
|
+
for (i=0; i<this.numberTicks; i++) {
|
248
|
+
if (i%ti !== 0) {
|
249
|
+
// this._ticks[i].show = false;
|
250
|
+
this._ticks[i].isMinorTick = true;
|
251
|
+
}
|
252
|
+
}
|
253
|
+
}
|
254
|
+
|
255
|
+
else {
|
256
|
+
// check if we have too many ticks
|
257
|
+
dim = (this.name.charAt(0) === 'x') ? this._plotDimensions.width : this._plotDimensions.height;
|
258
|
+
maxVisibleTicks = Math.round(2.0 + dim/this.tickSpacingFactor);
|
259
|
+
|
260
|
+
if (this.numberTicks > maxVisibleTicks) {
|
261
|
+
// check for number of ticks we can skip
|
262
|
+
temp = this.numberTicks - 1;
|
263
|
+
for (i=2; i<temp; i++) {
|
264
|
+
if (temp % i === 0 && temp/i < maxVisibleTicks) {
|
265
|
+
skip = i-1;
|
266
|
+
break;
|
267
|
+
}
|
268
|
+
}
|
269
|
+
|
270
|
+
if (skip !== null) {
|
271
|
+
var count = 1;
|
272
|
+
for (i=1, l=this._ticks.length; i<l; i++) {
|
273
|
+
if (count <= skip) {
|
274
|
+
this._ticks[i].show = false;
|
275
|
+
count += 1;
|
276
|
+
}
|
277
|
+
else {
|
278
|
+
count = 1;
|
279
|
+
}
|
280
|
+
}
|
281
|
+
}
|
282
|
+
}
|
283
|
+
}
|
284
|
+
|
285
|
+
// if category style, add minor ticks in between
|
286
|
+
temp = [];
|
287
|
+
if (this.category) {
|
288
|
+
// turn off gridline and mark on first tick
|
289
|
+
this._ticks[0].showGridline = false;
|
290
|
+
this._ticks[0].showMark = false;
|
291
|
+
|
292
|
+
for (i=this._ticks.length-1; i>0; i--) {
|
293
|
+
t = new this.tickRenderer(this.tickOptions);
|
294
|
+
t.value = this._ticks[i-1].value + this.tickInterval/2.0;
|
295
|
+
t.label = '';
|
296
|
+
t.showLabel = false;
|
297
|
+
t.axis = this.name;
|
298
|
+
this._ticks[i].showGridline = false;
|
299
|
+
this._ticks[i].showMark = false;
|
300
|
+
this._ticks.splice(i, 0, t);
|
301
|
+
// temp.push(t);
|
302
|
+
}
|
303
|
+
|
304
|
+
// merge in the new ticks
|
305
|
+
// for (i=1, l=temp.length; i<l; i++) {
|
306
|
+
// this._ticks.splice(i, 0, temp[i]);
|
307
|
+
// }
|
308
|
+
|
309
|
+
// now add a tick at beginning and end
|
310
|
+
t = new this.tickRenderer(this.tickOptions);
|
311
|
+
t.value = this._ticks[0].value - this.tickInterval/2.0;
|
312
|
+
t.label = '';
|
313
|
+
t.showLabel = false;
|
314
|
+
t.axis = this.name;
|
315
|
+
this._ticks.unshift(t);
|
316
|
+
|
317
|
+
t = new this.tickRenderer(this.tickOptions);
|
318
|
+
t.value = this._ticks[this._ticks.length-1].value + this.tickInterval/2.0;
|
319
|
+
t.label = '';
|
320
|
+
t.showLabel = false;
|
321
|
+
t.axis = this.name;
|
322
|
+
this._ticks.push(t);
|
323
|
+
|
324
|
+
this.tickInterval = this.tickInterval / 2.0;
|
325
|
+
this.numberTicks = this._ticks.length;
|
326
|
+
this.min = this._ticks[0].value;
|
327
|
+
this.max = this._ticks[this._ticks.length-1].value;
|
328
|
+
}
|
329
|
+
}
|
330
|
+
|
331
|
+
// we don't have any ticks yet, let's make some!
|
332
|
+
else {
|
333
|
+
if (this.name.charAt(0) === 'x') {
|
334
|
+
dim = this._plotDimensions.width;
|
335
|
+
// make sure x axis is symetric about 0.
|
336
|
+
var tempmax = Math.max(db.max, Math.abs(db.min));
|
337
|
+
var tempmin = Math.min(db.min, -tempmax);
|
338
|
+
// min = ((this.min != null) ? this.min : tempmin);
|
339
|
+
// max = ((this.max != null) ? this.max : tempmax);
|
340
|
+
min = tempmin;
|
341
|
+
max = tempmax;
|
342
|
+
range = max - min;
|
343
|
+
|
344
|
+
if (this.tickOptions == null || !this.tickOptions.formatString) {
|
345
|
+
this._overrideFormatString = true;
|
346
|
+
}
|
347
|
+
|
348
|
+
threshold = 30;
|
349
|
+
tdim = Math.max(dim, threshold+1);
|
350
|
+
scalefact = (tdim-threshold)/300.0;
|
351
|
+
ret = $.jqplot.LinearTickGenerator(min, max, scalefact);
|
352
|
+
// calculate a padded max and min, points should be less than these
|
353
|
+
// so that they aren't too close to the edges of the plot.
|
354
|
+
// User can adjust how much padding is allowed with pad, padMin and PadMax options.
|
355
|
+
tumin = min + range*(this.padMin - 1);
|
356
|
+
tumax = max - range*(this.padMax - 1);
|
357
|
+
|
358
|
+
if (min < tumin || max > tumax) {
|
359
|
+
tumin = min - range*(this.padMin - 1);
|
360
|
+
tumax = max + range*(this.padMax - 1);
|
361
|
+
ret = $.jqplot.LinearTickGenerator(tumin, tumax, scalefact);
|
362
|
+
}
|
363
|
+
|
364
|
+
this.min = ret[0];
|
365
|
+
this.max = ret[1];
|
366
|
+
this.numberTicks = ret[2];
|
367
|
+
this._autoFormatString = ret[3];
|
368
|
+
this.tickInterval = ret[4];
|
369
|
+
}
|
370
|
+
else {
|
371
|
+
dim = this._plotDimensions.height;
|
372
|
+
|
373
|
+
// ticks will be on whole integers like 1, 2, 3, ... or 1, 4, 7, ...
|
374
|
+
min = db.min;
|
375
|
+
max = db.max;
|
376
|
+
s = this._series[0];
|
377
|
+
this._ticks = [];
|
378
|
+
|
379
|
+
range = max - min;
|
380
|
+
|
381
|
+
// if range is a prime, will get only 2 ticks, expand range in that case.
|
382
|
+
if (_primesHash[range]) {
|
383
|
+
range += 1;
|
384
|
+
max += 1;
|
385
|
+
}
|
386
|
+
|
387
|
+
this.max = max;
|
388
|
+
this.min = min;
|
389
|
+
|
390
|
+
maxVisibleTicks = Math.round(2.0 + dim/this.tickSpacingFactor);
|
391
|
+
|
392
|
+
if (range + 1 <= maxVisibleTicks) {
|
393
|
+
this.numberTicks = range + 1;
|
394
|
+
this.tickInterval = 1.0;
|
395
|
+
}
|
396
|
+
|
397
|
+
else {
|
398
|
+
// figure out a round number of ticks to skip in every interval
|
399
|
+
// range / ti + 1 = nt
|
400
|
+
// ti = range / (nt - 1)
|
401
|
+
for (var i=maxVisibleTicks; i>1; i--) {
|
402
|
+
if (range/(i - 1) === Math.round(range/(i - 1))) {
|
403
|
+
this.numberTicks = i;
|
404
|
+
this.tickInterval = range/(i - 1);
|
405
|
+
break;
|
406
|
+
}
|
407
|
+
|
408
|
+
}
|
409
|
+
}
|
410
|
+
}
|
411
|
+
|
412
|
+
if (this._overrideFormatString && this._autoFormatString != '') {
|
413
|
+
this.tickOptions = this.tickOptions || {};
|
414
|
+
this.tickOptions.formatString = this._autoFormatString;
|
415
|
+
}
|
416
|
+
|
417
|
+
var labelval;
|
418
|
+
for (i=0; i<this.numberTicks; i++) {
|
419
|
+
this.tickOptions.axis = this.name;
|
420
|
+
labelval = this.min + this.tickInterval * i;
|
421
|
+
if (this.name.charAt(0) === 'x') {
|
422
|
+
labelval = Math.abs(labelval);
|
423
|
+
}
|
424
|
+
// this.tickOptions.label = String (labelval);
|
425
|
+
this.tickOptions.value = this.min + this.tickInterval * i;
|
426
|
+
t = new this.tickRenderer(this.tickOptions);
|
427
|
+
|
428
|
+
t.label = t.prefix + t.formatter(t.formatString, labelval);
|
429
|
+
|
430
|
+
this._ticks.push(t);
|
431
|
+
// for x axis, if y axis is in middle, add a symetrical 0 tick
|
432
|
+
if (this.name.charAt(0) === 'x' && plot.axes.yMidAxis.show && this.tickOptions.value === 0) {
|
433
|
+
this._splitAxis = true;
|
434
|
+
this._splitLength = plot.axes.yMidAxis.getWidth();
|
435
|
+
// t.value = -this.max/2000.0;
|
436
|
+
t = new this.tickRenderer(this.tickOptions);
|
437
|
+
this._ticks.push(t);
|
438
|
+
t.value = this.max/2000.0;
|
439
|
+
}
|
440
|
+
}
|
441
|
+
t = null;
|
442
|
+
}
|
443
|
+
};
|
444
|
+
|
445
|
+
// called with scope of axis
|
446
|
+
$.jqplot.PyramidAxisRenderer.prototype.set = function() {
|
447
|
+
var dim = 0;
|
448
|
+
var temp;
|
449
|
+
var w = 0;
|
450
|
+
var h = 0;
|
451
|
+
var i;
|
452
|
+
var t;
|
453
|
+
var tick;
|
454
|
+
var lshow = (this._label == null) ? false : this._label.show;
|
455
|
+
if (this.show) {
|
456
|
+
t = this._ticks;
|
457
|
+
l = t.length;
|
458
|
+
for (i=0; i<l; i++) {
|
459
|
+
tick = t[i];
|
460
|
+
if (!tick._breakTick && tick.show && tick.showLabel && !tick.isMinorTick) {
|
461
|
+
if (this.name.charAt(0) === 'x') {
|
462
|
+
temp = tick._elem.outerHeight(true);
|
463
|
+
}
|
464
|
+
else {
|
465
|
+
temp = tick._elem.outerWidth(true);
|
466
|
+
}
|
467
|
+
if (temp > dim) {
|
468
|
+
dim = temp;
|
469
|
+
}
|
470
|
+
}
|
471
|
+
}
|
472
|
+
|
473
|
+
if (this.name === 'yMidAxis') {
|
474
|
+
for (i=0; i<l; i++) {
|
475
|
+
tick = t[i];
|
476
|
+
if (tick._elem) {
|
477
|
+
temp = (dim - tick._elem.outerWidth(true))/2.0;
|
478
|
+
tick._elem.css('left', temp);
|
479
|
+
}
|
480
|
+
}
|
481
|
+
}
|
482
|
+
tick = null;
|
483
|
+
t = null;
|
484
|
+
|
485
|
+
if (lshow) {
|
486
|
+
w = this._label._elem.outerWidth(true);
|
487
|
+
h = this._label._elem.outerHeight(true);
|
488
|
+
}
|
489
|
+
if (this.name === 'xaxis') {
|
490
|
+
dim = dim + h;
|
491
|
+
this._elem.css({'height':dim+'px', left:'0px', bottom:'0px'});
|
492
|
+
}
|
493
|
+
else if (this.name === 'x2axis') {
|
494
|
+
dim = dim + h;
|
495
|
+
this._elem.css({'height':dim+'px', left:'0px', top:'0px'});
|
496
|
+
}
|
497
|
+
else if (this.name === 'yaxis') {
|
498
|
+
dim = dim + w;
|
499
|
+
this._elem.css({'width':dim+'px', left:'0px', top:'0px'});
|
500
|
+
if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {
|
501
|
+
this._label._elem.css('width', w+'px');
|
502
|
+
}
|
503
|
+
}
|
504
|
+
else if (this.name === 'yMidAxis') {
|
505
|
+
// don't include width of label at all in width of axis?
|
506
|
+
// dim = (dim > w) ? dim : w;
|
507
|
+
var temp = dim/2.0 - w/2.0;
|
508
|
+
this._elem.css({'width':dim+'px', top:'0px'});
|
509
|
+
if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {
|
510
|
+
this._label._elem.css({width: w, left: temp, top: 0});
|
511
|
+
}
|
512
|
+
}
|
513
|
+
else {
|
514
|
+
dim = dim + w;
|
515
|
+
this._elem.css({'width':dim+'px', right:'0px', top:'0px'});
|
516
|
+
if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {
|
517
|
+
this._label._elem.css('width', w+'px');
|
518
|
+
}
|
519
|
+
}
|
520
|
+
}
|
521
|
+
};
|
522
|
+
|
523
|
+
$.jqplot.PyramidAxisRenderer.prototype.pack = function(pos, offsets) {
|
524
|
+
// Add defaults for repacking from resetTickValues function.
|
525
|
+
pos = pos || {};
|
526
|
+
offsets = offsets || this._offsets;
|
527
|
+
|
528
|
+
var ticks = this._ticks;
|
529
|
+
var max = this.max;
|
530
|
+
var min = this.min;
|
531
|
+
var offmax = offsets.max;
|
532
|
+
var offmin = offsets.min;
|
533
|
+
var lshow = (this._label == null) ? false : this._label.show;
|
534
|
+
|
535
|
+
for (var p in pos) {
|
536
|
+
this._elem.css(p, pos[p]);
|
537
|
+
}
|
538
|
+
|
539
|
+
this._offsets = offsets;
|
540
|
+
// pixellength will be + for x axes and - for y axes becasue pixels always measured from top left.
|
541
|
+
var pixellength = offmax - offmin;
|
542
|
+
var unitlength = max - min;
|
543
|
+
var sl = this._splitLength;
|
544
|
+
|
545
|
+
// point to unit and unit to point conversions references to Plot DOM element top left corner.
|
546
|
+
if (this._splitAxis) {
|
547
|
+
pixellength -= this._splitLength;
|
548
|
+
|
549
|
+
// don't know that this one is correct.
|
550
|
+
this.p2u = function(p){
|
551
|
+
return (p - offmin) * unitlength / pixellength + min;
|
552
|
+
};
|
553
|
+
|
554
|
+
this.u2p = function(u){
|
555
|
+
if (u <= 0) {
|
556
|
+
return (u - min) * pixellength / unitlength + offmin;
|
557
|
+
}
|
558
|
+
else {
|
559
|
+
return (u - min) * pixellength / unitlength + offmin + sl;
|
560
|
+
}
|
561
|
+
};
|
562
|
+
|
563
|
+
this.series_u2p = function(u){
|
564
|
+
if (u <= 0) {
|
565
|
+
return (u - min) * pixellength / unitlength;
|
566
|
+
}
|
567
|
+
else {
|
568
|
+
return (u - min) * pixellength / unitlength + sl;
|
569
|
+
}
|
570
|
+
};
|
571
|
+
|
572
|
+
// don't know that this one is correct.
|
573
|
+
this.series_p2u = function(p){
|
574
|
+
return p * unitlength / pixellength + min;
|
575
|
+
};
|
576
|
+
}
|
577
|
+
else {
|
578
|
+
this.p2u = function(p){
|
579
|
+
return (p - offmin) * unitlength / pixellength + min;
|
580
|
+
};
|
581
|
+
|
582
|
+
this.u2p = function(u){
|
583
|
+
return (u - min) * pixellength / unitlength + offmin;
|
584
|
+
};
|
585
|
+
|
586
|
+
if (this.name.charAt(0) === 'x'){
|
587
|
+
this.series_u2p = function(u){
|
588
|
+
return (u - min) * pixellength / unitlength;
|
589
|
+
};
|
590
|
+
this.series_p2u = function(p){
|
591
|
+
return p * unitlength / pixellength + min;
|
592
|
+
};
|
593
|
+
}
|
594
|
+
|
595
|
+
else {
|
596
|
+
this.series_u2p = function(u){
|
597
|
+
return (u - max) * pixellength / unitlength;
|
598
|
+
};
|
599
|
+
this.series_p2u = function(p){
|
600
|
+
return p * unitlength / pixellength + max;
|
601
|
+
};
|
602
|
+
}
|
603
|
+
}
|
604
|
+
|
605
|
+
if (this.show) {
|
606
|
+
if (this.name.charAt(0) === 'x') {
|
607
|
+
for (var i=0; i<ticks.length; i++) {
|
608
|
+
var t = ticks[i];
|
609
|
+
if (t.show && t.showLabel) {
|
610
|
+
var shim;
|
611
|
+
|
612
|
+
if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {
|
613
|
+
// will need to adjust auto positioning based on which axis this is.
|
614
|
+
var temp = (this.name == 'xaxis') ? 1 : -1;
|
615
|
+
switch (t.labelPosition) {
|
616
|
+
case 'auto':
|
617
|
+
// position at end
|
618
|
+
if (temp * t.angle < 0) {
|
619
|
+
shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;
|
620
|
+
}
|
621
|
+
// position at start
|
622
|
+
else {
|
623
|
+
shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;
|
624
|
+
}
|
625
|
+
break;
|
626
|
+
case 'end':
|
627
|
+
shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;
|
628
|
+
break;
|
629
|
+
case 'start':
|
630
|
+
shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;
|
631
|
+
break;
|
632
|
+
case 'middle':
|
633
|
+
shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;
|
634
|
+
break;
|
635
|
+
default:
|
636
|
+
shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;
|
637
|
+
break;
|
638
|
+
}
|
639
|
+
}
|
640
|
+
else {
|
641
|
+
shim = -t.getWidth()/2;
|
642
|
+
}
|
643
|
+
var val = this.u2p(t.value) + shim + 'px';
|
644
|
+
t._elem.css('left', val);
|
645
|
+
t.pack();
|
646
|
+
}
|
647
|
+
}
|
648
|
+
if (lshow) {
|
649
|
+
var w = this._label._elem.outerWidth(true);
|
650
|
+
this._label._elem.css('left', offmin + pixellength/2 - w/2 + 'px');
|
651
|
+
if (this.name == 'xaxis') {
|
652
|
+
this._label._elem.css('bottom', '0px');
|
653
|
+
}
|
654
|
+
else {
|
655
|
+
this._label._elem.css('top', '0px');
|
656
|
+
}
|
657
|
+
this._label.pack();
|
658
|
+
}
|
659
|
+
}
|
660
|
+
else {
|
661
|
+
for (var i=0; i<ticks.length; i++) {
|
662
|
+
var t = ticks[i];
|
663
|
+
if (t.show && t.showLabel && !t.isMinorTick) {
|
664
|
+
var shim;
|
665
|
+
if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {
|
666
|
+
// will need to adjust auto positioning based on which axis this is.
|
667
|
+
var temp = (this.name == 'yaxis') ? 1 : -1;
|
668
|
+
switch (t.labelPosition) {
|
669
|
+
case 'auto':
|
670
|
+
// position at end
|
671
|
+
case 'end':
|
672
|
+
if (temp * t.angle < 0) {
|
673
|
+
shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;
|
674
|
+
}
|
675
|
+
else {
|
676
|
+
shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;
|
677
|
+
}
|
678
|
+
break;
|
679
|
+
case 'start':
|
680
|
+
if (t.angle > 0) {
|
681
|
+
shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;
|
682
|
+
}
|
683
|
+
else {
|
684
|
+
shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;
|
685
|
+
}
|
686
|
+
break;
|
687
|
+
case 'middle':
|
688
|
+
// if (t.angle > 0) {
|
689
|
+
// shim = -t.getHeight()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;
|
690
|
+
// }
|
691
|
+
// else {
|
692
|
+
// shim = -t.getHeight()/2 - t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;
|
693
|
+
// }
|
694
|
+
shim = -t.getHeight()/2;
|
695
|
+
break;
|
696
|
+
default:
|
697
|
+
shim = -t.getHeight()/2;
|
698
|
+
break;
|
699
|
+
}
|
700
|
+
}
|
701
|
+
else {
|
702
|
+
shim = -t.getHeight()/2;
|
703
|
+
}
|
704
|
+
|
705
|
+
var val = this.u2p(t.value) + shim + 'px';
|
706
|
+
t._elem.css('top', val);
|
707
|
+
t.pack();
|
708
|
+
}
|
709
|
+
}
|
710
|
+
if (lshow) {
|
711
|
+
var h = this._label._elem.outerHeight(true);
|
712
|
+
if (this.name !== 'yMidAxis') {
|
713
|
+
this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px');
|
714
|
+
}
|
715
|
+
if (this.name == 'yaxis') {
|
716
|
+
this._label._elem.css('left', '0px');
|
717
|
+
}
|
718
|
+
else if (this.name !== 'yMidAxis') {
|
719
|
+
this._label._elem.css('right', '0px');
|
720
|
+
}
|
721
|
+
this._label.pack();
|
722
|
+
}
|
723
|
+
}
|
724
|
+
}
|
725
|
+
|
726
|
+
ticks = null;
|
727
|
+
};
|
728
|
+
})(jQuery);
|