1 | /** |
---|
2 | * jqPlot |
---|
3 | * Pure JavaScript plotting plugin using jQuery |
---|
4 | * |
---|
5 | * Version: 1.0.0b2_r1012 |
---|
6 | * |
---|
7 | * Copyright (c) 2009-2011 Chris Leonello |
---|
8 | * jqPlot is currently available for use in all personal or commercial projects |
---|
9 | * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL |
---|
10 | * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can |
---|
11 | * choose the license that best suits your project and use it accordingly. |
---|
12 | * |
---|
13 | * Although not required, the author would appreciate an email letting him |
---|
14 | * know of any substantial use of jqPlot. You can reach the author at: |
---|
15 | * chris at jqplot dot com or see http://www.jqplot.com/info.php . |
---|
16 | * |
---|
17 | * If you are feeling kind and generous, consider supporting the project by |
---|
18 | * making a donation at: http://www.jqplot.com/donate.php . |
---|
19 | * |
---|
20 | * sprintf functions contained in jqplot.sprintf.js by Ash Searle: |
---|
21 | * |
---|
22 | * version 2007.04.27 |
---|
23 | * author Ash Searle |
---|
24 | * http://hexmen.com/blog/2007/03/printf-sprintf/ |
---|
25 | * http://hexmen.com/js/sprintf.js |
---|
26 | * The author (Ash Searle) has placed this code in the public domain: |
---|
27 | * "This code is unrestricted: you are free to use it however you like." |
---|
28 | * |
---|
29 | */ |
---|
30 | (function($) { |
---|
31 | // class: $.jqplot.MekkoAxisRenderer |
---|
32 | // An axis renderer for a Mekko chart. |
---|
33 | // Should be used with a Mekko chart where the mekkoRenderer is used on the series. |
---|
34 | // Displays the Y axis as a range from 0 to 1 (0 to 100%) and the x axis with a tick |
---|
35 | // for each series scaled to the sum of all the y values. |
---|
36 | $.jqplot.MekkoAxisRenderer = function() { |
---|
37 | }; |
---|
38 | |
---|
39 | // called with scope of axis object. |
---|
40 | $.jqplot.MekkoAxisRenderer.prototype.init = function(options){ |
---|
41 | // prop: tickMode |
---|
42 | // How to space the ticks on the axis. |
---|
43 | // 'bar' will place a tick at the width of each bar. |
---|
44 | // This is the default for the x axis. |
---|
45 | // 'even' will place ticks at even intervals. This is |
---|
46 | // the default for x2 axis and y axis. y axis cannot be changed. |
---|
47 | this.tickMode; |
---|
48 | // prop: barLabelRenderer |
---|
49 | // renderer to use to draw labels under each bar. |
---|
50 | this.barLabelRenderer = $.jqplot.AxisLabelRenderer; |
---|
51 | // prop: barLabels |
---|
52 | // array of labels to put under each bar. |
---|
53 | this.barLabels = this.barLabels || []; |
---|
54 | // prop: barLabelOptions |
---|
55 | // options object to pass to the bar label renderer. |
---|
56 | this.barLabelOptions = {}; |
---|
57 | this.tickOptions = $.extend(true, {showGridline:false}, this.tickOptions); |
---|
58 | this._barLabels = []; |
---|
59 | $.extend(true, this, options); |
---|
60 | if (this.name == 'yaxis') { |
---|
61 | this.tickOptions.formatString = this.tickOptions.formatString || "%d\%"; |
---|
62 | } |
---|
63 | var db = this._dataBounds; |
---|
64 | db.min = 0; |
---|
65 | // for y axes, scale always go from 0 to 1 (0 to 100%) |
---|
66 | if (this.name == 'yaxis' || this.name == 'y2axis') { |
---|
67 | db.max = 100; |
---|
68 | this.tickMode = 'even'; |
---|
69 | } |
---|
70 | // For x axes, scale goes from 0 to sum of all y values. |
---|
71 | else if (this.name == 'xaxis'){ |
---|
72 | this.tickMode = (this.tickMode == null) ? 'bar' : this.tickMode; |
---|
73 | for (var i=0; i<this._series.length; i++) { |
---|
74 | db.max += this._series[i]._sumy; |
---|
75 | } |
---|
76 | } |
---|
77 | else if (this.name == 'x2axis'){ |
---|
78 | this.tickMode = (this.tickMode == null) ? 'even' : this.tickMode; |
---|
79 | for (var i=0; i<this._series.length; i++) { |
---|
80 | db.max += this._series[i]._sumy; |
---|
81 | } |
---|
82 | } |
---|
83 | }; |
---|
84 | |
---|
85 | // called with scope of axis |
---|
86 | $.jqplot.MekkoAxisRenderer.prototype.draw = function(ctx, plot) { |
---|
87 | if (this.show) { |
---|
88 | // populate the axis label and value properties. |
---|
89 | // createTicks is a method on the renderer, but |
---|
90 | // call it within the scope of the axis. |
---|
91 | this.renderer.createTicks.call(this); |
---|
92 | // fill a div with axes labels in the right direction. |
---|
93 | // Need to pregenerate each axis to get it's bounds and |
---|
94 | // position it and the labels correctly on the plot. |
---|
95 | var dim=0; |
---|
96 | var temp; |
---|
97 | |
---|
98 | var elem = document.createElement('div'); |
---|
99 | this._elem = $(elem); |
---|
100 | this._elem.addClass('jqplot-axis jqplot-'+this.name); |
---|
101 | this._elem.css('position', 'absolute'); |
---|
102 | elem = null; |
---|
103 | |
---|
104 | if (this.name == 'xaxis' || this.name == 'x2axis') { |
---|
105 | this._elem.width(this._plotDimensions.width); |
---|
106 | } |
---|
107 | else { |
---|
108 | this._elem.height(this._plotDimensions.height); |
---|
109 | } |
---|
110 | |
---|
111 | // draw the axis label |
---|
112 | // create a _label object. |
---|
113 | this.labelOptions.axis = this.name; |
---|
114 | this._label = new this.labelRenderer(this.labelOptions); |
---|
115 | if (this._label.show) { |
---|
116 | this._elem.append(this._label.draw(ctx)); |
---|
117 | } |
---|
118 | |
---|
119 | var t, tick, elem; |
---|
120 | if (this.showTicks) { |
---|
121 | t = this._ticks; |
---|
122 | for (var i=0; i<t.length; i++) { |
---|
123 | tick = t[i]; |
---|
124 | if (tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) { |
---|
125 | this._elem.append(tick.draw(ctx)); |
---|
126 | } |
---|
127 | } |
---|
128 | } |
---|
129 | |
---|
130 | // draw the series labels |
---|
131 | for (i=0; i<this.barLabels.length; i++) { |
---|
132 | this.barLabelOptions.axis = this.name; |
---|
133 | this.barLabelOptions.label = this.barLabels[i]; |
---|
134 | this._barLabels.push(new this.barLabelRenderer(this.barLabelOptions)); |
---|
135 | if (this.tickMode != 'bar') { |
---|
136 | this._barLabels[i].show = false; |
---|
137 | } |
---|
138 | if (this._barLabels[i].show) { |
---|
139 | var elem = this._barLabels[i].draw(ctx, plot); |
---|
140 | elem.removeClass('jqplot-'+this.name+'-label'); |
---|
141 | elem.addClass('jqplot-'+this.name+'-tick'); |
---|
142 | elem.addClass('jqplot-mekko-barLabel'); |
---|
143 | elem.appendTo(this._elem); |
---|
144 | elem = null; |
---|
145 | } |
---|
146 | } |
---|
147 | |
---|
148 | } |
---|
149 | return this._elem; |
---|
150 | }; |
---|
151 | |
---|
152 | // called with scope of an axis |
---|
153 | $.jqplot.MekkoAxisRenderer.prototype.reset = function() { |
---|
154 | this.min = this._min; |
---|
155 | this.max = this._max; |
---|
156 | this.tickInterval = this._tickInterval; |
---|
157 | this.numberTicks = this._numberTicks; |
---|
158 | // this._ticks = this.__ticks; |
---|
159 | }; |
---|
160 | |
---|
161 | // called with scope of axis |
---|
162 | $.jqplot.MekkoAxisRenderer.prototype.set = function() { |
---|
163 | var dim = 0; |
---|
164 | var temp; |
---|
165 | var w = 0; |
---|
166 | var h = 0; |
---|
167 | var lshow = (this._label == null) ? false : this._label.show; |
---|
168 | if (this.show && this.showTicks) { |
---|
169 | var t = this._ticks; |
---|
170 | for (var i=0; i<t.length; i++) { |
---|
171 | var tick = t[i]; |
---|
172 | if (tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) { |
---|
173 | if (this.name == 'xaxis' || this.name == 'x2axis') { |
---|
174 | temp = tick._elem.outerHeight(true); |
---|
175 | } |
---|
176 | else { |
---|
177 | temp = tick._elem.outerWidth(true); |
---|
178 | } |
---|
179 | if (temp > dim) { |
---|
180 | dim = temp; |
---|
181 | } |
---|
182 | } |
---|
183 | } |
---|
184 | |
---|
185 | if (lshow) { |
---|
186 | w = this._label._elem.outerWidth(true); |
---|
187 | h = this._label._elem.outerHeight(true); |
---|
188 | } |
---|
189 | if (this.name == 'xaxis') { |
---|
190 | dim = dim + h; |
---|
191 | this._elem.css({'height':dim+'px', left:'0px', bottom:'0px'}); |
---|
192 | } |
---|
193 | else if (this.name == 'x2axis') { |
---|
194 | dim = dim + h; |
---|
195 | this._elem.css({'height':dim+'px', left:'0px', top:'0px'}); |
---|
196 | } |
---|
197 | else if (this.name == 'yaxis') { |
---|
198 | dim = dim + w; |
---|
199 | this._elem.css({'width':dim+'px', left:'0px', top:'0px'}); |
---|
200 | if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) { |
---|
201 | this._label._elem.css('width', w+'px'); |
---|
202 | } |
---|
203 | } |
---|
204 | else { |
---|
205 | dim = dim + w; |
---|
206 | this._elem.css({'width':dim+'px', right:'0px', top:'0px'}); |
---|
207 | if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) { |
---|
208 | this._label._elem.css('width', w+'px'); |
---|
209 | } |
---|
210 | } |
---|
211 | } |
---|
212 | }; |
---|
213 | |
---|
214 | // called with scope of axis |
---|
215 | $.jqplot.MekkoAxisRenderer.prototype.createTicks = function() { |
---|
216 | // we're are operating on an axis here |
---|
217 | var ticks = this._ticks; |
---|
218 | var userTicks = this.ticks; |
---|
219 | var name = this.name; |
---|
220 | // databounds were set on axis initialization. |
---|
221 | var db = this._dataBounds; |
---|
222 | var dim, interval; |
---|
223 | var min, max; |
---|
224 | var pos1, pos2; |
---|
225 | var t, tt, i, j; |
---|
226 | |
---|
227 | // if we already have ticks, use them. |
---|
228 | // ticks must be in order of increasing value. |
---|
229 | |
---|
230 | if (userTicks.length) { |
---|
231 | // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed |
---|
232 | for (i=0; i<userTicks.length; i++){ |
---|
233 | var ut = userTicks[i]; |
---|
234 | var t = new this.tickRenderer(this.tickOptions); |
---|
235 | if (ut.constructor == Array) { |
---|
236 | t.value = ut[0]; |
---|
237 | t.label = ut[1]; |
---|
238 | if (!this.showTicks) { |
---|
239 | t.showLabel = false; |
---|
240 | t.showMark = false; |
---|
241 | } |
---|
242 | else if (!this.showTickMarks) { |
---|
243 | t.showMark = false; |
---|
244 | } |
---|
245 | t.setTick(ut[0], this.name); |
---|
246 | this._ticks.push(t); |
---|
247 | } |
---|
248 | |
---|
249 | else { |
---|
250 | t.value = ut; |
---|
251 | if (!this.showTicks) { |
---|
252 | t.showLabel = false; |
---|
253 | t.showMark = false; |
---|
254 | } |
---|
255 | else if (!this.showTickMarks) { |
---|
256 | t.showMark = false; |
---|
257 | } |
---|
258 | t.setTick(ut, this.name); |
---|
259 | this._ticks.push(t); |
---|
260 | } |
---|
261 | } |
---|
262 | this.numberTicks = userTicks.length; |
---|
263 | this.min = this._ticks[0].value; |
---|
264 | this.max = this._ticks[this.numberTicks-1].value; |
---|
265 | this.tickInterval = (this.max - this.min) / (this.numberTicks - 1); |
---|
266 | } |
---|
267 | |
---|
268 | // we don't have any ticks yet, let's make some! |
---|
269 | else { |
---|
270 | if (name == 'xaxis' || name == 'x2axis') { |
---|
271 | dim = this._plotDimensions.width; |
---|
272 | } |
---|
273 | else { |
---|
274 | dim = this._plotDimensions.height; |
---|
275 | } |
---|
276 | |
---|
277 | // if min, max and number of ticks specified, user can't specify interval. |
---|
278 | if (this.min != null && this.max != null && this.numberTicks != null) { |
---|
279 | this.tickInterval = null; |
---|
280 | } |
---|
281 | |
---|
282 | min = (this.min != null) ? this.min : db.min; |
---|
283 | max = (this.max != null) ? this.max : db.max; |
---|
284 | |
---|
285 | // if min and max are same, space them out a bit.+ |
---|
286 | if (min == max) { |
---|
287 | var adj = 0.05; |
---|
288 | if (min > 0) { |
---|
289 | adj = Math.max(Math.log(min)/Math.LN10, 0.05); |
---|
290 | } |
---|
291 | min -= adj; |
---|
292 | max += adj; |
---|
293 | } |
---|
294 | |
---|
295 | var range = max - min; |
---|
296 | var rmin, rmax; |
---|
297 | var temp, prev, curr; |
---|
298 | var ynumticks = [3,5,6,11,21]; |
---|
299 | |
---|
300 | // yaxis divide ticks in nice intervals from 0 to 1. |
---|
301 | if (this.name == 'yaxis' || this.name == 'y2axis') { |
---|
302 | this.min = 0; |
---|
303 | this.max = 100; |
---|
304 | // user didn't specify number of ticks. |
---|
305 | if (!this.numberTicks){ |
---|
306 | if (this.tickInterval) { |
---|
307 | this.numberTicks = 3 + Math.ceil(range / this.tickInterval); |
---|
308 | } |
---|
309 | else { |
---|
310 | temp = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing); |
---|
311 | for (i=0; i<ynumticks.length; i++) { |
---|
312 | curr = temp/ynumticks[i]; |
---|
313 | if (curr == 1) { |
---|
314 | this.numberTicks = ynumticks[i]; |
---|
315 | break; |
---|
316 | } |
---|
317 | else if (curr > 1) { |
---|
318 | prev = curr; |
---|
319 | continue; |
---|
320 | } |
---|
321 | else if (curr < 1) { |
---|
322 | // was prev or is curr closer to one? |
---|
323 | if (Math.abs(prev - 1) < Math.abs(curr - 1)) { |
---|
324 | this.numberTicks = ynumticks[i-1]; |
---|
325 | break; |
---|
326 | } |
---|
327 | else { |
---|
328 | this.numberTicks = ynumticks[i]; |
---|
329 | break; |
---|
330 | } |
---|
331 | } |
---|
332 | else if (i == ynumticks.length -1) { |
---|
333 | this.numberTicks = ynumticks[i]; |
---|
334 | } |
---|
335 | } |
---|
336 | this.tickInterval = range / (this.numberTicks - 1); |
---|
337 | } |
---|
338 | } |
---|
339 | |
---|
340 | // user did specify number of ticks. |
---|
341 | else { |
---|
342 | this.tickInterval = range / (this.numberTicks - 1); |
---|
343 | } |
---|
344 | |
---|
345 | for (var i=0; i<this.numberTicks; i++){ |
---|
346 | tt = this.min + i * this.tickInterval; |
---|
347 | t = new this.tickRenderer(this.tickOptions); |
---|
348 | // var t = new $.jqplot.AxisTickRenderer(this.tickOptions); |
---|
349 | if (!this.showTicks) { |
---|
350 | t.showLabel = false; |
---|
351 | t.showMark = false; |
---|
352 | } |
---|
353 | else if (!this.showTickMarks) { |
---|
354 | t.showMark = false; |
---|
355 | } |
---|
356 | t.setTick(tt, this.name); |
---|
357 | this._ticks.push(t); |
---|
358 | } |
---|
359 | } |
---|
360 | |
---|
361 | // for x axes, have number ot ticks equal to number of series and ticks placed |
---|
362 | // at sum of y values for each series. |
---|
363 | else if (this.tickMode == 'bar') { |
---|
364 | this.min = 0; |
---|
365 | this.numberTicks = this._series.length + 1; |
---|
366 | t = new this.tickRenderer(this.tickOptions); |
---|
367 | if (!this.showTicks) { |
---|
368 | t.showLabel = false; |
---|
369 | t.showMark = false; |
---|
370 | } |
---|
371 | else if (!this.showTickMarks) { |
---|
372 | t.showMark = false; |
---|
373 | } |
---|
374 | t.setTick(0, this.name); |
---|
375 | this._ticks.push(t); |
---|
376 | |
---|
377 | temp = 0; |
---|
378 | |
---|
379 | for (i=1; i<this.numberTicks; i++){ |
---|
380 | temp += this._series[i-1]._sumy; |
---|
381 | t = new this.tickRenderer(this.tickOptions); |
---|
382 | if (!this.showTicks) { |
---|
383 | t.showLabel = false; |
---|
384 | t.showMark = false; |
---|
385 | } |
---|
386 | else if (!this.showTickMarks) { |
---|
387 | t.showMark = false; |
---|
388 | } |
---|
389 | t.setTick(temp, this.name); |
---|
390 | this._ticks.push(t); |
---|
391 | } |
---|
392 | this.max = this.max || temp; |
---|
393 | |
---|
394 | // if user specified a max and it is greater than sum, add a tick |
---|
395 | if (this.max > temp) { |
---|
396 | t = new this.tickRenderer(this.tickOptions); |
---|
397 | if (!this.showTicks) { |
---|
398 | t.showLabel = false; |
---|
399 | t.showMark = false; |
---|
400 | } |
---|
401 | else if (!this.showTickMarks) { |
---|
402 | t.showMark = false; |
---|
403 | } |
---|
404 | t.setTick(this.max, this.name); |
---|
405 | this._ticks.push(t); |
---|
406 | |
---|
407 | } |
---|
408 | } |
---|
409 | |
---|
410 | else if (this.tickMode == 'even') { |
---|
411 | this.min = 0; |
---|
412 | this.max = this.max || db.max; |
---|
413 | // get a desired number of ticks |
---|
414 | var nt = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing); |
---|
415 | range = this.max - this.min; |
---|
416 | this.numberTicks = nt; |
---|
417 | this.tickInterval = range / (this.numberTicks - 1); |
---|
418 | |
---|
419 | for (i=0; i<this.numberTicks; i++){ |
---|
420 | tt = this.min + i * this.tickInterval; |
---|
421 | t = new this.tickRenderer(this.tickOptions); |
---|
422 | // var t = new $.jqplot.AxisTickRenderer(this.tickOptions); |
---|
423 | if (!this.showTicks) { |
---|
424 | t.showLabel = false; |
---|
425 | t.showMark = false; |
---|
426 | } |
---|
427 | else if (!this.showTickMarks) { |
---|
428 | t.showMark = false; |
---|
429 | } |
---|
430 | t.setTick(tt, this.name); |
---|
431 | this._ticks.push(t); |
---|
432 | } |
---|
433 | |
---|
434 | } |
---|
435 | } |
---|
436 | }; |
---|
437 | |
---|
438 | // called with scope of axis |
---|
439 | $.jqplot.MekkoAxisRenderer.prototype.pack = function(pos, offsets) { |
---|
440 | var ticks = this._ticks; |
---|
441 | var max = this.max; |
---|
442 | var min = this.min; |
---|
443 | var offmax = offsets.max; |
---|
444 | var offmin = offsets.min; |
---|
445 | var lshow = (this._label == null) ? false : this._label.show; |
---|
446 | |
---|
447 | for (var p in pos) { |
---|
448 | this._elem.css(p, pos[p]); |
---|
449 | } |
---|
450 | |
---|
451 | this._offsets = offsets; |
---|
452 | // pixellength will be + for x axes and - for y axes becasue pixels always measured from top left. |
---|
453 | var pixellength = offmax - offmin; |
---|
454 | var unitlength = max - min; |
---|
455 | |
---|
456 | // point to unit and unit to point conversions references to Plot DOM element top left corner. |
---|
457 | this.p2u = function(p){ |
---|
458 | return (p - offmin) * unitlength / pixellength + min; |
---|
459 | }; |
---|
460 | |
---|
461 | this.u2p = function(u){ |
---|
462 | return (u - min) * pixellength / unitlength + offmin; |
---|
463 | }; |
---|
464 | |
---|
465 | if (this.name == 'xaxis' || this.name == 'x2axis'){ |
---|
466 | this.series_u2p = function(u){ |
---|
467 | return (u - min) * pixellength / unitlength; |
---|
468 | }; |
---|
469 | this.series_p2u = function(p){ |
---|
470 | return p * unitlength / pixellength + min; |
---|
471 | }; |
---|
472 | } |
---|
473 | |
---|
474 | else { |
---|
475 | this.series_u2p = function(u){ |
---|
476 | return (u - max) * pixellength / unitlength; |
---|
477 | }; |
---|
478 | this.series_p2u = function(p){ |
---|
479 | return p * unitlength / pixellength + max; |
---|
480 | }; |
---|
481 | } |
---|
482 | |
---|
483 | if (this.show) { |
---|
484 | if (this.name == 'xaxis' || this.name == 'x2axis') { |
---|
485 | for (var i=0; i<ticks.length; i++) { |
---|
486 | var t = ticks[i]; |
---|
487 | if (t.show && t.showLabel) { |
---|
488 | var shim; |
---|
489 | |
---|
490 | if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) { |
---|
491 | // will need to adjust auto positioning based on which axis this is. |
---|
492 | var temp = (this.name == 'xaxis') ? 1 : -1; |
---|
493 | switch (t.labelPosition) { |
---|
494 | case 'auto': |
---|
495 | // position at end |
---|
496 | if (temp * t.angle < 0) { |
---|
497 | shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; |
---|
498 | } |
---|
499 | // position at start |
---|
500 | else { |
---|
501 | shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; |
---|
502 | } |
---|
503 | break; |
---|
504 | case 'end': |
---|
505 | shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; |
---|
506 | break; |
---|
507 | case 'start': |
---|
508 | shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; |
---|
509 | break; |
---|
510 | case 'middle': |
---|
511 | shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; |
---|
512 | break; |
---|
513 | default: |
---|
514 | shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; |
---|
515 | break; |
---|
516 | } |
---|
517 | } |
---|
518 | else { |
---|
519 | shim = -t.getWidth()/2; |
---|
520 | } |
---|
521 | var val = this.u2p(t.value) + shim + 'px'; |
---|
522 | t._elem.css('left', val); |
---|
523 | t.pack(); |
---|
524 | } |
---|
525 | } |
---|
526 | var w; |
---|
527 | if (lshow) { |
---|
528 | w = this._label._elem.outerWidth(true); |
---|
529 | this._label._elem.css('left', offmin + pixellength/2 - w/2 + 'px'); |
---|
530 | if (this.name == 'xaxis') { |
---|
531 | this._label._elem.css('bottom', '0px'); |
---|
532 | } |
---|
533 | else { |
---|
534 | this._label._elem.css('top', '0px'); |
---|
535 | } |
---|
536 | this._label.pack(); |
---|
537 | } |
---|
538 | // now show the labels under the bars. |
---|
539 | var b, l, r; |
---|
540 | for (var i=0; i<this.barLabels.length; i++) { |
---|
541 | b = this._barLabels[i]; |
---|
542 | if (b.show) { |
---|
543 | w = b.getWidth(); |
---|
544 | l = this._ticks[i].getLeft() + this._ticks[i].getWidth(); |
---|
545 | r = this._ticks[i+1].getLeft(); |
---|
546 | b._elem.css('left', (r+l-w)/2+'px'); |
---|
547 | b._elem.css('top', this._ticks[i]._elem.css('top')); |
---|
548 | b.pack(); |
---|
549 | } |
---|
550 | } |
---|
551 | } |
---|
552 | else { |
---|
553 | for (var i=0; i<ticks.length; i++) { |
---|
554 | var t = ticks[i]; |
---|
555 | if (t.show && t.showLabel) { |
---|
556 | var shim; |
---|
557 | if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) { |
---|
558 | // will need to adjust auto positioning based on which axis this is. |
---|
559 | var temp = (this.name == 'yaxis') ? 1 : -1; |
---|
560 | switch (t.labelPosition) { |
---|
561 | case 'auto': |
---|
562 | // position at end |
---|
563 | case 'end': |
---|
564 | if (temp * t.angle < 0) { |
---|
565 | shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2; |
---|
566 | } |
---|
567 | else { |
---|
568 | shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2; |
---|
569 | } |
---|
570 | break; |
---|
571 | case 'start': |
---|
572 | if (t.angle > 0) { |
---|
573 | shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2; |
---|
574 | } |
---|
575 | else { |
---|
576 | shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2; |
---|
577 | } |
---|
578 | break; |
---|
579 | case 'middle': |
---|
580 | shim = -t.getHeight()/2; |
---|
581 | break; |
---|
582 | default: |
---|
583 | shim = -t.getHeight()/2; |
---|
584 | break; |
---|
585 | } |
---|
586 | } |
---|
587 | else { |
---|
588 | shim = -t.getHeight()/2; |
---|
589 | } |
---|
590 | |
---|
591 | var val = this.u2p(t.value) + shim + 'px'; |
---|
592 | t._elem.css('top', val); |
---|
593 | t.pack(); |
---|
594 | } |
---|
595 | } |
---|
596 | if (lshow) { |
---|
597 | var h = this._label._elem.outerHeight(true); |
---|
598 | this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px'); |
---|
599 | if (this.name == 'yaxis') { |
---|
600 | this._label._elem.css('left', '0px'); |
---|
601 | } |
---|
602 | else { |
---|
603 | this._label._elem.css('right', '0px'); |
---|
604 | } |
---|
605 | this._label.pack(); |
---|
606 | } |
---|
607 | } |
---|
608 | } |
---|
609 | }; |
---|
610 | })(jQuery); |
---|