rgraph-rails 4.62 → 4.64

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +3 -4
  3. data/lib/rgraph-rails/version.rb +1 -1
  4. data/vendor/assets/javascripts/RGraph.bar.js +240 -3742
  5. data/vendor/assets/javascripts/RGraph.bipolar.js +165 -2005
  6. data/vendor/assets/javascripts/RGraph.common.annotate.js +35 -395
  7. data/vendor/assets/javascripts/RGraph.common.context.js +30 -595
  8. data/vendor/assets/javascripts/RGraph.common.core.js +418 -5359
  9. data/vendor/assets/javascripts/RGraph.common.csv.js +20 -276
  10. data/vendor/assets/javascripts/RGraph.common.deprecated.js +35 -450
  11. data/vendor/assets/javascripts/RGraph.common.dynamic.js +88 -1395
  12. data/vendor/assets/javascripts/RGraph.common.effects.js +90 -1545
  13. data/vendor/assets/javascripts/RGraph.common.key.js +52 -753
  14. data/vendor/assets/javascripts/RGraph.common.resizing.js +37 -563
  15. data/vendor/assets/javascripts/RGraph.common.sheets.js +29 -352
  16. data/vendor/assets/javascripts/RGraph.common.tooltips.js +32 -450
  17. data/vendor/assets/javascripts/RGraph.common.zoom.js +14 -219
  18. data/vendor/assets/javascripts/RGraph.cornergauge.js +71 -0
  19. data/vendor/assets/javascripts/RGraph.drawing.background.js +34 -570
  20. data/vendor/assets/javascripts/RGraph.drawing.circle.js +33 -544
  21. data/vendor/assets/javascripts/RGraph.drawing.image.js +51 -755
  22. data/vendor/assets/javascripts/RGraph.drawing.marker1.js +37 -645
  23. data/vendor/assets/javascripts/RGraph.drawing.marker2.js +36 -633
  24. data/vendor/assets/javascripts/RGraph.drawing.marker3.js +35 -514
  25. data/vendor/assets/javascripts/RGraph.drawing.poly.js +37 -559
  26. data/vendor/assets/javascripts/RGraph.drawing.rect.js +33 -548
  27. data/vendor/assets/javascripts/RGraph.drawing.text.js +36 -664
  28. data/vendor/assets/javascripts/RGraph.drawing.xaxis.js +50 -812
  29. data/vendor/assets/javascripts/RGraph.drawing.yaxis.js +51 -856
  30. data/vendor/assets/javascripts/RGraph.fuel.js +58 -964
  31. data/vendor/assets/javascripts/RGraph.funnel.js +55 -984
  32. data/vendor/assets/javascripts/RGraph.gantt.js +77 -1354
  33. data/vendor/assets/javascripts/RGraph.gauge.js +85 -1421
  34. data/vendor/assets/javascripts/RGraph.hbar.js +162 -2788
  35. data/vendor/assets/javascripts/RGraph.hprogress.js +80 -1401
  36. data/vendor/assets/javascripts/RGraph.line.js +249 -4248
  37. data/vendor/assets/javascripts/RGraph.meter.js +74 -1280
  38. data/vendor/assets/javascripts/RGraph.modaldialog.js +19 -301
  39. data/vendor/assets/javascripts/RGraph.odo.js +71 -1264
  40. data/vendor/assets/javascripts/RGraph.pie.js +137 -2288
  41. data/vendor/assets/javascripts/RGraph.radar.js +110 -1847
  42. data/vendor/assets/javascripts/RGraph.rose.js +108 -1977
  43. data/vendor/assets/javascripts/RGraph.rscatter.js +80 -1432
  44. data/vendor/assets/javascripts/RGraph.scatter.js +172 -3163
  45. data/vendor/assets/javascripts/RGraph.semicircularprogress.js +60 -1120
  46. data/vendor/assets/javascripts/RGraph.svg.bar.js +66 -1735
  47. data/vendor/assets/javascripts/RGraph.svg.common.ajax.js +21 -246
  48. data/vendor/assets/javascripts/RGraph.svg.common.core.js +255 -3937
  49. data/vendor/assets/javascripts/RGraph.svg.common.csv.js +20 -276
  50. data/vendor/assets/javascripts/RGraph.svg.common.fx.js +68 -1303
  51. data/vendor/assets/javascripts/RGraph.svg.common.key.js +19 -205
  52. data/vendor/assets/javascripts/RGraph.svg.common.sheets.js +29 -352
  53. data/vendor/assets/javascripts/RGraph.svg.common.tooltips.js +22 -273
  54. data/vendor/assets/javascripts/RGraph.svg.funnel.js +32 -0
  55. data/vendor/assets/javascripts/RGraph.svg.hbar.js +59 -1400
  56. data/vendor/assets/javascripts/RGraph.svg.line.js +70 -1580
  57. data/vendor/assets/javascripts/RGraph.svg.pie.js +55 -1131
  58. data/vendor/assets/javascripts/RGraph.svg.radar.js +57 -1502
  59. data/vendor/assets/javascripts/RGraph.svg.rose.js +66 -1817
  60. data/vendor/assets/javascripts/RGraph.svg.scatter.js +58 -1261
  61. data/vendor/assets/javascripts/RGraph.svg.semicircularprogress.js +28 -865
  62. data/vendor/assets/javascripts/RGraph.svg.waterfall.js +45 -1252
  63. data/vendor/assets/javascripts/RGraph.thermometer.js +63 -1136
  64. data/vendor/assets/javascripts/RGraph.vprogress.js +83 -1470
  65. data/vendor/assets/javascripts/RGraph.waterfall.js +83 -1347
  66. metadata +5 -4
  67. data/vendor/assets/javascripts/financial-data.js +0 -1067
@@ -1,1137 +1,64 @@
1
- // version: 2017-05-08
2
- /**
3
- * o--------------------------------------------------------------------------------o
4
- * | This file is part of the RGraph package - you can learn more at: |
5
- * | |
6
- * | http://www.rgraph.net |
7
- * | |
8
- * | RGraph is licensed under the Open Source MIT license. That means that it's |
9
- * | totally free to use! |
10
- * o--------------------------------------------------------------------------------o
11
- */
12
1
 
13
- RGraph = window.RGraph || {isRGraph: true};
14
-
15
-
16
-
17
-
18
- /**
19
- * The chart constructor. This function sets up the object. It takes the ID (the HTML attribute) of the canvas as the
20
- * first argument and the data as the second. If you need to change this, you can.
21
- *
22
- * NB: If tooltips are ever implemented they must go below the use event listeners!!
23
- *
24
- * @param string id The canvas tag ID
25
- * @param number min The minimum value
26
- * @param number max The maximum value
27
- * @param number value The value reported by the thermometer
28
- */
29
- RGraph.Thermometer = function (conf)
30
- {
31
- /**
32
- * Allow for object config style
33
- */
34
- if ( typeof conf === 'object'
35
- && typeof conf.id === 'string') {
36
-
37
- var parseConfObjectForOptions = true; // Set this so the config is parsed (at the end of the constructor)
38
-
39
- } else {
40
-
41
- var conf = {
42
- id: arguments[0],
43
- min: arguments[1],
44
- max: arguments[2],
45
- value: arguments[3]
46
- }
47
- }
48
-
49
-
50
-
51
-
52
- this.id = conf.id;
53
- this.canvas = document.getElementById(this.id);
54
- this.context = this.canvas.getContext ? this.canvas.getContext('2d') : null;
55
- this.canvas.__object__ = this;
56
- this.uid = RGraph.CreateUID();
57
- this.canvas.uid = this.canvas.uid ? this.canvas.uid : RGraph.CreateUID();
58
- this.colorsParsed = false;
59
- this.type = 'thermometer';
60
- this.isRGraph = true;
61
- this.min = RGraph.stringsToNumbers(conf.min);
62
- this.max = RGraph.stringsToNumbers(conf.max);
63
- this.value = RGraph.stringsToNumbers(conf.value);
64
- this.coords = [];
65
- this.graphArea = [];
66
- this.currentValue = null;
67
- this.coordsText = [];
68
- this.original_colors = [];
69
- this.firstDraw = true; // After the first draw this will be false
70
-
71
-
72
-
73
-
74
- this.properties =
75
- {
76
- 'chart.linewidth': 1,
77
- 'chart.background.color': 'white',
78
- 'chart.strokestyle': 'black',
79
- 'chart.colors': ['Gradient(#c00:red:#f66:#fcc)'],
80
- 'chart.gutter.left': 25,
81
- 'chart.gutter.right': 25,
82
- 'chart.gutter.top': 25,
83
- 'chart.gutter.bottom': 25,
84
- 'chart.ticksize': 2,
85
- 'chart.text.color': 'black',
86
- 'chart.text.font': 'Segoe UI, Arial, Verdana, sans-serif',
87
- 'chart.text.size': 12,
88
- 'chart.text.accessible': true,
89
- 'chart.text.accessible.overflow': 'visible',
90
- 'chart.text.accessible.pointerevents': true,
91
- 'chart.numticks': 10,
92
- 'chart.units.pre': '',
93
- 'chart.units.post': '',
94
- 'chart.zoom.factor': 1.5,
95
- 'chart.zoom.fade.in': true,
96
- 'chart.zoom.fade.out': true,
97
- 'chart.zoom.hdir': 'right',
98
- 'chart.zoom.vdir': 'down',
99
- 'chart.zoom.frames': 25,
100
- 'chart.zoom.delay': 16.666,
101
- 'chart.zoom.shadow': true,
102
- 'chart.zoom.background': true,
103
- 'chart.title': '',
104
- 'chart.title.side': '',
105
- 'chart.title.side.bold': true,
106
- 'chart.title.side.font': null,
107
- 'chart.shadow': true,
108
- 'chart.shadow.offsetx': 0,
109
- 'chart.shadow.offsety': 0,
110
- 'chart.shadow.blur': 15,
111
- 'chart.shadow.color': '#ddd',
112
- 'chart.resizable': false,
113
- 'chart.contextmenu': null,
114
- 'chart.adjustable': false,
115
- 'chart.value.label': true,
116
- 'chart.value.label.decimals': null,
117
- 'chart.value.label.thousand': ',',
118
- 'chart.value.label.point': '.',
119
- 'chart.labels.count': 5,
120
- 'chart.scale.visible': false,
121
- 'chart.scale.decimals': 0,
122
- 'chart.annotatable': false,
123
- 'chart.annotate.color': 'black',
124
- 'chart.scale.decimals': 0,
125
- 'chart.scale.point': '.',
126
- 'chart.scale.thousand': ',',
127
- 'chart.tooltips': null,
128
- 'chart.tooltips.highlight': true,
129
- 'chart.tooltips.effect': 'fade',
130
- 'chart.tooltips.event': 'onclick',
131
- 'chart.highlight.stroke': 'rgba(0,0,0,0)',
132
- 'chart.highlight.fill': 'rgba(255,255,255,0.7)',
133
- 'chart.clearto': 'rgba(0,0,0,0)',
134
- 'chart.bulb.bottom.radius.adjust': 0,
135
- 'chart.bulb.bottom.radius': null
136
- }
137
-
138
-
139
-
140
- /**
141
- * A simple check that the browser has canvas support
142
- */
143
- if (!this.canvas) {
144
- alert('[THERMOMETER] No canvas support');
145
- return;
146
- }
147
-
148
- /**
149
- * The thermometer can only have one data point so only this.$0 needs to be created
150
- */
151
- this.$0 = {};
152
-
153
-
154
- /**
155
- * Translate half a pixel for antialiasing purposes - but only if it hasn't beeen
156
- * done already
157
- */
158
- if (!this.canvas.__rgraph_aa_translated__) {
159
- this.context.translate(0.5,0.5);
160
-
161
- this.canvas.__rgraph_aa_translated__ = true;
162
- }
163
-
164
-
165
-
166
-
167
- // Short variable names
168
- var RG = RGraph,
169
- ca = this.canvas,
170
- co = ca.getContext('2d'),
171
- prop = this.properties,
172
- pa2 = RG.path2,
173
- win = window,
174
- doc = document,
175
- ma = Math
176
-
177
-
178
-
179
- /**
180
- * "Decorate" the object with the generic effects if the effects library has been included
181
- */
182
- if (RG.Effects && typeof RG.Effects.decorate === 'function') {
183
- RG.Effects.decorate(this);
184
- }
185
-
186
-
187
-
188
-
189
- /**
190
- * A setter.
191
- *
192
- * @param name string The name of the property to set
193
- * @param value mixed The value of the property
194
- */
195
- this.set =
196
- this.Set = function (name)
197
- {
198
- var value = typeof arguments[1] === 'undefined' ? null : arguments[1];
199
-
200
- /**
201
- * the number of arguments is only one and it's an
202
- * object - parse it for configuration data and return.
203
- */
204
- if (arguments.length === 1 && typeof name === 'object') {
205
- RG.parseObjectStyleConfig(this, name);
206
- return this;
207
- }
208
-
209
-
210
-
211
-
212
- /**
213
- * This should be done first - prepend the property name with "chart." if necessary
214
- */
215
- if (name.substr(0,6) != 'chart.') {
216
- name = 'chart.' + name;
217
- }
218
-
219
-
220
-
221
-
222
- // Convert uppercase letters to dot+lower case letter
223
- while(name.match(/([A-Z])/)) {
224
- name = name.replace(/([A-Z])/, '.' + RegExp.$1.toLowerCase());
225
- }
226
-
227
-
228
-
229
-
230
-
231
-
232
- /**
233
- * Change of name
234
- */
235
- if (name == 'chart.ylabels.count') {
236
- name = 'chart.labels.count';
237
- }
238
- prop[name.toLowerCase()] = value;
239
-
240
- return this;
241
- };
242
-
243
-
244
-
245
-
246
- /**
247
- * A getter.
248
- *
249
- * @param name string The name of the property to get
250
- */
251
- this.get =
252
- this.Get = function (name)
253
- {
254
- /**
255
- * This should be done first - prepend the property name with "chart." if necessary
256
- */
257
- if (name.substr(0,6) != 'chart.') {
258
- name = 'chart.' + name;
259
- }
260
-
261
- // Convert uppercase letters to dot+lower case letter
262
- while(name.match(/([A-Z])/)) {
263
- name = name.replace(/([A-Z])/, '.' + RegExp.$1.toLowerCase());
264
- }
265
-
266
- return prop[name];
267
- };
268
-
269
-
270
-
271
-
272
- /**
273
- * Draws the thermometer
274
- */
275
- this.draw =
276
- this.Draw = function ()
277
- {
278
- // Fire the custom RGraph onbeforedraw event (which should be fired before the chart is drawn)
279
- RG.fireCustomEvent(this, 'onbeforedraw');
280
-
281
- // Max/min boundary constraints
282
- this.value = ma.min(this.max, this.value);
283
- this.value = ma.max(this.min, this.value);
284
-
285
- /**
286
- * Parse the colors. This allows for simple gradient syntax
287
- */
288
- if (!this.colorsParsed) {
289
- this.parseColors();
290
-
291
- // Don't want to do this again
292
- this.colorsParsed = true;
293
- }
294
-
295
- /**
296
- * Set the current value
297
- */
298
- this.currentValue = this.value;
299
-
300
-
301
-
302
- /**
303
- * Stop this growing uncontrollably
304
- */
305
- this.coordsText = [];
306
-
307
-
308
-
309
-
310
-
311
- // This is new in May 2011 and facilitates indiviual gutter settings,
312
- // eg chart.gutter.left
313
- this.gutterLeft = prop['chart.gutter.left'];
314
- this.gutterRight = prop['chart.gutter.right'];
315
- this.gutterTop = prop['chart.gutter.top'];
316
- this.gutterBottom = prop['chart.gutter.bottom'];
317
-
318
-
319
- // Get the scale
320
- this.scale2 = RG.getScale2(
321
- this, {
322
- max:this.max,
323
- min:this.min,
324
- strict:true,
325
- 'scale.thousand':prop['chart.scale.thousand'],
326
- 'scale.point':prop['chart.scale.point'],
327
- 'scale.decimals':prop['chart.scale.decimals'],
328
- 'ylabels.count':prop['chart.labels.count'],
329
- 'scale.round':prop['chart.scale.round'],
330
- 'units.pre': prop['chart.units.pre'],
331
- 'units.post': prop['chart.units.post']
332
- }
333
- );
334
-
335
-
336
-
337
-
338
-
339
-
340
-
341
-
342
-
343
-
344
-
345
-
346
- // Work out the coordinates and positions
347
-
348
- this.x = this.gutterLeft;
349
- this.width = ca.width - this.gutterLeft - this.gutterRight;
350
- this.y = this.gutterTop + (this.width / 2);
351
-
352
-
353
- this.halfWidth = this.width / 2;
354
-
355
- this.bulbTopCenterx = this.gutterLeft + (this.width / 2);
356
- this.bulbTopCentery = this.gutterTop + (this.width / 2);
357
- this.bulbTopRadius = this.width / 2;
358
- this.bulbBottomCenterx = this.gutterLeft + (this.width / 2);
359
- this.bulbBottomRadius = typeof prop['chart.bulb.bottom.radius'] === 'number' ? prop['chart.bulb.bottom.radius'] : this.width * 0.75 + prop['chart.bulb.bottom.radius.adjust'];
360
- this.bulbBottomCentery = ca.height - this.gutterBottom - this.bulbBottomRadius;
361
-
362
- this.scaleTopY = this.bulbTopCentery;
363
- this.scaleBottomY = this.bulbBottomCentery - this.bulbBottomRadius;
364
- this.scaleHeight = this.scaleBottomY - this.scaleTopY;
365
-
366
- this.height = this.getYCoord(this.min) - this.getYCoord(this.value);
367
-
368
- this.coords[0] = [
369
- this.x,
370
- this.getYCoord(this.value),
371
- this.width,
372
- this.height
373
- ];
374
-
375
-
376
-
377
-
378
-
379
-
380
-
381
-
382
-
383
-
384
-
385
-
386
-
387
-
388
- // Draw the background
389
- this.drawBackground();
390
-
391
- // Draw the bar that represents the value
392
- this.drawBar();
393
-
394
-
395
-
396
-
397
- // Draw the tickmarks
398
- this.drawTickMarks();
399
-
400
-
401
-
402
- /**
403
- * Draw the label
404
- */
405
- this.drawLabels();
406
-
407
-
408
-
409
- /**
410
- * Draw the title
411
- */
412
- if (prop['chart.title']) {
413
- this.drawTitle();
414
- }
415
-
416
- /**
417
- * Draw the side title
418
- */
419
- if (prop['chart.title.side']) {
420
- this.drawSideTitle();
421
- }
422
-
423
- /**
424
- * This function enables resizing
425
- */
426
- if (prop['chart.resizable']) {
427
- RG.allowResizing(this);
428
- }
429
-
430
-
431
-
432
-
433
- /**
434
- * Setup the context menu if required
435
- */
436
- if (prop['chart.contextmenu']) {
437
- RG.showContext(this);
438
- }
439
-
440
-
441
-
442
-
443
- /**
444
- * This installs the event listeners
445
- */
446
- RG.installEventListeners(this);
447
-
448
-
449
- /**
450
- * Fire the onfirstdraw event
451
- */
452
- if (this.firstDraw) {
453
- RG.fireCustomEvent(this, 'onfirstdraw');
454
- this.firstDraw = false;
455
- this.firstDrawFunc();
456
- }
457
-
458
-
459
-
460
- /**
461
- * Fire the custom RGraph ondraw event (which should be fired when you have drawn the chart)
462
- */
463
- RG.fireCustomEvent(this, 'ondraw');
464
-
465
- return this;
466
- };
467
-
468
-
469
-
470
-
471
-
472
- /**
473
- * Draws the thermometer itself
474
- */
475
- this.drawBackground =
476
- this.DrawBackground = function ()
477
- {
478
- if (prop['chart.shadow']) {
479
- RG.setShadow(
480
- this,
481
- prop['chart.shadow.color'],
482
- prop['chart.shadow.offsetx'],
483
- prop['chart.shadow.offsety'],
484
- prop['chart.shadow.blur']
485
- );
486
- }
487
-
488
- // Draw the outline and background
489
- this.pathBackground();
490
-
491
- co.strokeStyle = prop['chart.strokestyle'];
492
- co.fillStyle = prop['chart.background.color'];
493
- co.lineWidth = 1 + prop['chart.linewidth'];
494
-
495
- co.stroke();
496
- co.fill();
497
-
498
- co.lineWidth = 1;
499
- };
500
-
501
-
502
-
503
-
504
- /**
505
- * This draws the bar that indicates the value of the thermometer. It makes use
506
- * of the .pathBar() function.
507
- */
508
- this.drawBar =
509
- this.DrawBar = function ()
510
- {
511
- this.pathBar();
512
-
513
- pa2(co, 'f %', prop['chart.colors'][0]);
514
- };
515
-
516
-
517
-
518
-
519
- //
520
- // This function draws the path that indicates the specified value. It
521
- // doesn't stroke or fill the path.
522
- //
523
- this.pathBar = function ()
524
- {
525
- var barHeight = this.coords[0][3],
526
- y = (this.coords[0][1] + this.coords[0][3]) - barHeight
527
-
528
- RG.noShadow(this);
529
-
530
- // Draw the actual bar that indicates the value
531
- pa2(co,
532
- 'b r % % % % a % % % 0 6.28 false',
533
-
534
- this.coords[0][0],
535
- y,
536
- this.coords[0][2],
537
- this.bulbBottomCentery - y,
538
-
539
- this.bulbBottomCenterx,
540
- this.bulbBottomCentery,
541
- this.bulbBottomRadius
542
- );
543
- };
544
-
545
-
546
-
547
-
548
- //
549
- // This function draws the path that indicates that encompasses the
550
- // background. It's used by the overChartArea() function.
551
- //
552
- this.pathBackground = function ()
553
- {
554
- pa2(
555
- this.context,
556
- 'b r % % % % a % % % 0 6.28 false m % % a % % % 0 6.28 false',
557
-
558
- this.x,
559
- this.scaleTopY,
560
- this.coords[0][2],
561
- this.bulbBottomCentery - this.scaleTopY,
562
-
563
- this.bulbTopCenterx,
564
- this.bulbTopCentery,
565
- this.bulbTopRadius,
566
-
567
- this.bulbBottomCenterx,
568
- this.bulbBottomCentery,
569
-
570
- this.bulbBottomCenterx,
571
- this.bulbBottomCentery,
572
- this.bulbBottomRadius
573
- );
574
- };
575
-
576
-
577
-
578
-
579
- /**
580
- * Draws the tickmarks of the thermometer
581
- */
582
- this.drawTickMarks =
583
- this.DrawTickMarks = function ()
584
- {
585
- if (prop['chart.numticks']) {
586
-
587
- var ticksize = prop['chart.ticksize'];
588
-
589
- co.strokeStyle = prop['chart.strokestyle'];
590
- co.lineWidth = prop['chart.linewidth'] / 2;
591
-
592
- // Left hand side tickmarks
593
- co.beginPath();
594
- for (var i=0; i<=prop['chart.numticks']; ++i) {
595
-
596
- var y = this.scaleBottomY - ((this.scaleHeight / prop['chart.numticks']) * i);
597
-
598
- co.moveTo(this.gutterLeft, ma.round(y));
599
- co.lineTo(this.gutterLeft + ticksize, ma.round(y));
600
-
601
- // Right hand side tickmarks
602
- co.moveTo(ca.width - this.gutterRight, ma.round(y));
603
- co.lineTo(ca.width - this.gutterRight - ticksize, ma.round(y));
604
- }
605
- co.stroke();
606
-
607
- co.lineWidth = 1;
608
- }
609
- };
610
-
611
-
612
-
613
-
614
- /**
615
- * Draws the labels of the thermometer. Now (4th August 2011) draws
616
- * the scale too
617
- */
618
- this.drawLabels =
619
- this.DrawLabels = function ()
620
- {
621
- /**
622
- * This draws draws the label that sits at the top of the chart
623
- */
624
- if (prop['chart.value.label']) {
625
- co.fillStyle = prop['chart.text.color'];
626
-
627
- // Weird...
628
- var text = prop['chart.scale.visible'] ?
629
- RG.numberFormat(this,this.value.toFixed(typeof prop['chart.value.label.decimals'] == 'number' ? prop['chart.value.label.decimals'] : prop['chart.scale.decimals']))
630
- :
631
- RG.numberFormat(this,this.value.toFixed(typeof prop['chart.value.label.decimals'] == 'number' ? prop['chart.value.label.decimals'] : prop['chart.scale.decimals']),prop['chart.units.pre'],prop['chart.units.post']);
632
-
633
- RG.text2(this, {
634
- font: prop['chart.text.font'],
635
- size: prop['chart.text.size'],
636
- x: this.coords[0][0] + (this.coords[0][2] / 2),
637
- y: this.coords[0][1] + 7,
638
- text: text,
639
- valign:'top',
640
- halign:'center',
641
- bounding:true,
642
- boundingFill:'white',
643
- tag: 'value.label'
644
- });
645
- }
646
-
647
-
648
- /**
649
- * Draw the scale if requested
650
- */
651
- if (prop['chart.scale.visible']) {
652
- this.drawScale();
653
- }
654
- };
655
-
656
-
657
-
658
-
659
- /**
660
- * Draws the title
661
- */
662
- this.drawTitle =
663
- this.DrawTitle = function ()
664
- {
665
- co.fillStyle = prop['chart.text.color'];
666
-
667
- RG.text2(this, {
668
- font: prop['chart.text.font'],
669
- size: prop['chart.text.size'] + 2,
670
- x: this.gutterLeft + (this.width / 2),
671
- y: this.gutterTop - 3,
672
- text: String(prop['chart.title']),
673
- valign: 'bottom',
674
- halign: 'center',
675
- bold: true,
676
- tag: 'title'
677
- });
678
- };
679
-
680
-
681
-
682
-
683
- /**
684
- * Draws the title
685
- */
686
- this.drawSideTitle =
687
- this.DrawSideTitle = function ()
688
- {
689
- var font = prop['chart.title.side.font'] ? prop['chart.title.side.font'] : prop['chart.text.font'];
690
- var size = prop['chart.title.side.size'] ? prop['chart.title.side.size'] : prop['chart.text.size'] + 2;
691
-
692
- co.fillStyle = prop['chart.text.color'];
693
- RG.text2(this, {
694
- font: font,
695
- size: size + 2,
696
- x: this.gutterLeft - 3,
697
- y: (this.scaleHeight / 2) + this.gutterTop + this.bulbTopRadius,
698
- text: String(prop['chart.title.side']),
699
- valign: 'bottom',
700
- halign: 'center',
701
- angle: 270,
702
- bold: prop['chart.title.side.bold'],
703
- tag: 'title.side',
704
- accessible: false
705
- });
706
- };
707
-
708
-
709
-
710
-
711
- /**
712
- * Draw the scale if requested
713
- */
714
- this.drawScale =
715
- this.DrawScale = function ()
716
- {
717
- co.fillStyle = prop['chart.text.color'];
718
-
719
- var font = prop['chart.text.font'],
720
- size = prop['chart.text.size'],
721
- units_pre = prop['chart.units.pre'],
722
- units_post = prop['chart.units.post'],
723
- decimals = prop['chart.scale.decimals'],
724
- numLabels = prop['chart.labels.count'],
725
- step = (this.max - this.min) / numLabels;
726
-
727
- for (var i=1; i<=numLabels; ++i) {
728
-
729
- var x = ca.width - this.gutterRight + (prop['chart.linewidth'] / 2),
730
- y = ca.height - this.gutterBottom - (2 * this.bulbBottomRadius) - ((this.scaleHeight / numLabels) * i),
731
- text = RG.numberFormat(
732
- this,
733
- String((this.min + (i * step)).toFixed(decimals)),
734
- units_pre,
735
- units_post
736
- );
737
-
738
- RG.text2(this, {
739
- font: font,
740
- size: size,
741
- x: x + 6,
742
- y: y,
743
- text: text,
744
- valign: 'center',
745
- tag: 'scale'
746
- });
747
- }
748
-
749
- // Draw zero
750
- RG.text2(this, {
751
- font: font,
752
- size: size,
753
- x: x + 6,
754
- y: this.bulbBottomCentery - this.bulbBottomRadius,
755
- text: RG.numberFormat(
756
- this,
757
- this.min.toFixed(decimals),
758
- units_pre,
759
- units_post
760
- ),
761
- valign: 'center',
762
- tag: 'scale'
763
- });
764
- };
765
-
766
-
767
-
768
-
769
- /**
770
- * Returns the focused/clicked bar
771
- *
772
- * @param event e The event object
773
- */
774
- this.getShape =
775
- this.getBar = function (e)
776
- {
777
- var mouseXY = RG.getMouseXY(e),
778
- mouseX = mouseXY[0],
779
- mouseY = mouseXY[1];
780
-
781
- for (var i=0; i<this.coords.length; i++) {
782
-
783
- var coords = this.coords[i],
784
- left = coords[0],
785
- top = coords[1],
786
- width = coords[2],
787
- height = coords[3];
788
-
789
- this.pathBar();
790
-
791
- if (co.isPointInPath(mouseX, mouseY)) {
792
-
793
- var tooltip = RG.parseTooltipText ? RG.parseTooltipText(prop['chart.tooltips'], i) : '';
794
-
795
- return {
796
- 0: this, object: this,
797
- 1: left, x: left,
798
- 2: top, y: top,
799
- 3: width, width: width,
800
- 4: height, height: height,
801
- 5: i, index: i,
802
- tooltip: tooltip
803
- };
804
- }
805
- }
806
-
807
- return null;
808
- };
809
-
810
-
811
-
812
-
813
- /**
814
- * This function returns the value that the mouse is positioned t, regardless of
815
- * the actual indicated value.
816
- *
817
- * @param object e The event object (or it can also be an two element array containing the X/Y coords)
818
- */
819
- this.getValue = function (arg)
820
- {
821
- if (arg.length === 2) {
822
- var mouseX = arg[0],
823
- mouseY = arg[1];
824
- } else {
825
- var mouseXY = RG.getMouseXY(arg),
826
- mouseX = mouseXY[0],
827
- mouseY = mouseXY[1];
828
- }
829
-
830
- var value = (this.scaleHeight - (mouseY - this.scaleTopY)) / this.scaleHeight;
831
- value *= (this.max - this.min);
832
- value += this.min;
833
-
834
- value = ma.max(value, this.min);
835
- value = ma.min(value, this.max);
836
-
837
- return value;
838
- };
839
-
840
-
841
-
842
-
843
- /**
844
- * Each object type has its own Highlight() function which highlights the appropriate shape
845
- *
846
- * @param object shape The shape to highlight
847
- */
848
- this.highlight =
849
- this.Highlight = function (shape)
850
- {
851
- if (prop['chart.tooltips.highlight']) {
852
-
853
- if (typeof prop['chart.highlight.style'] === 'function') {
854
- (prop['chart.highlight.style'])(shape);
855
- return;
856
- }
857
-
858
- this.pathBar();
859
-
860
- pa2(co, 's % f %',
861
- prop['chart.highlight.stroke'],
862
- prop['chart.highlight.fill']
863
- );
864
- }
865
- };
866
-
867
-
868
-
869
-
870
- /**
871
- * The getObjectByXY() worker method. Don't call this - call:
872
- *
873
- * RGraph.ObjectRegistry.getObjectByXY(e)
874
- *
875
- * @param object e The event object
876
- */
877
- this.getObjectByXY = function (e)
878
- {
879
-
880
- var mouseXY = RG.getMouseXY(e),
881
- mouseX = mouseXY[0],
882
- mouseY = mouseXY[1]
883
-
884
- // Draw the background shape (don't stroke or fill it)
885
- this.pathBackground();
886
-
887
- if (co.isPointInPath(mouseX, mouseY)) {
888
- return this;
889
- }
890
- };
891
-
892
-
893
-
894
-
895
- /**
896
- * This method handles the adjusting calculation for when the mouse is moved
897
- *
898
- * @param object e The event object
899
- */
900
- this.adjusting_mousemove =
901
- this.Adjusting_mousemove = function (e)
902
- {
903
- /**
904
- * Handle adjusting for the Thermometer
905
- */
906
- if (prop['chart.adjustable'] && RG.Registry.get('chart.adjusting') && RG.Registry.Get('chart.adjusting').uid == this.uid) {
907
-
908
- var mouseXY = RG.getMouseXY(e),
909
- value = this.getValue(e);
910
-
911
- if (typeof(value) == 'number') {
912
-
913
- // Fire the onadjust event
914
- RG.fireCustomEvent(this, 'onadjust');
915
-
916
- this.value = Number(value.toFixed(prop['chart.scale.decimals']));
917
-
918
- RG.redrawCanvas(ca);
919
- }
920
- }
921
- };
922
-
923
-
924
-
925
-
926
- /**
927
- * Returns the appropriate Y coord for a value
928
- *
929
- * @param number value The value to return the coord for
930
- */
931
- this.getYCoord = function (value)
932
- {
933
- if (value > this.max || value < this.min) {
934
- return null;
935
- }
936
-
937
- var y = ma.abs(value - this.min) / ma.abs(this.max - this.min)
938
- y = y * (this.scaleBottomY - this.scaleTopY);
939
-
940
-
941
- return this.scaleBottomY - y;
942
- };
943
-
944
-
945
-
946
-
947
- /**
948
- * This returns true/false as to whether the cursor is over the chart area.
949
- * The cursor does not necessarily have to be over the bar itself.
950
- */
951
- this.overChartArea = function (e)
952
- {
953
- var mouseXY = RG.getMouseXY(e),
954
- mouseX = mouseXY[0],
955
- mouseY = mouseXY[1];
956
-
957
- this.pathBackground();
958
-
959
- return co.isPointInPath(mouseX, mouseY);
960
- };
961
-
962
-
963
-
964
-
965
- /**
966
- * This allows for easy specification of gradients
967
- */
968
- this.parseColors = function ()
969
- {
970
- // Save the original colors so that they can be restored when the canvas is reset
971
- if (this.original_colors.length === 0) {
972
- this.original_colors['chart.colors'] = RG.arrayClone(prop['chart.colors']);
973
- }
974
-
975
-
976
-
977
-
978
-
979
- var colors = prop['chart.colors'];
980
-
981
- for (var i=0; i<colors.length; ++i) {
982
- colors[i] = this.parseSingleColorForGradient(colors[i]);
983
- }
984
- };
985
-
986
-
987
-
988
-
989
- /**
990
- * Use this function to reset the object to the post-constructor state. Eg reset colors if
991
- * need be etc
992
- */
993
- this.reset = function ()
994
- {
995
- };
996
-
997
-
998
-
999
-
1000
- /**
1001
- * This parses a single color value
1002
- */
1003
- this.parseSingleColorForGradient = function (color)
1004
- {
1005
- if (!color) {
1006
- return color;
1007
- }
1008
-
1009
- if (typeof color === 'string' && color.match(/^gradient\((.*)\)$/i)) {
1010
-
1011
- var parts = RegExp.$1.split(':');
1012
-
1013
- // Create the gradient
1014
- var grad = co.createLinearGradient(
1015
- prop['chart.gutter.left'],
1016
- 0,
1017
- ca.width - prop['chart.gutter.right'],
1018
- 0
1019
- );
1020
-
1021
- var diff = 1 / (parts.length - 1);
1022
-
1023
- grad.addColorStop(0, RG.trim(parts[0]));
1024
-
1025
- for (var j=1; j<parts.length; ++j) {
1026
- grad.addColorStop(j * diff, RG.trim(parts[j]));
1027
- }
1028
- }
1029
-
1030
- return grad ? grad : color;
1031
- };
1032
-
1033
-
1034
-
1035
-
1036
- /**
1037
- * Using a function to add events makes it easier to facilitate method chaining
1038
- *
1039
- * @param string type The type of even to add
1040
- * @param function func
1041
- */
1042
- this.on = function (type, func)
1043
- {
1044
- if (type.substr(0,2) !== 'on') {
1045
- type = 'on' + type;
1046
- }
1047
-
1048
- if (typeof this[type] !== 'function') {
1049
- this[type] = func;
1050
- } else {
1051
- RG.addCustomEventListener(this, type, func);
1052
- }
1053
-
1054
- return this;
1055
- };
1056
-
1057
-
1058
-
1059
-
1060
- /**
1061
- * This function runs once only
1062
- * (put at the end of the file (before any effects))
1063
- */
1064
- this.firstDrawFunc = function ()
1065
- {
1066
- };
1067
-
1068
-
1069
-
1070
-
1071
- /**
1072
- * Gauge Grow
1073
- *
1074
- * This effect gradually increases the represented value
1075
- *
1076
- * @param object obj The chart object
1077
- * @param Not used - pass null
1078
- * @param function An optional callback function
1079
- */
1080
- this.grow = function ()
1081
- {
1082
- var obj = this,
1083
- callback = arguments[1] || function () {},
1084
- opt = arguments[0] || {},
1085
- frames = opt.frames ? opt.frames : 30,
1086
- origValue = Number(obj.currentValue),
1087
- newValue = obj.value;
1088
-
1089
- newValue = ma.min(newValue, this.max);
1090
- newValue = ma.max(newValue, this.min);
1091
-
1092
- var diff = newValue - origValue,
1093
- step = (diff / frames),
1094
- frame = 0;
1095
-
1096
-
1097
- function iterate ()
1098
- {
1099
- // Set the new value
1100
- obj.value = (step * frame) + origValue;
1101
-
1102
- RG.clear(obj.canvas);
1103
- RG.redrawCanvas(obj.canvas);
1104
-
1105
- if (frame < frames) {
1106
- frame++;
1107
- RG.Effects.updateCanvas(iterate);
1108
- } else {
1109
- callback(obj);
1110
- }
1111
- }
1112
-
1113
- iterate();
1114
-
1115
- return this;
1116
- };
1117
-
1118
-
1119
-
1120
-
1121
-
1122
- /**
1123
- * Now, because canvases can support multiple charts, canvases must always be registered
1124
- */
1125
- RG.register(this);
1126
-
1127
-
1128
-
1129
-
1130
- /**
1131
- * This is the 'end' of the constructor so if the first argument
1132
- * contains configuration data - handle that.
1133
- */
1134
- if (parseConfObjectForOptions) {
1135
- RG.parseObjectStyleConfig(this, conf.options);
1136
- }
1137
- };
2
+ RGraph=window.RGraph||{isRGraph:true};RGraph.Thermometer=function(conf)
3
+ {if(typeof conf==='object'&&typeof conf.id==='string'){var parseConfObjectForOptions=true;}else{var conf={id:arguments[0],min:arguments[1],max:arguments[2],value:arguments[3]}}
4
+ this.id=conf.id;this.canvas=document.getElementById(this.id);this.context=this.canvas.getContext?this.canvas.getContext('2d'):null;this.canvas.__object__=this;this.uid=RGraph.CreateUID();this.canvas.uid=this.canvas.uid?this.canvas.uid:RGraph.CreateUID();this.colorsParsed=false;this.type='thermometer';this.isRGraph=true;this.min=RGraph.stringsToNumbers(conf.min);this.max=RGraph.stringsToNumbers(conf.max);this.value=RGraph.stringsToNumbers(conf.value);this.coords=[];this.graphArea=[];this.currentValue=null;this.coordsText=[];this.original_colors=[];this.firstDraw=true;this.properties={'chart.linewidth':1,'chart.background.color':'white','chart.strokestyle':'black','chart.colors':['Gradient(#c00:red:#f66:#fcc)'],'chart.gutter.left':25,'chart.gutter.right':25,'chart.gutter.top':25,'chart.gutter.bottom':25,'chart.ticksize':2,'chart.text.color':'black','chart.text.font':'Segoe UI, Arial, Verdana, sans-serif','chart.text.size':12,'chart.text.accessible':true,'chart.text.accessible.overflow':'visible','chart.text.accessible.pointerevents':true,'chart.numticks':10,'chart.units.pre':'','chart.units.post':'','chart.zoom.factor':1.5,'chart.zoom.fade.in':true,'chart.zoom.fade.out':true,'chart.zoom.hdir':'right','chart.zoom.vdir':'down','chart.zoom.frames':25,'chart.zoom.delay':16.666,'chart.zoom.shadow':true,'chart.zoom.background':true,'chart.title':'','chart.title.side':'','chart.title.side.bold':true,'chart.title.side.font':null,'chart.shadow':true,'chart.shadow.offsetx':0,'chart.shadow.offsety':0,'chart.shadow.blur':15,'chart.shadow.color':'#ddd','chart.resizable':false,'chart.contextmenu':null,'chart.adjustable':false,'chart.value.label':true,'chart.value.label.decimals':null,'chart.value.label.thousand':',','chart.value.label.point':'.','chart.labels.count':5,'chart.scale.visible':false,'chart.scale.decimals':0,'chart.annotatable':false,'chart.annotate.color':'black','chart.scale.decimals':0,'chart.scale.point':'.','chart.scale.thousand':',','chart.tooltips':null,'chart.tooltips.highlight':true,'chart.tooltips.effect':'fade','chart.tooltips.event':'onclick','chart.highlight.stroke':'rgba(0,0,0,0)','chart.highlight.fill':'rgba(255,255,255,0.7)','chart.clearto':'rgba(0,0,0,0)','chart.bulb.bottom.radius.adjust':0,'chart.bulb.bottom.radius':null}
5
+ if(!this.canvas){alert('[THERMOMETER] No canvas support');return;}
6
+ this.$0={};if(!this.canvas.__rgraph_aa_translated__){this.context.translate(0.5,0.5);this.canvas.__rgraph_aa_translated__=true;}
7
+ var RG=RGraph,ca=this.canvas,co=ca.getContext('2d'),prop=this.properties,pa2=RG.path2,win=window,doc=document,ma=Math
8
+ if(RG.Effects&&typeof RG.Effects.decorate==='function'){RG.Effects.decorate(this);}
9
+ this.set=this.Set=function(name)
10
+ {var value=typeof arguments[1]==='undefined'?null:arguments[1];if(arguments.length===1&&typeof name==='object'){RG.parseObjectStyleConfig(this,name);return this;}
11
+ if(name.substr(0,6)!='chart.'){name='chart.'+name;}
12
+ while(name.match(/([A-Z])/)){name=name.replace(/([A-Z])/,'.'+RegExp.$1.toLowerCase());}
13
+ if(name=='chart.ylabels.count'){name='chart.labels.count';}
14
+ prop[name.toLowerCase()]=value;return this;};this.get=this.Get=function(name)
15
+ {if(name.substr(0,6)!='chart.'){name='chart.'+name;}
16
+ while(name.match(/([A-Z])/)){name=name.replace(/([A-Z])/,'.'+RegExp.$1.toLowerCase());}
17
+ return prop[name];};this.draw=this.Draw=function()
18
+ {RG.fireCustomEvent(this,'onbeforedraw');this.value=ma.min(this.max,this.value);this.value=ma.max(this.min,this.value);if(!this.colorsParsed){this.parseColors();this.colorsParsed=true;}
19
+ this.currentValue=this.value;this.coordsText=[];this.gutterLeft=prop['chart.gutter.left'];this.gutterRight=prop['chart.gutter.right'];this.gutterTop=prop['chart.gutter.top'];this.gutterBottom=prop['chart.gutter.bottom'];this.scale2=RG.getScale2(this,{max:this.max,min:this.min,strict:true,'scale.thousand':prop['chart.scale.thousand'],'scale.point':prop['chart.scale.point'],'scale.decimals':prop['chart.scale.decimals'],'ylabels.count':prop['chart.labels.count'],'scale.round':prop['chart.scale.round'],'units.pre':prop['chart.units.pre'],'units.post':prop['chart.units.post']});this.x=this.gutterLeft;this.width=ca.width-this.gutterLeft-this.gutterRight;this.y=this.gutterTop+(this.width/2);this.halfWidth=this.width/2;this.bulbTopCenterx=this.gutterLeft+(this.width/2);this.bulbTopCentery=this.gutterTop+(this.width/2);this.bulbTopRadius=this.width/2;this.bulbBottomCenterx=this.gutterLeft+(this.width/2);this.bulbBottomRadius=typeof prop['chart.bulb.bottom.radius']==='number'?prop['chart.bulb.bottom.radius']:this.width*0.75+prop['chart.bulb.bottom.radius.adjust'];this.bulbBottomCentery=ca.height-this.gutterBottom-this.bulbBottomRadius;this.scaleTopY=this.bulbTopCentery;this.scaleBottomY=this.bulbBottomCentery-this.bulbBottomRadius;this.scaleHeight=this.scaleBottomY-this.scaleTopY;this.height=this.getYCoord(this.min)-this.getYCoord(this.value);this.coords[0]=[this.x,this.getYCoord(this.value),this.width,this.height];this.drawBackground();this.drawBar();this.drawTickMarks();this.drawLabels();if(prop['chart.title']){this.drawTitle();}
20
+ if(prop['chart.title.side']){this.drawSideTitle();}
21
+ if(prop['chart.resizable']){RG.allowResizing(this);}
22
+ if(prop['chart.contextmenu']){RG.showContext(this);}
23
+ RG.installEventListeners(this);if(this.firstDraw){this.firstDraw=false;RG.fireCustomEvent(this,'onfirstdraw');this.firstDrawFunc();}
24
+ RG.fireCustomEvent(this,'ondraw');return this;};this.drawBackground=this.DrawBackground=function()
25
+ {if(prop['chart.shadow']){RG.setShadow(this,prop['chart.shadow.color'],prop['chart.shadow.offsetx'],prop['chart.shadow.offsety'],prop['chart.shadow.blur']);}
26
+ this.pathBackground();co.strokeStyle=prop['chart.strokestyle'];co.fillStyle=prop['chart.background.color'];co.lineWidth=1+prop['chart.linewidth'];co.stroke();co.fill();co.lineWidth=1;};this.drawBar=this.DrawBar=function()
27
+ {this.pathBar();pa2(co,'f %',prop['chart.colors'][0]);};this.pathBar=function()
28
+ {var barHeight=this.coords[0][3],y=(this.coords[0][1]+this.coords[0][3])-barHeight
29
+ RG.noShadow(this);pa2(co,'b r % % % % a % % % 0 6.28 false',this.coords[0][0],y,this.coords[0][2],this.bulbBottomCentery-y,this.bulbBottomCenterx,this.bulbBottomCentery,this.bulbBottomRadius);};this.pathBackground=function()
30
+ {pa2(this.context,'b r % % % % a % % % 0 6.28 false m % % a % % % 0 6.28 false',this.x,this.scaleTopY,this.coords[0][2],this.bulbBottomCentery-this.scaleTopY,this.bulbTopCenterx,this.bulbTopCentery,this.bulbTopRadius,this.bulbBottomCenterx,this.bulbBottomCentery,this.bulbBottomCenterx,this.bulbBottomCentery,this.bulbBottomRadius);};this.drawTickMarks=this.DrawTickMarks=function()
31
+ {if(prop['chart.numticks']){var ticksize=prop['chart.ticksize'];co.strokeStyle=prop['chart.strokestyle'];co.lineWidth=prop['chart.linewidth']/2;co.beginPath();for(var i=0;i<=prop['chart.numticks'];++i){var y=this.scaleBottomY-((this.scaleHeight/prop['chart.numticks'])*i);co.moveTo(this.gutterLeft,ma.round(y));co.lineTo(this.gutterLeft+ticksize,ma.round(y));co.moveTo(ca.width-this.gutterRight,ma.round(y));co.lineTo(ca.width-this.gutterRight-ticksize,ma.round(y));}
32
+ co.stroke();co.lineWidth=1;}};this.drawLabels=this.DrawLabels=function()
33
+ {if(prop['chart.value.label']){co.fillStyle=prop['chart.text.color'];var text=prop['chart.scale.visible']?RG.numberFormat(this,this.value.toFixed(typeof prop['chart.value.label.decimals']=='number'?prop['chart.value.label.decimals']:prop['chart.scale.decimals'])):RG.numberFormat(this,this.value.toFixed(typeof prop['chart.value.label.decimals']=='number'?prop['chart.value.label.decimals']:prop['chart.scale.decimals']),prop['chart.units.pre'],prop['chart.units.post']);RG.text2(this,{font:prop['chart.text.font'],size:prop['chart.text.size'],x:this.coords[0][0]+(this.coords[0][2]/2),y:this.coords[0][1]+7,text:text,valign:'top',halign:'center',bounding:true,boundingFill:'white',tag:'value.label'});}
34
+ if(prop['chart.scale.visible']){this.drawScale();}};this.drawTitle=this.DrawTitle=function()
35
+ {co.fillStyle=prop['chart.text.color'];RG.text2(this,{font:prop['chart.text.font'],size:prop['chart.text.size']+2,x:this.gutterLeft+(this.width/2),y:this.gutterTop-3,text:String(prop['chart.title']),valign:'bottom',halign:'center',bold:true,tag:'title'});};this.drawSideTitle=this.DrawSideTitle=function()
36
+ {var font=prop['chart.title.side.font']?prop['chart.title.side.font']:prop['chart.text.font'];var size=prop['chart.title.side.size']?prop['chart.title.side.size']:prop['chart.text.size']+2;co.fillStyle=prop['chart.text.color'];RG.text2(this,{font:font,size:size+2,x:this.gutterLeft-3,y:(this.scaleHeight/2)+this.gutterTop+this.bulbTopRadius,text:String(prop['chart.title.side']),valign:'bottom',halign:'center',angle:270,bold:prop['chart.title.side.bold'],tag:'title.side',accessible:false});};this.drawScale=this.DrawScale=function()
37
+ {co.fillStyle=prop['chart.text.color'];var font=prop['chart.text.font'],size=prop['chart.text.size'],units_pre=prop['chart.units.pre'],units_post=prop['chart.units.post'],decimals=prop['chart.scale.decimals'],numLabels=prop['chart.labels.count'],step=(this.max-this.min)/numLabels;for(var i=1;i<=numLabels;++i){var x=ca.width-this.gutterRight+(prop['chart.linewidth']/2),y=ca.height-this.gutterBottom-(2*this.bulbBottomRadius)-((this.scaleHeight/numLabels)*i),text=RG.numberFormat(this,String((this.min+(i*step)).toFixed(decimals)),units_pre,units_post);RG.text2(this,{font:font,size:size,x:x+6,y:y,text:text,valign:'center',tag:'scale'});}
38
+ RG.text2(this,{font:font,size:size,x:x+6,y:this.bulbBottomCentery-this.bulbBottomRadius,text:RG.numberFormat(this,this.min.toFixed(decimals),units_pre,units_post),valign:'center',tag:'scale'});};this.getShape=this.getBar=function(e)
39
+ {var mouseXY=RG.getMouseXY(e),mouseX=mouseXY[0],mouseY=mouseXY[1];for(var i=0;i<this.coords.length;i++){var coords=this.coords[i],left=coords[0],top=coords[1],width=coords[2],height=coords[3];this.pathBar();if(co.isPointInPath(mouseX,mouseY)){var tooltip=RG.parseTooltipText?RG.parseTooltipText(prop['chart.tooltips'],i):'';return{0:this,object:this,1:left,x:left,2:top,y:top,3:width,width:width,4:height,height:height,5:i,index:i,tooltip:tooltip};}}
40
+ return null;};this.getValue=function(arg)
41
+ {if(arg.length===2){var mouseX=arg[0],mouseY=arg[1];}else{var mouseXY=RG.getMouseXY(arg),mouseX=mouseXY[0],mouseY=mouseXY[1];}
42
+ var value=(this.scaleHeight-(mouseY-this.scaleTopY))/this.scaleHeight;value*=(this.max-this.min);value+=this.min;value=ma.max(value,this.min);value=ma.min(value,this.max);return value;};this.highlight=this.Highlight=function(shape)
43
+ {if(prop['chart.tooltips.highlight']){if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);return;}
44
+ this.pathBar();pa2(co,'s % f %',prop['chart.highlight.stroke'],prop['chart.highlight.fill']);}};this.getObjectByXY=function(e)
45
+ {var mouseXY=RG.getMouseXY(e),mouseX=mouseXY[0],mouseY=mouseXY[1]
46
+ this.pathBackground();if(co.isPointInPath(mouseX,mouseY)){return this;}};this.adjusting_mousemove=this.Adjusting_mousemove=function(e)
47
+ {if(prop['chart.adjustable']&&RG.Registry.get('chart.adjusting')&&RG.Registry.Get('chart.adjusting').uid==this.uid){var mouseXY=RG.getMouseXY(e),value=this.getValue(e);if(typeof(value)=='number'){RG.fireCustomEvent(this,'onadjust');this.value=Number(value.toFixed(prop['chart.scale.decimals']));RG.redrawCanvas(ca);}}};this.getYCoord=function(value)
48
+ {if(value>this.max||value<this.min){return null;}
49
+ var y=ma.abs(value-this.min)/ma.abs(this.max-this.min)
50
+ y=y*(this.scaleBottomY-this.scaleTopY);return this.scaleBottomY-y;};this.overChartArea=function(e)
51
+ {var mouseXY=RG.getMouseXY(e),mouseX=mouseXY[0],mouseY=mouseXY[1];this.pathBackground();return co.isPointInPath(mouseX,mouseY);};this.parseColors=function()
52
+ {if(this.original_colors.length===0){this.original_colors['chart.colors']=RG.arrayClone(prop['chart.colors']);}
53
+ var colors=prop['chart.colors'];for(var i=0;i<colors.length;++i){colors[i]=this.parseSingleColorForGradient(colors[i]);}};this.reset=function()
54
+ {};this.parseSingleColorForGradient=function(color)
55
+ {if(!color){return color;}
56
+ if(typeof color==='string'&&color.match(/^gradient\((.*)\)$/i)){var parts=RegExp.$1.split(':');var grad=co.createLinearGradient(prop['chart.gutter.left'],0,ca.width-prop['chart.gutter.right'],0);var diff=1/(parts.length-1);grad.addColorStop(0,RG.trim(parts[0]));for(var j=1;j<parts.length;++j){grad.addColorStop(j*diff,RG.trim(parts[j]));}}
57
+ return grad?grad:color;};this.on=function(type,func)
58
+ {if(type.substr(0,2)!=='on'){type='on'+type;}
59
+ if(typeof this[type]!=='function'){this[type]=func;}else{RG.addCustomEventListener(this,type,func);}
60
+ return this;};this.firstDrawFunc=function()
61
+ {};this.grow=function()
62
+ {var obj=this,callback=arguments[1]||function(){},opt=arguments[0]||{},frames=opt.frames?opt.frames:30,origValue=Number(obj.currentValue),newValue=obj.value;newValue=ma.min(newValue,this.max);newValue=ma.max(newValue,this.min);var diff=newValue-origValue,step=(diff/frames),frame=0;function iterate()
63
+ {obj.value=(step*frame)+origValue;RG.clear(obj.canvas);RG.redrawCanvas(obj.canvas);if(frame<frames){frame++;RG.Effects.updateCanvas(iterate);}else{callback(obj);}}
64
+ iterate();return this;};RG.register(this);if(parseConfObjectForOptions){RG.parseObjectStyleConfig(this,conf.options);}};