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,728 +1,728 @@
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
- $.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 its 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);
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
+ $.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 its 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);