rgraph-rails 1.0.5 → 1.0.6

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