rgraph-rails 1.0.5 → 1.0.6

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 +8 -8
  2. data/.travis.yml +0 -1
  3. data/README.md +3 -3
  4. data/lib/rgraph-rails/version.rb +1 -1
  5. data/vendor/assets/javascripts/RGraph.bar.js +239 -3764
  6. data/vendor/assets/javascripts/RGraph.bipolar.js +115 -1986
  7. data/vendor/assets/javascripts/RGraph.common.annotate.js +35 -399
  8. data/vendor/assets/javascripts/RGraph.common.context.js +30 -600
  9. data/vendor/assets/javascripts/RGraph.common.core.js +403 -5187
  10. data/vendor/assets/javascripts/RGraph.common.csv.js +19 -275
  11. data/vendor/assets/javascripts/RGraph.common.deprecated.js +35 -454
  12. data/vendor/assets/javascripts/RGraph.common.dynamic.js +84 -1189
  13. data/vendor/assets/javascripts/RGraph.common.effects.js +90 -1548
  14. data/vendor/assets/javascripts/RGraph.common.key.js +54 -755
  15. data/vendor/assets/javascripts/RGraph.common.resizing.js +37 -567
  16. data/vendor/assets/javascripts/RGraph.common.sheets.js +29 -356
  17. data/vendor/assets/javascripts/RGraph.common.tooltips.js +32 -614
  18. data/vendor/assets/javascripts/RGraph.common.zoom.js +14 -223
  19. data/vendor/assets/javascripts/RGraph.cornergauge.js +71 -0
  20. data/vendor/assets/javascripts/RGraph.drawing.background.js +35 -620
  21. data/vendor/assets/javascripts/RGraph.drawing.circle.js +35 -576
  22. data/vendor/assets/javascripts/RGraph.drawing.image.js +52 -807
  23. data/vendor/assets/javascripts/RGraph.drawing.marker1.js +41 -717
  24. data/vendor/assets/javascripts/RGraph.drawing.marker2.js +37 -668
  25. data/vendor/assets/javascripts/RGraph.drawing.marker3.js +36 -563
  26. data/vendor/assets/javascripts/RGraph.drawing.poly.js +40 -608
  27. data/vendor/assets/javascripts/RGraph.drawing.rect.js +35 -597
  28. data/vendor/assets/javascripts/RGraph.drawing.text.js +34 -642
  29. data/vendor/assets/javascripts/RGraph.drawing.xaxis.js +50 -809
  30. data/vendor/assets/javascripts/RGraph.drawing.yaxis.js +51 -856
  31. data/vendor/assets/javascripts/RGraph.fuel.js +58 -964
  32. data/vendor/assets/javascripts/RGraph.funnel.js +55 -984
  33. data/vendor/assets/javascripts/RGraph.gantt.js +75 -1241
  34. data/vendor/assets/javascripts/RGraph.gauge.js +87 -1397
  35. data/vendor/assets/javascripts/RGraph.hbar.js +143 -2376
  36. data/vendor/assets/javascripts/RGraph.hprogress.js +80 -1397
  37. data/vendor/assets/javascripts/RGraph.line.js +241 -4162
  38. data/vendor/assets/javascripts/RGraph.meter.js +74 -1278
  39. metadata +3 -30
  40. data/vendor/assets/images/bg.png +0 -0
  41. data/vendor/assets/images/bullet.png +0 -0
  42. data/vendor/assets/images/facebook-large.png +0 -0
  43. data/vendor/assets/images/google-plus-large.png +0 -0
  44. data/vendor/assets/images/logo.png +0 -0
  45. data/vendor/assets/images/meter-image-sd-needle.png +0 -0
  46. data/vendor/assets/images/meter-image-sd.png +0 -0
  47. data/vendor/assets/images/meter-sketch-needle.png +0 -0
  48. data/vendor/assets/images/meter-sketch.png +0 -0
  49. data/vendor/assets/images/odometer-background.png +0 -0
  50. data/vendor/assets/images/rgraph.jpg +0 -0
  51. data/vendor/assets/images/title.png +0 -0
  52. data/vendor/assets/images/twitter-large.png +0 -0
  53. data/vendor/assets/javascripts/RGraph.modaldialog.js +0 -301
  54. data/vendor/assets/javascripts/RGraph.odo.js +0 -1265
  55. data/vendor/assets/javascripts/RGraph.pie.js +0 -2272
  56. data/vendor/assets/javascripts/RGraph.radar.js +0 -1847
  57. data/vendor/assets/javascripts/RGraph.rose.js +0 -1877
  58. data/vendor/assets/javascripts/RGraph.rscatter.js +0 -1425
  59. data/vendor/assets/javascripts/RGraph.scatter.js +0 -2970
  60. data/vendor/assets/javascripts/RGraph.semicircularprogress.js +0 -1015
  61. data/vendor/assets/javascripts/RGraph.thermometer.js +0 -1129
  62. data/vendor/assets/javascripts/RGraph.vprogress.js +0 -1452
  63. data/vendor/assets/javascripts/RGraph.waterfall.js +0 -1252
  64. data/vendor/assets/javascripts/financial-data.js +0 -1067
  65. data/vendor/assets/stylesheets/ModalDialog.css +0 -90
  66. data/vendor/assets/stylesheets/animations.css +0 -3347
  67. data/vendor/assets/stylesheets/website.css +0 -446
@@ -1,1452 +0,0 @@
1
- // version: 2016-06-04
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 dual licensed under the Open Source GPL (General Public License) |
9
- * | v2.0 license and a commercial license which means that you're not bound by |
10
- * | the terms of the GPL. The commercial license is just 99 GBP and you can |
11
- * | read about it here: |
12
- * | http://www.rgraph.net/license |
13
- * o--------------------------------------------------------------------------------o
14
- */
15
-
16
- RGraph = window.RGraph || {isRGraph: true};
17
-
18
-
19
-
20
-
21
- /**
22
- * The progress bar constructor
23
- *
24
- * @param mixed conf This can either be an object that contains all of the configuration data
25
- * (the updated way of configuring the object) or it can be a string consisting of the
26
- * canvas ID
27
- * @param number The minimum value (if using the older configuration style)
28
- * @param number The maximum value (if using the older configuration style)
29
- * @param number The represented value (if using the older configuration style)
30
- */
31
- RGraph.VProgress = function (conf)
32
- {
33
- /**
34
- * Allow for object config style
35
- */
36
- if ( typeof conf === 'object'
37
- && typeof conf.id === 'string') {
38
-
39
- var parseConfObjectForOptions = true; // Set this so the config is parsed (at the end of the constructor)
40
-
41
- } else {
42
-
43
- var conf = {
44
- id: arguments[0],
45
- min: arguments[1],
46
- max: arguments[2],
47
- value: arguments[3]
48
- }
49
- }
50
-
51
-
52
-
53
-
54
- this.id = conf.id;
55
- this.canvas = document.getElementById(this.id);
56
- this.context = this.canvas.getContext('2d');
57
- this.canvas.__object__ = this;
58
-
59
- this.min = RGraph.stringsToNumbers(conf.min);
60
- this.max = RGraph.stringsToNumbers(conf.max);
61
- this.value = RGraph.stringsToNumbers(conf.value);
62
- this.type = 'vprogress';
63
- this.coords = [];
64
- this.isRGraph = true;
65
- this.currentValue = null;
66
- this.uid = RGraph.CreateUID();
67
- this.canvas.uid = this.canvas.uid ? this.canvas.uid : RGraph.CreateUID();
68
- this.colorsParsed = false;
69
- this.coordsText = [];
70
- this.original_colors = [];
71
- this.firstDraw = true; // After the first draw this will be false
72
-
73
-
74
- /**
75
- * Compatibility with older browsers
76
- */
77
- //RGraph.OldBrowserCompat(this.context);
78
-
79
- this.properties =
80
- {
81
- 'chart.colors': ['Gradient(white:#0c0)','Gradient(white:red)','Gradient(white:green)','yellow','pink','cyan','black','white','gray'],
82
- 'chart.strokestyle.inner': '#999',
83
- 'chart.strokestyle.outer': '#999',
84
- 'chart.tickmarks': true,
85
- 'chart.tickmarks.zerostart':true,
86
- 'chart.tickmarks.color': '#999',
87
- 'chart.tickmarks.inner': false,
88
- 'chart.gutter.left': 25,
89
- 'chart.gutter.right': 25,
90
- 'chart.gutter.top': 25,
91
- 'chart.gutter.bottom': 25,
92
- 'chart.numticks': 10,
93
- 'chart.numticks.inner': 50,
94
- 'chart.background.color': 'Gradient(#ccc:#eee:#efefef)',
95
- 'chart.shadow': false,
96
- 'chart.shadow.color': 'rgba(0,0,0,0.5)',
97
- 'chart.shadow.blur': 3,
98
- 'chart.shadow.offsetx': 3,
99
- 'chart.shadow.offsety': 3,
100
- 'chart.title': '',
101
- 'chart.title.bold': true,
102
- 'chart.title.font': null,
103
- 'chart.title.size': null,
104
- 'chart.title.color': 'black',
105
- 'chart.title.side': null,
106
- 'chart.title.side.font': 'Segoe UI, Arial, Verdana, sans-serif',
107
- 'chart.title.side.size': 12,
108
- 'chart.title.side.color': 'black',
109
- 'chart.title.side.bold': true,
110
- 'chart.text.size': 12,
111
- 'chart.text.color': 'black',
112
- 'chart.text.font': 'Segoe UI, Arial, Verdana, sans-serif',
113
- 'chart.text.accessible': true,
114
- 'chart.text.accessible.overflow': 'visible',
115
- 'chart.text.accessible.pointerevents': false,
116
- 'chart.contextmenu': null,
117
- 'chart.units.pre': '',
118
- 'chart.units.post': '',
119
- 'chart.tooltips': null,
120
- 'chart.tooltips.effect': 'fade',
121
- 'chart.tooltips.css.class': 'RGraph_tooltip',
122
- 'chart.tooltips.highlight': true,
123
- 'chart.tooltips.event': 'onclick',
124
- 'chart.highlight.stroke': 'rgba(0,0,0,0)',
125
- 'chart.highlight.fill': 'rgba(255,255,255,0.7)',
126
- 'chart.annotatable': false,
127
- 'chart.annotate.color': 'black',
128
- 'chart.zoom.factor': 1.5,
129
- 'chart.zoom.fade.in': true,
130
- 'chart.zoom.fade.out': true,
131
- 'chart.zoom.hdir': 'right',
132
- 'chart.zoom.vdir': 'down',
133
- 'chart.zoom.frames': 25,
134
- 'chart.zoom.delay': 16.666,
135
- 'chart.zoom.shadow': true,
136
- 'chart.zoom.background': true,
137
- 'chart.zoom.action': 'zoom',
138
- 'chart.arrows': false,
139
- 'chart.margin': 0,
140
- 'chart.resizable': false,
141
- 'chart.resize.handle.adjust': [0,0],
142
- 'chart.resize.handle.background': null,
143
- 'chart.label.inner': false,
144
- 'chart.labels.count': 10,
145
- 'chart.labels.position': 'right',
146
- 'chart.labels.offsetx': 0,
147
- 'chart.labels.offsety': 0,
148
- 'chart.adjustable': false,
149
- 'chart.scale.decimals': 0,
150
- 'chart.scale.thousand': ',',
151
- 'chart.scale.point': '.',
152
- 'chart.key': null,
153
- 'chart.key.background': 'white',
154
- 'chart.key.position': 'graph',
155
- 'chart.key.halign': 'right',
156
- 'chart.key.shadow': false,
157
- 'chart.key.shadow.color': '#666',
158
- 'chart.key.shadow.blur': 3,
159
- 'chart.key.shadow.offsetx': 2,
160
- 'chart.key.shadow.offsety': 2,
161
- 'chart.key.position.gutter.boxed': false,
162
- 'chart.key.position.x': null,
163
- 'chart.key.position.y': null,
164
- 'chart.key.color.shape': 'square',
165
- 'chart.key.rounded': true,
166
- 'chart.key.linewidth': 1,
167
- 'chart.key.colors': null,
168
- 'chart.key.interactive': false,
169
- 'chart.key.interactive.highlight.chart.stroke': '#000',
170
- 'chart.key.interactive.highlight.chart.fill': 'rgba(255,255,255,0.7)',
171
- 'chart.key.interactive.highlight.label': 'rgba(255,0,0,0.2)',
172
- 'chart.key.text.color': 'black',
173
- 'chart.events.click': null,
174
- 'chart.events.mousemove': null,
175
- 'chart.border.inner': true,
176
- 'chart.clearto': 'rgba(0,0,0,0)'
177
- }
178
-
179
- // Check for support
180
- if (!this.canvas) {
181
- alert('[PROGRESS] No canvas support');
182
- return;
183
- }
184
-
185
-
186
- /**
187
- * Create the dollar objects so that functions can be added to them
188
- */
189
- var linear_data = RGraph.arrayLinearize(this.value);
190
- for (var i=0; i<linear_data.length; ++i) {
191
- this['$' + i] = {};
192
- }
193
-
194
-
195
- /**
196
- * Translate half a pixel for antialiasing purposes - but only if it hasn't beeen
197
- * done already
198
- */
199
- if (!this.canvas.__rgraph_aa_translated__) {
200
- this.context.translate(0.5,0.5);
201
-
202
- this.canvas.__rgraph_aa_translated__ = true;
203
- }
204
-
205
-
206
-
207
-
208
- // Short variable names
209
- var RG = RGraph,
210
- ca = this.canvas,
211
- co = ca.getContext('2d'),
212
- prop = this.properties,
213
- pa2 = RG.path2,
214
- win = window,
215
- doc = document,
216
- ma = Math
217
-
218
-
219
-
220
- /**
221
- * "Decorate" the object with the generic effects if the effects library has been included
222
- */
223
- if (RG.Effects && typeof RG.Effects.decorate === 'function') {
224
- RG.Effects.decorate(this);
225
- }
226
-
227
-
228
-
229
-
230
- /**
231
- * A generic setter
232
- *
233
- * @param string name The name of the property to set or it can also be an object containing
234
- * object style configuration
235
- */
236
- this.set =
237
- this.Set = function (name)
238
- {
239
- var value = typeof arguments[1] === 'undefined' ? null : arguments[1];
240
-
241
- /**
242
- * the number of arguments is only one and it's an
243
- * object - parse it for configuration data and return.
244
- */
245
- if (arguments.length === 1 && typeof name === 'object') {
246
- RG.parseObjectStyleConfig(this, name);
247
- return this;
248
- }
249
-
250
-
251
-
252
- /**
253
- * This should be done first - prepend the propertyy name with "chart." if necessary
254
- */
255
- if (name.substr(0,6) != 'chart.') {
256
- name = 'chart.' + name;
257
- }
258
-
259
- /**
260
- * chart.strokestyle now sets both chart.strokestyle.inner and chart.strokestyle.outer
261
- */
262
- if (name == 'chart.strokestyle') {
263
- prop['chart.strokestyle.inner'] = value;
264
- prop['chart.strokestyle.outer'] = value;
265
-
266
- return;
267
- }
268
-
269
-
270
-
271
- // Convert uppercase letters to dot+lower case letter
272
- while(name.match(/([A-Z])/)) {
273
- name = name.replace(/([A-Z])/, '.' + RegExp.$1.toLowerCase());
274
- }
275
-
276
-
277
-
278
-
279
- prop[name.toLowerCase()] = value;
280
-
281
- return this;
282
- };
283
-
284
-
285
-
286
-
287
- /**
288
- * A generic getter
289
- *
290
- * @param string name The name of the property to get
291
- */
292
- this.get =
293
- this.Get = function (name)
294
- {
295
- /**
296
- * This should be done first - prepend the property name with "chart." if necessary
297
- */
298
- if (name.substr(0,6) != 'chart.') {
299
- name = 'chart.' + name;
300
- }
301
-
302
- // Convert uppercase letters to dot+lower case letter
303
- name = name.replace(/([A-Z])/g, function (str)
304
- {
305
- return '.' + String(RegExp.$1).toLowerCase()
306
- });
307
-
308
- return prop[name.toLowerCase()];
309
- };
310
-
311
-
312
-
313
-
314
- /**
315
- * Draws the progress bar
316
- */
317
- this.draw =
318
- this.Draw = function ()
319
- {
320
- /**
321
- * Fire the onbeforedraw event
322
- */
323
- RG.FireCustomEvent(this, 'onbeforedraw');
324
-
325
-
326
-
327
- /**
328
- * Parse the colors. This allows for simple gradient syntax
329
- */
330
- if (!this.colorsParsed) {
331
-
332
- this.parseColors();
333
-
334
-
335
- // Don't want to do this again
336
- this.colorsParsed = true;
337
- }
338
-
339
-
340
- /**
341
- * Set the current value
342
- */
343
- this.currentValue = this.value;
344
-
345
- /**
346
- * This is new in May 2011 and facilitates indiviual gutter settings,
347
- * eg chart.gutter.left
348
- */
349
- this.gutterLeft = prop['chart.gutter.left'];
350
- this.gutterRight = prop['chart.gutter.right'];
351
- this.gutterTop = prop['chart.gutter.top'];
352
- this.gutterBottom = prop['chart.gutter.bottom'];
353
-
354
- // Figure out the width and height
355
- this.width = ca.width - this.gutterLeft - this.gutterRight;
356
- this.height = ca.height - this.gutterTop - this.gutterBottom;
357
- this.coords = [];
358
-
359
-
360
-
361
- /**
362
- * Stop this growing uncontrollably
363
- */
364
- this.coordsText = [];
365
-
366
-
367
-
368
-
369
-
370
- this.Drawbar();
371
- this.DrawTickMarks();
372
- this.DrawLabels();
373
- this.DrawTitles();
374
-
375
- co.stroke();
376
- co.fill();
377
-
378
-
379
- /**
380
- * Draw the bevel effect if requested
381
- */
382
- if (prop['chart.bevel']) {
383
- this.DrawBevel();
384
- }
385
-
386
-
387
-
388
- /**
389
- * Setup the context menu if required
390
- */
391
- if (prop['chart.contextmenu']) {
392
- RG.ShowContext(this);
393
- }
394
-
395
-
396
- /**
397
- * This installs the event listeners
398
- */
399
- RG.InstallEventListeners(this);
400
-
401
- // Draw a key if necessary
402
- if (prop['chart.key'] && prop['chart.key'].length) {
403
- RG.DrawKey(this, prop['chart.key'], prop['chart.colors']);
404
- }
405
-
406
-
407
-
408
- /**
409
- * This function enables resizing
410
- */
411
- if (prop['chart.resizable']) {
412
- RG.AllowResizing(this);
413
- }
414
-
415
- /**
416
- * Instead of using RGraph.common.adjusting.js, handle them here
417
- */
418
- this.AllowAdjusting();
419
-
420
-
421
- /**
422
- * Fire the onfirstdraw event
423
- */
424
- if (this.firstDraw) {
425
- RG.fireCustomEvent(this, 'onfirstdraw');
426
- this.firstDraw = false;
427
- this.firstDrawFunc();
428
- }
429
-
430
-
431
-
432
-
433
- /**
434
- * Fire the RGraph ondraw event
435
- */
436
- RG.FireCustomEvent(this, 'ondraw');
437
-
438
- return this;
439
- };
440
-
441
-
442
-
443
-
444
- /**
445
- * Draw the bar itself
446
- */
447
- this.drawbar =
448
- this.Drawbar = function ()
449
- {
450
- /**
451
- * First get the scale
452
- */
453
- this.scale2 = RG.getScale2(this, {
454
- 'max': this.max,
455
- 'min': this.min,
456
- 'strict': true,
457
- 'scale.thousand': prop['chart.scale.thousand'],
458
- 'scale.point': prop['chart.scale.point'],
459
- 'scale.decimals': prop['chart.scale.decimals'],
460
- 'ylabels.count': prop['chart.labels.count'],
461
- 'scale.round': prop['chart.scale.round'],
462
- 'units.pre': prop['chart.units.pre'],
463
- 'units.post': prop['chart.units.post']
464
- });
465
-
466
-
467
- // Set a shadow if requested
468
- if (prop['chart.shadow']) {
469
- RG.setShadow(this, prop['chart.shadow.color'], prop['chart.shadow.offsetx'], prop['chart.shadow.offsety'], prop['chart.shadow.blur']);
470
- }
471
-
472
- // Draw the outline
473
- co.fillStyle = prop['chart.background.color'];
474
- co.strokeStyle = prop['chart.strokestyle.outer'];
475
-
476
- co.strokeRect(
477
- this.gutterLeft,
478
- this.gutterTop,
479
- this.width,
480
- this.height
481
- );
482
-
483
- co.fillRect(
484
- this.gutterLeft,
485
- this.gutterTop,
486
- this.width,
487
- this.height
488
- );
489
-
490
- // Turn off any shadow
491
- RG.noShadow(this);
492
-
493
- co.strokeStyle = prop['chart.strokestyle.outer'];
494
- co.fillStyle = prop['chart.colors'][0];
495
- var margin = prop['chart.margin'];
496
- var barHeight = (ca.height - this.gutterTop - this.gutterBottom) * ((RG.arraySum(this.value) - this.min) / (this.max - this.min));
497
-
498
- // Draw the actual bar itself
499
- if (typeof this.value === 'number') {
500
-
501
- co.lineWidth = 1;
502
- co.strokeStyle = prop['chart.strokestyle.inner'];
503
- if (prop['chart.border.inner']) {
504
- this.drawCurvedBar({
505
- x: this.gutterLeft + margin,
506
- y: this.gutterTop + (this.height - barHeight),
507
- width: this.width - margin - margin,
508
- height: barHeight,
509
- stroke: prop['chart.strokestyle.inner']
510
- });
511
- }
512
-
513
- this.drawCurvedBar({
514
- x: this.gutterLeft + margin,
515
- y: this.gutterTop + (this.height - barHeight),
516
- width: this.width - margin - margin,
517
- height: barHeight,
518
- fill: prop['chart.colors'][0]
519
- });
520
-
521
- } else if (typeof this.value == 'object') {
522
-
523
- co.beginPath();
524
- co.strokeStyle = prop['chart.strokestyle.inner'];
525
-
526
- var startPoint = ca.height - this.gutterBottom;
527
-
528
- for (var i=0,len=this.value.length; i<len; ++i) {
529
-
530
- var segmentHeight = ( (this.value[i] - this.min) / (this.max - this.min) ) * (ca.height - this.gutterBottom - this.gutterTop);
531
-
532
- co.fillStyle = prop['chart.colors'][i];
533
-
534
- co.beginPath();
535
- if (prop['chart.border.inner']) {
536
- this.drawCurvedBar({
537
- x: this.gutterLeft + margin,
538
- y: startPoint - segmentHeight,
539
- width: this.width - margin - margin,
540
- height: segmentHeight,
541
- stroke: co.strokeStyle
542
- });
543
- }
544
-
545
- this.drawCurvedBar({
546
- x: this.gutterLeft + margin,
547
- y: startPoint - segmentHeight,
548
- width: this.width - margin - margin,
549
- height: segmentHeight,
550
- fill: co.fillStyle
551
- });
552
-
553
-
554
-
555
- // Store the coords
556
- this.coords.push([
557
- this.gutterLeft + margin,
558
- startPoint - segmentHeight,
559
- this.width - margin - margin,
560
- segmentHeight
561
- ]);
562
-
563
- startPoint -= segmentHeight;
564
- }
565
-
566
- //co.stroke();
567
- co.fill();
568
- }
569
-
570
- /**
571
- * Inner tickmarks
572
- */
573
- if (prop['chart.tickmarks.inner']) {
574
-
575
- var spacing = (ca.height - this.gutterTop - this.gutterBottom) / prop['chart.numticks.inner'];
576
-
577
- co.lineWidth = 1;
578
- co.strokeStyle = prop['chart.strokestyle.outer'];
579
-
580
- co.beginPath();
581
-
582
- for (var y = this.gutterTop; y<ca.height - this.gutterBottom; y+=spacing) {
583
- co.moveTo(this.gutterLeft, Math.round(y));
584
- co.lineTo(this.gutterLeft + 3, Math.round(y));
585
-
586
- co.moveTo(ca.width - this.gutterRight, Math.round(y));
587
- co.lineTo(ca.width - this.gutterRight - 3, Math.round(y));
588
- }
589
-
590
- co.stroke();
591
- }
592
-
593
- co.beginPath();
594
- co.strokeStyle = prop['chart.strokestyle.inner'];
595
-
596
- if (typeof this.value == 'number') {
597
-
598
- if (prop['chart.border.inner']) {
599
- this.drawCurvedBar({
600
- x: this.gutterLeft + margin,
601
- y: this.gutterTop + this.height - barHeight,
602
- width: this.width - margin - margin,
603
- height: barHeight
604
- });
605
- }
606
-
607
- this.drawCurvedBar({
608
- x: this.gutterLeft + margin,
609
- y: this.gutterTop + this.height - barHeight,
610
- width: this.width - margin - margin,
611
- height: barHeight
612
- });
613
-
614
- // Store the coords
615
- this.coords.push([
616
- this.gutterLeft + margin,
617
- this.gutterTop + this.height - barHeight,
618
- this.width - margin - margin,
619
- barHeight
620
- ]);
621
- }
622
-
623
-
624
- /**
625
- * Draw the arrows indicating the level if requested
626
- */
627
- if (prop['chart.arrows']) {
628
- var x = this.gutterLeft - 4;
629
- var y = ca.height - this.gutterBottom - barHeight;
630
-
631
- co.lineWidth = 1;
632
- co.fillStyle = 'black';
633
- co.strokeStyle = 'black';
634
-
635
- co.beginPath();
636
- co.moveTo(x, y);
637
- co.lineTo(x - 4, y - 2);
638
- co.lineTo(x - 4, y + 2);
639
- co.closePath();
640
-
641
- co.stroke();
642
- co.fill();
643
-
644
- x += this.width + 8;
645
-
646
- co.beginPath();
647
- co.moveTo(x, y);
648
- co.lineTo(x + 4, y - 2);
649
- co.lineTo(x + 4, y + 2);
650
- co.closePath();
651
-
652
- co.stroke();
653
- co.fill();
654
- }
655
-
656
-
657
-
658
-
659
- /**
660
- * Draw the "in-bar" label
661
- */
662
- if (prop['chart.label.inner']) {
663
- co.fillStyle = 'black';
664
- RG.text2(this, {
665
- 'font':prop['chart.text.font'],
666
- 'size':prop['chart.text.size'],
667
- 'x':((ca.width - this.gutterLeft - this.gutterRight) / 2) + this.gutterLeft,'y':this.coords[this.coords.length - 1][1] - 5,'text':RGraph.number_format(this, (typeof(this.value) == 'number' ? this.value : RG.array_sum(this.value)).toFixed(prop['chart.scale.decimals'])),
668
- 'valign':'bottom',
669
- 'halign':'center',
670
- 'bounding':true,
671
- 'boundingFill':'white',
672
- 'tag': 'label.inner'
673
- });
674
- }
675
- };
676
-
677
-
678
-
679
-
680
- /**
681
- * The function that draws the tick marks.
682
- */
683
- this.drawTickMarks =
684
- this.DrawTickMarks = function ()
685
- {
686
- co.strokeStyle = prop['chart.tickmarks.color'];
687
-
688
- if (prop['chart.tickmarks']) {
689
- co.beginPath();
690
- for (var i=0; prop['chart.tickmarks.zerostart'] ? i<=prop['chart.numticks'] : i<prop['chart.numticks']; i++) {
691
-
692
- var startX = prop['chart.labels.position'] == 'left' ? this.gutterLeft : ca.width - prop['chart.gutter.right'];
693
- var endX = prop['chart.labels.position'] == 'left' ? startX - 4 : startX + 4;
694
- var yPos = (this.height * (i / prop['chart.numticks'])) + this.gutterTop
695
-
696
- co.moveTo(startX, Math.round(yPos));
697
- co.lineTo(endX, Math.round(yPos));
698
- }
699
- co.stroke();
700
- }
701
- };
702
-
703
-
704
-
705
-
706
- /**
707
- * The function that draws the labels
708
- */
709
- this.drawLabels =
710
- this.DrawLabels = function ()
711
- {
712
- if (!RG.is_null(prop['chart.labels.specific'])) {
713
- return this.DrawSpecificLabels();
714
- }
715
-
716
- co.fillStyle = prop['chart.text.color'];
717
-
718
- var position = prop['chart.labels.position'].toLowerCase();
719
- var xAlignment = position == 'left' ? 'right' : 'left';
720
- var yAlignment = 'center';
721
- var count = prop['chart.labels.count'];
722
- var units_pre = prop['chart.units.pre'];
723
- var units_post = prop['chart.units.post'];
724
- var text_size = prop['chart.text.size'];
725
- var text_font = prop['chart.text.font'];
726
- var decimals = prop['chart.scale.decimals'];
727
- var offsetx = prop['chart.labels.offsetx'];
728
- var offsety = prop['chart.labels.offsety'];
729
-
730
- if (prop['chart.tickmarks']) {
731
-
732
- for (var i=0; i<count ; ++i) {
733
- RG.text2(this, {
734
- font:text_font,
735
- size:text_size,
736
- x:position == 'left' ? (this.gutterLeft - 7 + offsetx) : (ca.width - this.gutterRight + 7) + offsetx,
737
- y:(((ca.height - this.gutterTop - this.gutterBottom) / count) * i) + this.gutterTop + offsety,
738
- text:this.scale2.labels[this.scale2.labels.length - (i+1)],
739
- valign:yAlignment,
740
- halign:xAlignment,
741
- tag: 'scale'
742
- });
743
- }
744
-
745
- /**
746
- * Show zero?
747
- */
748
- if (prop['chart.tickmarks.zerostart'] && this.min == 0) {
749
- RG.text2(this, {
750
- font: text_font,
751
- size: text_size,
752
- x: position == 'left' ? (this.gutterLeft - 5 + offsetx) : (ca.width - this.gutterRight + 5 + offsetx),
753
- y: ca.height - this.gutterBottom + offsety,
754
- 'text': RG.numberFormat(this, this.min.toFixed(decimals), units_pre, units_post),
755
- valign: yAlignment,
756
- halign: xAlignment,
757
- tag: 'scale'
758
- });
759
- }
760
-
761
- /**
762
- * min is set
763
- */
764
- if (this.min != 0) {
765
- RG.text2(this, {
766
- font: text_font,
767
- size: text_size,
768
- x: position == 'left' ? (this.gutterLeft - 5 + offsetx) : (ca.width - this.gutterRight + 5 + offsetx),
769
- y: ca.height - this.gutterBottom + offsety,
770
- text: RG.number_format(this, this.min.toFixed(decimals), units_pre, units_post),
771
- valign: yAlignment,
772
- halign: xAlignment,
773
- tag: 'scale'
774
- });
775
- }
776
- }
777
- };
778
-
779
-
780
-
781
-
782
- /**
783
- * Draws titles
784
- */
785
- this.drawTitles =
786
- this.DrawTitles = function ()
787
- {
788
- var text_size = prop['chart.text.size'];
789
- var text_font = prop['chart.text.font'];
790
- var title_size = prop['chart.title.size'] ? prop['chart.title.size'] : text_size + 2;
791
-
792
- // Draw the title text
793
- if (prop['chart.title'].length > 0) {
794
-
795
- co.fillStyle = prop['chart.title.color'];
796
-
797
- RG.text2(this, {
798
- 'font':prop['chart.title.font'] ? prop['chart.title.font'] : text_font,
799
- 'size':title_size,
800
- 'x':this.gutterLeft + ((ca.width - this.gutterLeft - this.gutterRight) / 2),
801
- 'y':this.gutterTop - 5,
802
- 'text':prop['chart.title'],
803
- 'valign':'bottom',
804
- 'halign':'center',
805
- 'bold': prop['chart.title.bold'],
806
- 'tag': 'title'
807
- });
808
- }
809
-
810
- // Draw side title
811
- if (typeof(prop['chart.title.side']) == 'string') {
812
-
813
- co.fillStyle = prop['chart.title.side.color'];
814
-
815
- RG.Text2(this, {'font':prop['chart.title.side.font'],
816
- 'size':prop['chart.title.side.size'],
817
- 'x':prop['chart.labels.position'] == 'right' ? this.gutterLeft - 10 : (ca.width - this.gutterRight) + 10,
818
- 'y':this.gutterTop + (this.height / 2),
819
- 'text': prop['chart.title.side'],
820
- 'valign':'bottom',
821
- 'halign':'center',
822
- 'angle': prop['chart.labels.position'] == 'right' ? 270 : 90,
823
- 'bold': prop['chart.title.side.bold'],
824
- 'tag': 'title.side'
825
- });
826
- }
827
- };
828
-
829
-
830
-
831
-
832
- /**
833
- * Returns the focused bar
834
- *
835
- * @param event e The event object
836
- */
837
- this.getShape =
838
- this.getBar = function (e)
839
- {
840
- var mouseXY = RG.getMouseXY(e),
841
- mouseX = mouseXY[0],
842
- mouseY = mouseXY[1]
843
-
844
- for (var i=0,len=this.coords.length; i<len; i++) {
845
-
846
- var x = this.coords[i][0],
847
- y = this.coords[i][1],
848
- w = this.coords[i][2],
849
- h = this.coords[i][3],
850
- idx = i;
851
-
852
- co.beginPath();
853
- this.drawCurvedBar({
854
- x: x,
855
- y: y,
856
- width: w,
857
- height: h
858
- });
859
-
860
- if (co.isPointInPath(mouseX, mouseY)) {
861
-
862
- var tooltip = RG.parseTooltipText(prop['chart.tooltips'], i);
863
-
864
- return {
865
- 0: this, 'object': this,
866
- 1: x, 'x': x,
867
- 2: y, 'y': y,
868
- 3: w, 'width': w,
869
- 4: h, 'height': h,
870
- 5: i, 'index': i,
871
- 'tooltip': tooltip
872
- };
873
- }
874
- }
875
- };
876
-
877
-
878
-
879
-
880
- /**
881
- * This function returns the value that the mouse is positioned at, regardless of
882
- * the actual indicated value.
883
- *
884
- * @param object e The event object
885
- */
886
- this.getValue = function (e)
887
- {
888
- var mouseCoords = RG.getMouseXY(e);
889
- var mouseX = mouseCoords[0];
890
- var mouseY = mouseCoords[1];
891
-
892
- var value = (this.height - (mouseY - this.gutterTop)) / this.height;
893
- value *= this.max - this.min;
894
- value += this.min;
895
-
896
- // Bounds checking
897
- if (value > this.max) value = this.max;
898
- if (value < this.min) value = this.min;
899
-
900
- return value;
901
- };
902
-
903
-
904
-
905
-
906
- /**
907
- * Each object type has its own Highlight() function which highlights the appropriate shape
908
- *
909
- * @param object shape The shape to highlight
910
- */
911
- this.highlight =
912
- this.Highlight = function (shape)
913
- {
914
- if (typeof prop['chart.highlight.style'] === 'function') {
915
- (prop['chart.highlight.style'])(shape);
916
- } else {
917
-
918
- var last = shape.index === this.coords.length - 1;
919
-
920
- this.drawCurvedBar({
921
- x: shape.x,
922
- y: shape.y,
923
- width: shape.width,
924
- height: shape.height,
925
- stroke: prop['chart.highlight.stroke'],
926
- fill: prop['chart.highlight.fill']
927
- });
928
- }
929
- };
930
-
931
-
932
-
933
-
934
- /**
935
- * The getObjectByXY() worker method. Don't call this call:
936
- *
937
- * RGraph.ObjectRegistry.getObjectByXY(e)
938
- *
939
- * @param object e The event object
940
- */
941
- this.getObjectByXY = function (e)
942
- {
943
- var mouseXY = RG.getMouseXY(e);
944
-
945
- if (
946
- mouseXY[0] > this.gutterLeft
947
- && mouseXY[0] < (ca.width - this.gutterRight)
948
- && mouseXY[1] >= this.gutterTop
949
- && mouseXY[1] <= (ca.height - this.gutterBottom)
950
- ) {
951
-
952
- return this;
953
- }
954
- };
955
-
956
-
957
-
958
-
959
- /**
960
- * This function allows the VProgress to be adjustable.
961
- * UPDATE: Not any more
962
- */
963
- this.allowAdjusting =
964
- this.AllowAdjusting = function () {return;};
965
-
966
-
967
-
968
-
969
- /**
970
- * This method handles the adjusting calculation for when the mouse is moved
971
- *
972
- * @param object e The event object
973
- */
974
- this.adjusting_mousemove =
975
- this.Adjusting_mousemove = function (e)
976
- {
977
- /**
978
- * Handle adjusting for the HProgress
979
- */
980
- if (prop['chart.adjustable'] && RG.Registry.Get('chart.adjusting') && RG.Registry.Get('chart.adjusting').uid == this.uid) {
981
-
982
- var mouseXY = RG.getMouseXY(e);
983
- var value = this.getValue(e);
984
-
985
- if (typeof value === 'number') {
986
-
987
- // Fire the onadjust event
988
- RG.FireCustomEvent(this, 'onadjust');
989
-
990
- this.value = Number(value.toFixed(prop['chart.scale.decimals']));
991
- RG.RedrawCanvas(this.canvas);
992
- }
993
- }
994
- };
995
-
996
-
997
-
998
-
999
- /**
1000
- * Draws chart.labels.specific
1001
- */
1002
- this.drawSpecificLabels =
1003
- this.DrawSpecificLabels = function ()
1004
- {
1005
- var labels = prop['chart.labels.specific'];
1006
-
1007
- if (labels) {
1008
-
1009
- var font = prop['chart.text.font'];
1010
- var size = prop['chart.text.size'];
1011
- var halign = prop['chart.labels.position'] == 'right' ? 'left' : 'right';
1012
- var step = this.height / (labels.length - 1);
1013
-
1014
- co.beginPath();
1015
-
1016
- co.fillStyle = prop['chart.text.color'];
1017
-
1018
- for (var i=0; i<labels.length; ++i) {
1019
-
1020
- RG.Text2(this,{'font':font,
1021
- 'size':size,
1022
- 'x': prop['chart.labels.position'] == 'right' ? ca.width - this.gutterRight + 7 : this.gutterLeft - 7,
1023
- 'y':(this.height + this.gutterTop) - (step * i),
1024
- 'text':labels[i],
1025
- 'valign':'center',
1026
- 'halign':halign,
1027
- 'tag': 'labels.specific'
1028
- });
1029
- }
1030
- co.fill();
1031
- }
1032
- };
1033
-
1034
-
1035
-
1036
-
1037
- /**
1038
- * This function positions a tooltip when it is displayed
1039
- *
1040
- * @param obj object The chart object
1041
- * @param int x The X coordinate specified for the tooltip
1042
- * @param int y The Y coordinate specified for the tooltip
1043
- * @param objec tooltip The tooltips DIV element
1044
- */
1045
- this.positionTooltip = function (obj, x, y, tooltip, idx)
1046
- {
1047
- var coordX = obj.coords[tooltip.__index__][0];
1048
- var coordY = obj.coords[tooltip.__index__][1];
1049
- var coordW = obj.coords[tooltip.__index__][2];
1050
- var coordH = obj.coords[tooltip.__index__][3];
1051
- var canvasXY = RG.getCanvasXY(obj.canvas);
1052
- var mouseXY = RG.getMouseXY(window.event);
1053
- var gutterLeft = obj.gutterLeft;
1054
- var gutterTop = obj.gutterTop;
1055
- var width = tooltip.offsetWidth;
1056
- var height = tooltip.offsetHeight;
1057
-
1058
- // Set the top position
1059
- tooltip.style.left = 0;
1060
- tooltip.style.top = window.event.pageY - height - 5 + 'px';
1061
-
1062
- // By default any overflow is hidden
1063
- tooltip.style.overflow = '';
1064
-
1065
- // Reposition the tooltip if at the edges:
1066
-
1067
- // LEFT edge
1068
- if (canvasXY[0] + mouseXY[0] - (width / 2) < 0) {
1069
- tooltip.style.left = canvasXY[0] + mouseXY[0] - (width * 0.1) + 'px';
1070
-
1071
- // RIGHT edge
1072
- } else if (canvasXY[0] + mouseXY[0] + (width / 2) > doc.body.offsetWidth) {
1073
- tooltip.style.left = canvasXY[0] + mouseXY[0] - (width * 0.9) + 'px';
1074
-
1075
- // Default positioning - CENTERED
1076
- } else {
1077
- tooltip.style.left = canvasXY[0] + mouseXY[0] - (width / 2) + 'px';
1078
- }
1079
- };
1080
-
1081
-
1082
-
1083
-
1084
- /**
1085
- * This function returns the appropriate Y coordinate for the given Y value
1086
- *
1087
- * @param int value The Y value you want the coordinate for
1088
- * @returm int The coordinate
1089
- */
1090
- this.getYCoord = function (value)
1091
- {
1092
- if (value > this.max || value < this.min) {
1093
- return null;
1094
- }
1095
-
1096
- var barHeight = ca.height - prop['chart.gutter.top'] - prop['chart.gutter.bottom'];
1097
- var coord = ((value - this.min) / (this.max - this.min)) * barHeight;
1098
- coord = ca.height - coord - prop['chart.gutter.bottom'];
1099
-
1100
- return coord;
1101
- };
1102
-
1103
-
1104
-
1105
-
1106
- /**
1107
- * This returns true/false as to whether the cursor is over the chart area.
1108
- * The cursor does not necessarily have to be over the bar itself.
1109
- */
1110
- this.overChartArea = function (e)
1111
- {
1112
- var mouseXY = RGraph.getMouseXY(e);
1113
- var mouseX = mouseXY[0];
1114
- var mouseY = mouseXY[1];
1115
-
1116
- if ( mouseX >= this.gutterLeft
1117
- && mouseX <= (ca.width - this.gutterRight)
1118
- && mouseY >= this.gutterTop
1119
- && mouseY <= (ca.height - this.gutterBottom)
1120
- ) {
1121
-
1122
- return true;
1123
- }
1124
-
1125
- return false;
1126
- };
1127
-
1128
-
1129
-
1130
-
1131
- /**
1132
- *
1133
- */
1134
- this.parseColors = function ()
1135
- {
1136
- // Save the original colors so that they can be restored when the canvas is reset
1137
- if (this.original_colors.length === 0) {
1138
- this.original_colors['chart.colors'] = RG.array_clone(prop['chart.colors']);
1139
- this.original_colors['chart.tickmarks.color'] = RG.array_clone(prop['chart.tickmarks.color']);
1140
- this.original_colors['chart.strokestyle.inner'] = RG.array_clone(prop['chart.strokestyle.inner']);
1141
- this.original_colors['chart.strokestyle.outer'] = RG.array_clone(prop['chart.strokestyle.outer']);
1142
- this.original_colors['chart.highlight.fill'] = RG.array_clone(prop['chart.highlight.fill']);
1143
- this.original_colors['chart.highlight.stroke'] = RG.array_clone(prop['chart.highlight.stroke']);
1144
- this.original_colors['chart.highlight.color'] = RG.array_clone(prop['chart.highlight.color']);
1145
- }
1146
-
1147
- var colors = prop['chart.colors'];
1148
-
1149
- for (var i=0,len=colors.length; i<len; ++i) {
1150
- colors[i] = this.parseSingleColorForGradient(colors[i]);
1151
- }
1152
-
1153
- prop['chart.tickmarks.color'] = this.parseSingleColorForGradient(prop['chart.tickmarks.color']);
1154
- prop['chart.strokestyle.inner'] = this.parseSingleColorForGradient(prop['chart.strokestyle.inner']);
1155
- prop['chart.strokestyle.outer'] = this.parseSingleColorForGradient(prop['chart.strokestyle.outer']);
1156
- prop['chart.highlight.fill'] = this.parseSingleColorForGradient(prop['chart.highlight.fill']);
1157
- prop['chart.highlight.stroke'] = this.parseSingleColorForGradient(prop['chart.highlight.stroke']);
1158
- prop['chart.background.color'] = this.parseSingleColorForGradient(prop['chart.background.color']);
1159
- };
1160
-
1161
-
1162
-
1163
-
1164
- /**
1165
- * Use this function to reset the object to the post-constructor state. Eg reset colors if
1166
- * need be etc
1167
- */
1168
- this.reset = function ()
1169
- {
1170
- };
1171
-
1172
-
1173
-
1174
-
1175
- /**
1176
- * This parses a single color value
1177
- */
1178
- this.parseSingleColorForGradient = function (color)
1179
- {
1180
- if (!color || typeof color != 'string') {
1181
- return color;
1182
- }
1183
-
1184
- if (color.match(/^gradient\((.*)\)$/i)) {
1185
- var parts = RegExp.$1.split(':');
1186
-
1187
- // Create the gradient
1188
- var grad = co.createLinearGradient(0, ca.height - prop['chart.gutter.bottom'], 0, prop['chart.gutter.top']);
1189
-
1190
- var diff = 1 / (parts.length - 1);
1191
-
1192
- grad.addColorStop(0, RG.trim(parts[0]));
1193
-
1194
- for (var j=1,len=parts.length; j<len; ++j) {
1195
- grad.addColorStop(j * diff, RG.trim(parts[j]));
1196
- }
1197
-
1198
- return grad ? grad : color;
1199
- }
1200
-
1201
- return grad ? grad : color;
1202
- };
1203
-
1204
-
1205
-
1206
-
1207
- /**
1208
- * Draws the bevel effect
1209
- */
1210
- this.drawBevel =
1211
- this.DrawBevel = function ()
1212
- {
1213
- // In case of multiple segments - this adds up all the lengths
1214
- for (var i=0,height=0; i<this.coords.length; ++i) {
1215
- height += this.coords[i][3];
1216
- }
1217
-
1218
- co.save();
1219
- co.beginPath();
1220
- co.rect(
1221
- this.coords[0][0],
1222
- this.coords[this.coords.length - 1][1] - 1,
1223
- this.coords[0][2],
1224
- height
1225
- );
1226
- co.clip();
1227
-
1228
- co.save();
1229
- // Draw a path to clip to
1230
- co.beginPath();
1231
- this.drawCurvedBar({
1232
- x: this.coords[0][0],
1233
- y: this.coords[this.coords.length - 1][1] - 1,
1234
- width: this.coords[0][2],
1235
- height: height
1236
- });
1237
- co.clip();
1238
-
1239
- // Now draw the rect with a shadow
1240
- co.beginPath();
1241
-
1242
- co.shadowColor = 'black';
1243
- co.shadowOffsetX = 0;
1244
- co.shadowOffsetY = 0;
1245
- co.shadowBlur = 15;
1246
-
1247
- co.lineWidth = 2;
1248
-
1249
- this.drawCurvedBar({
1250
- x: this.coords[0][0] - 1,
1251
- y: this.coords[this.coords.length - 1][1] - 1,
1252
- width: this.coords[0][2] + 2,
1253
- height: height + 2 + 100
1254
- });
1255
-
1256
- co.stroke();
1257
-
1258
- co.restore();
1259
- co.restore();
1260
- };
1261
-
1262
-
1263
-
1264
-
1265
- /**
1266
- * This function handles highlighting an entire data-series for the interactive
1267
- * key
1268
- *
1269
- * @param int index The index of the data series to be highlighted
1270
- */
1271
- this.interactiveKeyHighlight = function (index)
1272
- {
1273
- var coords = this.coords[index];
1274
-
1275
- co.beginPath();
1276
-
1277
- co.strokeStyle = prop['chart.key.interactive.highlight.chart.stroke'];
1278
- co.lineWidth = 2;
1279
- co.fillStyle = prop['chart.key.interactive.highlight.chart.fill'];
1280
-
1281
- co.rect(coords[0], coords[1], coords[2], coords[3]);
1282
- co.fill();
1283
- co.stroke();
1284
-
1285
- // Reset the linewidth
1286
- co.lineWidth = 1;
1287
- };
1288
-
1289
-
1290
-
1291
-
1292
- /**
1293
- * Using a function to add events makes it easier to facilitate method chaining
1294
- *
1295
- * @param string type The type of even to add
1296
- * @param function func
1297
- */
1298
- this.on = function (type, func)
1299
- {
1300
- if (type.substr(0,2) !== 'on') {
1301
- type = 'on' + type;
1302
- }
1303
-
1304
- this[type] = func;
1305
-
1306
- return this;
1307
- };
1308
-
1309
-
1310
-
1311
-
1312
- /**
1313
- * Draws a bar with a curved end
1314
- *
1315
- * DOESN'T DRAW A CURVED BAR ANY MORE - JUST A REGULAR SQUARE ENDED BAR
1316
- *
1317
- * @param object opt The coords and colours
1318
- */
1319
- this.drawCurvedBar = function (opt)
1320
- {
1321
- pa2(co, 'b r % % % %',
1322
- opt.x, opt.y,
1323
- opt.width, opt.height
1324
- );
1325
-
1326
- if (opt.stroke) {
1327
- co.strokeStyle = opt.stroke;
1328
- co.stroke();
1329
- }
1330
-
1331
- if (opt.fill) {
1332
- co.fillStyle = opt.fill;
1333
- co.fill();
1334
- }
1335
- }
1336
-
1337
-
1338
-
1339
-
1340
- /**
1341
- * This function runs once only
1342
- * (put at the end of the file (before any effects))
1343
- */
1344
- this.firstDrawFunc = function ()
1345
- {
1346
- };
1347
-
1348
-
1349
-
1350
-
1351
- /**
1352
- * HProgress Grow effect (which is also the VPogress Grow effect)
1353
- *
1354
- * @param object obj The chart object
1355
- */
1356
- this.grow = function ()
1357
- {
1358
- var obj = this;
1359
- var canvas = obj.canvas;
1360
- var context = obj.context;
1361
- var initial_value = obj.currentValue;
1362
- var opt = arguments[0] || {};
1363
- var numFrames = opt.frames || 30;
1364
- var frame = 0
1365
- var callback = arguments[1] || function () {};
1366
-
1367
- if (typeof obj.value === 'object') {
1368
-
1369
- if (RGraph.is_null(obj.currentValue)) {
1370
- obj.currentValue = [];
1371
- for (var i=0; i<obj.value.length; ++i) {
1372
- obj.currentValue[i] = 0;
1373
- }
1374
- }
1375
-
1376
- var diff = [];
1377
- var increment = [];
1378
-
1379
- for (var i=0; i<obj.value.length; ++i) {
1380
- diff[i] = obj.value[i] - Number(obj.currentValue[i]);
1381
- increment[i] = diff[i] / numFrames;
1382
- }
1383
-
1384
- if (initial_value == null) {
1385
- initial_value = [];
1386
- for (var i=0; i< obj.value.length; ++i) {
1387
- initial_value[i] = 0;
1388
- }
1389
- }
1390
-
1391
- } else {
1392
-
1393
- var diff = obj.value - Number(obj.currentValue);
1394
- var increment = diff / numFrames;
1395
- }
1396
-
1397
-
1398
-
1399
-
1400
-
1401
-
1402
- function iterator ()
1403
- {
1404
- frame++;
1405
-
1406
- if (frame <= numFrames) {
1407
-
1408
- if (typeof obj.value == 'object') {
1409
- obj.value = [];
1410
- for (var i=0; i<initial_value.length; ++i) {
1411
- obj.value[i] = initial_value[i] + (increment[i] * frame);
1412
- }
1413
- } else {
1414
- obj.value = initial_value + (increment * frame);
1415
- }
1416
-
1417
- RGraph.clear(obj.canvas);
1418
- RGraph.redrawCanvas(obj.canvas);
1419
-
1420
- RGraph.Effects.updateCanvas(iterator);
1421
- } else {
1422
- callback();
1423
- }
1424
- }
1425
-
1426
- iterator();
1427
-
1428
- return this;
1429
- };
1430
-
1431
-
1432
-
1433
- RG.att(ca);
1434
-
1435
-
1436
-
1437
- /**
1438
- * The chart is now always registered
1439
- */
1440
- RG.Register(this);
1441
-
1442
-
1443
-
1444
-
1445
- /**
1446
- * This is the 'end' of the constructor so if the first argument
1447
- * contains configuration data - handle that.
1448
- */
1449
- if (parseConfObjectForOptions) {
1450
- RG.parseObjectStyleConfig(this, conf.options);
1451
- }
1452
- };