rgraph-rails 1.0.4 → 1.0.5

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 (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))