rgraph-rails 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +1 -0
  3. data/README.md +2 -2
  4. data/lib/rgraph-rails/version.rb +1 -1
  5. data/vendor/assets/images/bullet.png +0 -0
  6. data/vendor/assets/images/facebook-large.png +0 -0
  7. data/vendor/assets/images/google-plus-large.png +0 -0
  8. data/vendor/assets/images/logo.png +0 -0
  9. data/vendor/assets/images/rgraph.jpg +0 -0
  10. data/vendor/assets/javascripts/RGraph.bar.js +533 -242
  11. data/vendor/assets/javascripts/RGraph.bipolar.js +152 -169
  12. data/vendor/assets/javascripts/RGraph.common.annotate.js +2 -2
  13. data/vendor/assets/javascripts/RGraph.common.context.js +2 -2
  14. data/vendor/assets/javascripts/RGraph.common.core.js +688 -373
  15. data/vendor/assets/javascripts/RGraph.common.csv.js +2 -2
  16. data/vendor/assets/javascripts/RGraph.common.deprecated.js +2 -2
  17. data/vendor/assets/javascripts/RGraph.common.dynamic.js +188 -193
  18. data/vendor/assets/javascripts/RGraph.common.effects.js +62 -38
  19. data/vendor/assets/javascripts/RGraph.common.key.js +35 -15
  20. data/vendor/assets/javascripts/RGraph.common.resizing.js +38 -21
  21. data/vendor/assets/javascripts/RGraph.common.sheets.js +2 -2
  22. data/vendor/assets/javascripts/RGraph.common.tooltips.js +48 -40
  23. data/vendor/assets/javascripts/RGraph.common.zoom.js +2 -2
  24. data/vendor/assets/javascripts/RGraph.drawing.background.js +33 -49
  25. data/vendor/assets/javascripts/RGraph.drawing.circle.js +27 -30
  26. data/vendor/assets/javascripts/RGraph.drawing.image.js +23 -26
  27. data/vendor/assets/javascripts/RGraph.drawing.marker1.js +47 -40
  28. data/vendor/assets/javascripts/RGraph.drawing.marker2.js +38 -42
  29. data/vendor/assets/javascripts/RGraph.drawing.marker3.js +24 -28
  30. data/vendor/assets/javascripts/RGraph.drawing.poly.js +25 -39
  31. data/vendor/assets/javascripts/RGraph.drawing.rect.js +27 -32
  32. data/vendor/assets/javascripts/RGraph.drawing.text.js +53 -58
  33. data/vendor/assets/javascripts/RGraph.drawing.xaxis.js +24 -29
  34. data/vendor/assets/javascripts/RGraph.drawing.yaxis.js +45 -51
  35. data/vendor/assets/javascripts/RGraph.fuel.js +11 -9
  36. data/vendor/assets/javascripts/RGraph.funnel.js +40 -43
  37. data/vendor/assets/javascripts/RGraph.gantt.js +34 -34
  38. data/vendor/assets/javascripts/RGraph.gauge.js +64 -55
  39. data/vendor/assets/javascripts/RGraph.hbar.js +194 -137
  40. data/vendor/assets/javascripts/RGraph.hprogress.js +261 -167
  41. data/vendor/assets/javascripts/RGraph.line.js +520 -512
  42. data/vendor/assets/javascripts/RGraph.meter.js +11 -10
  43. data/vendor/assets/javascripts/RGraph.modaldialog.js +11 -2
  44. data/vendor/assets/javascripts/RGraph.odo.js +11 -9
  45. data/vendor/assets/javascripts/RGraph.pie.js +385 -100
  46. data/vendor/assets/javascripts/RGraph.radar.js +36 -29
  47. data/vendor/assets/javascripts/RGraph.rose.js +58 -41
  48. data/vendor/assets/javascripts/RGraph.rscatter.js +40 -36
  49. data/vendor/assets/javascripts/RGraph.scatter.js +441 -499
  50. data/vendor/assets/javascripts/RGraph.semicircularprogress.js +1015 -0
  51. data/vendor/assets/javascripts/RGraph.thermometer.js +37 -37
  52. data/vendor/assets/javascripts/RGraph.vprogress.js +285 -157
  53. data/vendor/assets/javascripts/RGraph.waterfall.js +62 -62
  54. data/vendor/assets/stylesheets/website.css +30 -16
  55. metadata +3 -2
@@ -1,4 +1,4 @@
1
- // version: 2016-02-06
1
+ // version: 2016-06-04
2
2
  /**
3
3
  * o--------------------------------------------------------------------------------o
4
4
  * | This file is part of the RGraph package - you can learn more at: |
@@ -7,7 +7,7 @@
7
7
  * | |
8
8
  * | RGraph is dual licensed under the Open Source GPL (General Public License) |
9
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 |
10
+ * | the terms of the GPL. The commercial license is just 99 GBP and you can |
11
11
  * | read about it here: |
12
12
  * | http://www.rgraph.net/license |
13
13
  * o--------------------------------------------------------------------------------o
@@ -88,8 +88,11 @@
88
88
  'chart.gutter.bottom': 15,
89
89
  'chart.ticksize': 3,
90
90
  'chart.text.color': 'black',
91
- 'chart.text.font': 'Arial',
91
+ 'chart.text.font': 'Segoe UI, Arial, Verdana, sans-serif',
92
92
  'chart.text.size': 12,
93
+ 'chart.text.accessible': true,
94
+ 'chart.text.accessible.overflow': 'visible',
95
+ 'chart.text.accessible.pointerevents': false,
93
96
  'chart.units.pre': '',
94
97
  'chart.units.post': '',
95
98
  'chart.zoom.factor': 1.5,
@@ -130,7 +133,8 @@
130
133
  'chart.tooltips.effect': 'fade',
131
134
  'chart.tooltips.event': 'onclick',
132
135
  'chart.highlight.stroke': 'rgba(0,0,0,0)',
133
- 'chart.highlight.fill': 'rgba(255,255,255,0.7)'
136
+ 'chart.highlight.fill': 'rgba(255,255,255,0.7)',
137
+ 'chart.clearto': 'rgba(0,0,0,0)'
134
138
  }
135
139
 
136
140
 
@@ -167,7 +171,6 @@
167
171
  ca = this.canvas,
168
172
  co = ca.getContext('2d'),
169
173
  prop = this.properties,
170
- pa = RG.Path,
171
174
  pa2 = RG.path2,
172
175
  win = window,
173
176
  doc = document,
@@ -219,10 +222,9 @@
219
222
 
220
223
 
221
224
  // Convert uppercase letters to dot+lower case letter
222
- name = name.replace(/([A-Z])/g, function (str)
223
- {
224
- return '.' + String(RegExp.$1).toLowerCase();
225
- });
225
+ while(name.match(/([A-Z])/)) {
226
+ name = name.replace(/([A-Z])/, '.' + RegExp.$1.toLowerCase());
227
+ }
226
228
 
227
229
 
228
230
 
@@ -776,17 +778,25 @@
776
778
  this.Highlight = function (shape)
777
779
  {
778
780
  if (prop['chart.tooltips.highlight']) {
779
-
780
- // Add the new highlight
781
- //RGraph.Highlight.Rect(this, shape);
782
-
783
- co.beginPath();
784
- co.strokeStyle = prop['chart.highlight.stroke'];
785
- co.fillStyle = prop['chart.highlight.fill'];
786
- co.rect(shape['x'],shape['y'],shape['width'],shape['height'] + this.bulbBottomRadius);
787
- co.arc(this.bulbBottomCenterX, this.bulbBottomCenterY, this.bulbBottomRadius - 1, 0, RG.TWOPI, false);
788
- co.stroke;
789
- co.fill();
781
+
782
+ if (typeof prop['chart.highlight.style'] === 'function') {
783
+ (prop['chart.highlight.style'])(shape);
784
+ return;
785
+ }
786
+
787
+ pa2(co, 'b r % % % % a % % % % % false s % f %',
788
+ shape['x'],
789
+ shape['y'],
790
+ shape['width'],
791
+ shape['height'] + this.bulbBottomRadius,
792
+ this.bulbBottomCenterX,
793
+ this.bulbBottomCenterY,
794
+ this.bulbBottomRadius - 1,
795
+ 0,
796
+ RG.TWOPI,
797
+ prop['chart.highlight.stroke'],
798
+ prop['chart.highlight.fill']
799
+ );
790
800
  }
791
801
  };
792
802
 
@@ -864,6 +874,7 @@
864
874
  var coordW = obj.coords[tooltip.__index__][2];
865
875
  var coordH = obj.coords[tooltip.__index__][3];
866
876
  var canvasXY = RGraph.getCanvasXY(ca);
877
+ var mouseXY = RG.getMouseXY(window.event);
867
878
  var gutterLeft = obj.gutterLeft;
868
879
  var gutterTop = obj.gutterTop;
869
880
  var width = tooltip.offsetWidth;
@@ -871,35 +882,24 @@
871
882
 
872
883
  // Set the top position
873
884
  tooltip.style.left = 0;
874
- tooltip.style.top = canvasXY[1] + coordY - height - 7 + 'px';
885
+ tooltip.style.top = window.event.pageY - height - 5 + 'px';
875
886
 
876
887
  // By default any overflow is hidden
877
888
  tooltip.style.overflow = '';
878
-
879
- // The arrow
880
- var img = new Image();
881
- img.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAFCAYAAACjKgd3AAAARUlEQVQYV2NkQAN79+797+RkhC4M5+/bd47B2dmZEVkBCgcmgcsgbAaA9GA1BCSBbhAuA/AagmwQPgMIGgIzCD0M0AMMAEFVIAa6UQgcAAAAAElFTkSuQmCC';
882
- img.style.position = 'absolute';
883
- img.id = '__rgraph_tooltip_pointer__';
884
- img.style.top = (tooltip.offsetHeight - 2) + 'px';
885
- tooltip.appendChild(img);
886
889
 
887
890
  // Reposition the tooltip if at the edges:
888
891
 
889
892
  // LEFT edge
890
- if ((canvasXY[0] + coordX - (width / 2)) < 10) {
891
- tooltip.style.left = (canvasXY[0] + coordX - (width * 0.1)) + (coordW / 2) + 'px';
892
- img.style.left = ((width * 0.1) - 8.5) + 'px';
893
+ if (canvasXY[0] + mouseXY[0] - (width / 2) < 0) {
894
+ tooltip.style.left = canvasXY[0] + mouseXY[0] - (width * 0.1) + 'px';
893
895
 
894
896
  // RIGHT edge
895
- } else if ((canvasXY[0] + coordX + (width / 2)) > doc.body.offsetWidth) {
896
- tooltip.style.left = canvasXY[0] + coordX - (width * 0.9) + (coordW / 2) + 'px';
897
- img.style.left = ((width * 0.9) - 8.5) + 'px';
897
+ } else if (canvasXY[0] + mouseXY[0] + (width / 2) > doc.body.offsetWidth) {
898
+ tooltip.style.left = canvasXY[0] + mouseXY[0] - (width * 0.9) + 'px';
898
899
 
899
900
  // Default positioning - CENTERED
900
901
  } else {
901
- tooltip.style.left = (canvasXY[0] + coordX + (coordW / 2) - (width * 0.5)) + 'px';
902
- img.style.left = ((width * 0.5) - 8.5) + 'px';
902
+ tooltip.style.left = canvasXY[0] + mouseXY[0] - (width / 2) + 'px';
903
903
  }
904
904
  };
905
905
 
@@ -1,4 +1,4 @@
1
- // version: 2016-02-06
1
+ // version: 2016-06-04
2
2
  /**
3
3
  * o--------------------------------------------------------------------------------o
4
4
  * | This file is part of the RGraph package - you can learn more at: |
@@ -7,7 +7,7 @@
7
7
  * | |
8
8
  * | RGraph is dual licensed under the Open Source GPL (General Public License) |
9
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 |
10
+ * | the terms of the GPL. The commercial license is just 99 GBP and you can |
11
11
  * | read about it here: |
12
12
  * | http://www.rgraph.net/license |
13
13
  * o--------------------------------------------------------------------------------o
@@ -91,7 +91,7 @@
91
91
  'chart.gutter.bottom': 25,
92
92
  'chart.numticks': 10,
93
93
  'chart.numticks.inner': 50,
94
- 'chart.background.color': '#eee',
94
+ 'chart.background.color': 'Gradient(#ccc:#eee:#efefef)',
95
95
  'chart.shadow': false,
96
96
  'chart.shadow.color': 'rgba(0,0,0,0.5)',
97
97
  'chart.shadow.blur': 3,
@@ -103,13 +103,16 @@
103
103
  'chart.title.size': null,
104
104
  'chart.title.color': 'black',
105
105
  'chart.title.side': null,
106
- 'chart.title.side.font': 'Arial',
106
+ 'chart.title.side.font': 'Segoe UI, Arial, Verdana, sans-serif',
107
107
  'chart.title.side.size': 12,
108
108
  'chart.title.side.color': 'black',
109
109
  'chart.title.side.bold': true,
110
110
  'chart.text.size': 12,
111
111
  'chart.text.color': 'black',
112
- 'chart.text.font': 'Arial',
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,
113
116
  'chart.contextmenu': null,
114
117
  'chart.units.pre': '',
115
118
  'chart.units.post': '',
@@ -140,6 +143,8 @@
140
143
  'chart.label.inner': false,
141
144
  'chart.labels.count': 10,
142
145
  'chart.labels.position': 'right',
146
+ 'chart.labels.offsetx': 0,
147
+ 'chart.labels.offsety': 0,
143
148
  'chart.adjustable': false,
144
149
  'chart.scale.decimals': 0,
145
150
  'chart.scale.thousand': ',',
@@ -167,7 +172,8 @@
167
172
  'chart.key.text.color': 'black',
168
173
  'chart.events.click': null,
169
174
  'chart.events.mousemove': null,
170
- 'chart.border.inner': true
175
+ 'chart.border.inner': true,
176
+ 'chart.clearto': 'rgba(0,0,0,0)'
171
177
  }
172
178
 
173
179
  // Check for support
@@ -204,7 +210,6 @@
204
210
  ca = this.canvas,
205
211
  co = ca.getContext('2d'),
206
212
  prop = this.properties,
207
- pa = RG.Path,
208
213
  pa2 = RG.path2,
209
214
  win = window,
210
215
  doc = document,
@@ -264,10 +269,9 @@
264
269
 
265
270
 
266
271
  // Convert uppercase letters to dot+lower case letter
267
- name = name.replace(/([A-Z])/g, function (str)
268
- {
269
- return '.' + String(RegExp.$1).toLowerCase();
270
- });
272
+ while(name.match(/([A-Z])/)) {
273
+ name = name.replace(/([A-Z])/, '.' + RegExp.$1.toLowerCase());
274
+ }
271
275
 
272
276
 
273
277
 
@@ -446,79 +450,120 @@
446
450
  /**
447
451
  * First get the scale
448
452
  */
449
- this.scale2 = RGraph.getScale2(this, {
450
- 'max':this.max,
451
- 'min':this.min,
452
- 'strict':true,
453
- 'scale.thousand':prop['chart.scale.thousand'],
454
- 'scale.point':prop['chart.scale.point'],
455
- 'scale.decimals':prop['chart.scale.decimals'],
456
- 'ylabels.count':prop['chart.labels.count'],
457
- 'scale.round':prop['chart.scale.round'],
458
- 'units.pre': prop['chart.units.pre'],
459
- 'units.post': prop['chart.units.post']
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']
460
464
  });
461
465
 
462
-
466
+
463
467
  // Set a shadow if requested
464
468
  if (prop['chart.shadow']) {
465
- RG.SetShadow(this, prop['chart.shadow.color'], prop['chart.shadow.offsetx'], prop['chart.shadow.offsety'], prop['chart.shadow.blur']);
466
- }
467
-
468
- // Draw the shadow for MSIE
469
- if (RGraph.ISOLD && prop['chart.shadow']) {
470
- co.fillStyle = prop['chart.shadow.color'];
471
- co.fillRect(this.gutterLeft + prop['chart.shadow.offsetx'], this.gutterTop + prop['chart.shadow.offsety'], this.width, this.height);
469
+ RG.setShadow(this, prop['chart.shadow.color'], prop['chart.shadow.offsetx'], prop['chart.shadow.offsety'], prop['chart.shadow.blur']);
472
470
  }
473
471
 
474
472
  // Draw the outline
475
473
  co.fillStyle = prop['chart.background.color'];
476
474
  co.strokeStyle = prop['chart.strokestyle.outer'];
477
- co.strokeRect(this.gutterLeft, this.gutterTop, this.width, this.height);
478
- co.fillRect(this.gutterLeft, this.gutterTop, this.width, this.height);
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
+ );
479
489
 
480
490
  // Turn off any shadow
481
- RG.NoShadow(this);
491
+ RG.noShadow(this);
482
492
 
483
493
  co.strokeStyle = prop['chart.strokestyle.outer'];
484
494
  co.fillStyle = prop['chart.colors'][0];
485
495
  var margin = prop['chart.margin'];
486
496
  var barHeight = (ca.height - this.gutterTop - this.gutterBottom) * ((RG.arraySum(this.value) - this.min) / (this.max - this.min));
487
-
497
+
488
498
  // Draw the actual bar itself
489
- if (typeof this.value == 'number') {
490
-
499
+ if (typeof this.value === 'number') {
500
+
491
501
  co.lineWidth = 1;
492
502
  co.strokeStyle = prop['chart.strokestyle.inner'];
493
-
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
+
494
521
  } else if (typeof this.value == 'object') {
495
-
522
+
496
523
  co.beginPath();
497
524
  co.strokeStyle = prop['chart.strokestyle.inner'];
498
525
 
499
526
  var startPoint = ca.height - this.gutterBottom;
500
527
 
501
- for (var i=0; i<this.value.length; ++i) {
502
-
528
+ for (var i=0,len=this.value.length; i<len; ++i) {
529
+
503
530
  var segmentHeight = ( (this.value[i] - this.min) / (this.max - this.min) ) * (ca.height - this.gutterBottom - this.gutterTop);
504
531
 
505
532
  co.fillStyle = prop['chart.colors'][i];
506
-
533
+
534
+ co.beginPath();
507
535
  if (prop['chart.border.inner']) {
508
- co.strokeRect(this.gutterLeft + margin, startPoint - segmentHeight, this.width - margin - margin, segmentHeight);
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
+ });
509
543
  }
510
- co.fillRect(this.gutterLeft + margin, startPoint - segmentHeight, this.width - margin - margin, segmentHeight);
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
+ });
511
552
 
512
553
 
513
554
 
514
555
  // Store the coords
515
- this.coords.push([this.gutterLeft + margin, startPoint - segmentHeight, this.width - margin - margin, segmentHeight]);
556
+ this.coords.push([
557
+ this.gutterLeft + margin,
558
+ startPoint - segmentHeight,
559
+ this.width - margin - margin,
560
+ segmentHeight
561
+ ]);
516
562
 
517
563
  startPoint -= segmentHeight;
518
564
  }
519
-
520
-
521
- co.stroke();
565
+
566
+ //co.stroke();
522
567
  co.fill();
523
568
  }
524
569
 
@@ -547,23 +592,34 @@
547
592
 
548
593
  co.beginPath();
549
594
  co.strokeStyle = prop['chart.strokestyle.inner'];
550
-
595
+
551
596
  if (typeof this.value == 'number') {
552
597
 
553
598
  if (prop['chart.border.inner']) {
554
- co.strokeRect(this.gutterLeft + margin, this.gutterTop + this.height - barHeight, this.width - margin - margin, barHeight);
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
+ });
555
605
  }
556
- co.fillRect(
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([
557
616
  this.gutterLeft + margin,
558
617
  this.gutterTop + this.height - barHeight,
559
618
  this.width - margin - margin,
560
619
  barHeight
561
- );
562
-
563
- // Store the coords
564
- this.coords.push([this.gutterLeft + margin, this.gutterTop + this.height - barHeight, this.width - margin - margin, barHeight]);
620
+ ]);
565
621
  }
566
-
622
+
567
623
 
568
624
  /**
569
625
  * Draw the arrows indicating the level if requested
@@ -605,15 +661,16 @@
605
661
  */
606
662
  if (prop['chart.label.inner']) {
607
663
  co.fillStyle = 'black';
608
- RG.Text2(this, {'font':prop['chart.text.font'],
609
- 'size':prop['chart.text.size'],
610
- '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'])),
611
- 'valign':'bottom',
612
- 'halign':'center',
613
- 'bounding':true,
614
- 'boundingFill':'white',
615
- 'tag': 'label.inner'
616
- });
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
+ });
617
674
  }
618
675
  };
619
676
 
@@ -658,7 +715,7 @@
658
715
 
659
716
  co.fillStyle = prop['chart.text.color'];
660
717
 
661
- var position = prop['chart.labels.position'];
718
+ var position = prop['chart.labels.position'].toLowerCase();
662
719
  var xAlignment = position == 'left' ? 'right' : 'left';
663
720
  var yAlignment = 'center';
664
721
  var count = prop['chart.labels.count'];
@@ -667,48 +724,54 @@
667
724
  var text_size = prop['chart.text.size'];
668
725
  var text_font = prop['chart.text.font'];
669
726
  var decimals = prop['chart.scale.decimals'];
727
+ var offsetx = prop['chart.labels.offsetx'];
728
+ var offsety = prop['chart.labels.offsety'];
670
729
 
671
730
  if (prop['chart.tickmarks']) {
672
731
 
673
732
  for (var i=0; i<count ; ++i) {
674
- RG.Text2(this, {'font':text_font,
675
- 'size':text_size,
676
- 'x':position == 'left' ? (this.gutterLeft - 7) : (ca.width - this.gutterRight + 7),
677
- 'y':(((ca.height - this.gutterTop - this.gutterBottom) / count) * i) + this.gutterTop,
678
- 'text':this.scale2.labels[this.scale2.labels.length - (i+1)],
679
- 'valign':yAlignment,
680
- 'halign':xAlignment,
681
- 'tag': 'scale'
682
- });
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
+ });
683
743
  }
684
744
 
685
745
  /**
686
746
  * Show zero?
687
747
  */
688
748
  if (prop['chart.tickmarks.zerostart'] && this.min == 0) {
689
- RG.Text2(this, {'font':text_font,
690
- 'size':text_size,
691
- 'x':position == 'left' ? (this.gutterLeft - 5) : (ca.width - this.gutterRight + 5),
692
- 'y':ca.height - this.gutterBottom,'text':RG.number_format(this, this.min.toFixed(decimals), units_pre, units_post),
693
- 'valign':yAlignment,
694
- 'halign':xAlignment,
695
- 'tag': 'scale'
696
- });
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
+ });
697
759
  }
698
760
 
699
761
  /**
700
762
  * min is set
701
763
  */
702
764
  if (this.min != 0) {
703
- RG.Text2(this, {'font':text_font,
704
- 'size':text_size,
705
- 'x':position == 'left' ? (this.gutterLeft - 5) : (ca.width - this.gutterRight + 5),
706
- 'y':ca.height - this.gutterBottom,
707
- 'text':RG.number_format(this, this.min.toFixed(decimals), units_pre, units_post),
708
- 'valign':yAlignment,
709
- 'halign':xAlignment,
710
- 'tag': 'scale'
711
- });
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
+ });
712
775
  }
713
776
  }
714
777
  };
@@ -731,16 +794,17 @@
731
794
 
732
795
  co.fillStyle = prop['chart.title.color'];
733
796
 
734
- RG.Text2(this, {'font':prop['chart.title.font'] ? prop['chart.title.font'] : text_font,
735
- 'size':title_size,
736
- 'x':this.gutterLeft + ((ca.width - this.gutterLeft - this.gutterRight) / 2),
737
- 'y':this.gutterTop - 5,
738
- 'text':prop['chart.title'],
739
- 'valign':'bottom',
740
- 'halign':'center',
741
- 'bold': prop['chart.title.bold'],
742
- 'tag': 'title'
743
- });
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
+ });
744
808
  }
745
809
 
746
810
  // Draw side title
@@ -773,30 +837,39 @@
773
837
  this.getShape =
774
838
  this.getBar = function (e)
775
839
  {
776
- var mouseCoords = RG.getMouseXY(e)
777
-
840
+ var mouseXY = RG.getMouseXY(e),
841
+ mouseX = mouseXY[0],
842
+ mouseY = mouseXY[1]
843
+
778
844
  for (var i=0,len=this.coords.length; i<len; i++) {
779
-
780
- var mouseCoords = RG.getMouseXY(e);
781
- var mouseX = mouseCoords[0];
782
- var mouseY = mouseCoords[1];
783
- var left = this.coords[i][0];
784
- var top = this.coords[i][1];
785
- var width = this.coords[i][2];
786
- var height = this.coords[i][3];
787
- var idx = i;
788
-
789
- if (mouseX >= left && mouseX <= (left + width) && mouseY >= top && mouseY <= (top + height) ) {
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)) {
790
861
 
791
862
  var tooltip = RG.parseTooltipText(prop['chart.tooltips'], i);
792
863
 
793
- return {0: this, 'object': this,
794
- 1: left, 'x': left,
795
- 2: top, 'y': top,
796
- 3: width, 'width': width,
797
- 4: height, 'height': height,
798
- 5: i, 'index': i,
799
- 'tooltip': tooltip };
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
+ };
800
873
  }
801
874
  }
802
875
  };
@@ -838,8 +911,21 @@
838
911
  this.highlight =
839
912
  this.Highlight = function (shape)
840
913
  {
841
- // Add the new highlight
842
- RG.Highlight.Rect(this, shape);
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
+ }
843
929
  };
844
930
 
845
931
 
@@ -963,6 +1049,7 @@
963
1049
  var coordW = obj.coords[tooltip.__index__][2];
964
1050
  var coordH = obj.coords[tooltip.__index__][3];
965
1051
  var canvasXY = RG.getCanvasXY(obj.canvas);
1052
+ var mouseXY = RG.getMouseXY(window.event);
966
1053
  var gutterLeft = obj.gutterLeft;
967
1054
  var gutterTop = obj.gutterTop;
968
1055
  var width = tooltip.offsetWidth;
@@ -970,35 +1057,24 @@
970
1057
 
971
1058
  // Set the top position
972
1059
  tooltip.style.left = 0;
973
- tooltip.style.top = canvasXY[1] + coordY - height - 7 + 'px';
1060
+ tooltip.style.top = window.event.pageY - height - 5 + 'px';
974
1061
 
975
1062
  // By default any overflow is hidden
976
1063
  tooltip.style.overflow = '';
977
-
978
- // The arrow
979
- var img = new Image();
980
- img.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAFCAYAAACjKgd3AAAARUlEQVQYV2NkQAN79+797+RkhC4M5+/bd47B2dmZEVkBCgcmgcsgbAaA9GA1BCSBbhAuA/AagmwQPgMIGgIzCD0M0AMMAEFVIAa6UQgcAAAAAElFTkSuQmCC';
981
- img.style.position = 'absolute';
982
- img.id = '__rgraph_tooltip_pointer__';
983
- img.style.top = (tooltip.offsetHeight - 2) + 'px';
984
- tooltip.appendChild(img);
985
1064
 
986
1065
  // Reposition the tooltip if at the edges:
987
1066
 
988
1067
  // LEFT edge
989
- if ((canvasXY[0] + coordX + (coordW / 2) - (width / 2)) < 10) {
990
- tooltip.style.left = (canvasXY[0] + coordX - (width * 0.1)) + (coordW / 2) + 'px';
991
- img.style.left = ((width * 0.1) - 8.5) + 'px';
1068
+ if (canvasXY[0] + mouseXY[0] - (width / 2) < 0) {
1069
+ tooltip.style.left = canvasXY[0] + mouseXY[0] - (width * 0.1) + 'px';
992
1070
 
993
1071
  // RIGHT edge
994
- } else if ((canvasXY[0] + coordX + (coordW / 2) + (width / 2)) > doc.body.offsetWidth) {
995
- tooltip.style.left = canvasXY[0] + coordX - (width * 0.9) + (coordW / 2) + 'px';
996
- img.style.left = ((width * 0.9) - 8.5) + 'px';
1072
+ } else if (canvasXY[0] + mouseXY[0] + (width / 2) > doc.body.offsetWidth) {
1073
+ tooltip.style.left = canvasXY[0] + mouseXY[0] - (width * 0.9) + 'px';
997
1074
 
998
1075
  // Default positioning - CENTERED
999
1076
  } else {
1000
- tooltip.style.left = (canvasXY[0] + coordX + (coordW / 2) - (width * 0.5)) + 'px';
1001
- img.style.left = ((width * 0.5) - 8.5) + 'px';
1077
+ tooltip.style.left = canvasXY[0] + mouseXY[0] - (width / 2) + 'px';
1002
1078
  }
1003
1079
  };
1004
1080
 
@@ -1135,27 +1211,51 @@
1135
1211
  this.DrawBevel = function ()
1136
1212
  {
1137
1213
  // In case of multiple segments - this adds up all the lengths
1138
- for (var i=0,len=0; i<this.coords.length; ++i) len += this.coords[i][3];
1214
+ for (var i=0,height=0; i<this.coords.length; ++i) {
1215
+ height += this.coords[i][3];
1216
+ }
1139
1217
 
1140
1218
  co.save();
1141
- // Draw a path to clip to
1142
- co.beginPath();
1143
- co.rect(this.coords[0][0], this.coords[this.coords.length - 1][1] - 1, this.coords[0][2], len);
1144
- co.clip();
1145
-
1146
- // Now draw the rect with a shadow
1147
- co.beginPath();
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();
1148
1238
 
1149
- co.shadowColor = 'black';
1150
- co.shadowOffsetX = 0;
1151
- co.shadowOffsetY = 0;
1152
- co.shadowBlur = 15;
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
+ });
1153
1255
 
1154
- co.lineWidth = 2;
1155
- co.rect(this.coords[0][0] - 1, this.coords[this.coords.length - 1][1] - 1, this.coords[0][2] + 2, len + 2);
1156
-
1157
- co.stroke();
1158
-
1256
+ co.stroke();
1257
+
1258
+ co.restore();
1159
1259
  co.restore();
1160
1260
  };
1161
1261
 
@@ -1209,6 +1309,34 @@
1209
1309
 
1210
1310
 
1211
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
+
1212
1340
  /**
1213
1341
  * This function runs once only
1214
1342
  * (put at the end of the file (before any effects))