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.
- checksums.yaml +8 -8
- data/.travis.yml +1 -0
- data/README.md +2 -2
- data/lib/rgraph-rails/version.rb +1 -1
- data/vendor/assets/images/bullet.png +0 -0
- data/vendor/assets/images/facebook-large.png +0 -0
- data/vendor/assets/images/google-plus-large.png +0 -0
- data/vendor/assets/images/logo.png +0 -0
- data/vendor/assets/images/rgraph.jpg +0 -0
- data/vendor/assets/javascripts/RGraph.bar.js +533 -242
- data/vendor/assets/javascripts/RGraph.bipolar.js +152 -169
- data/vendor/assets/javascripts/RGraph.common.annotate.js +2 -2
- data/vendor/assets/javascripts/RGraph.common.context.js +2 -2
- data/vendor/assets/javascripts/RGraph.common.core.js +688 -373
- data/vendor/assets/javascripts/RGraph.common.csv.js +2 -2
- data/vendor/assets/javascripts/RGraph.common.deprecated.js +2 -2
- data/vendor/assets/javascripts/RGraph.common.dynamic.js +188 -193
- data/vendor/assets/javascripts/RGraph.common.effects.js +62 -38
- data/vendor/assets/javascripts/RGraph.common.key.js +35 -15
- data/vendor/assets/javascripts/RGraph.common.resizing.js +38 -21
- data/vendor/assets/javascripts/RGraph.common.sheets.js +2 -2
- data/vendor/assets/javascripts/RGraph.common.tooltips.js +48 -40
- data/vendor/assets/javascripts/RGraph.common.zoom.js +2 -2
- data/vendor/assets/javascripts/RGraph.drawing.background.js +33 -49
- data/vendor/assets/javascripts/RGraph.drawing.circle.js +27 -30
- data/vendor/assets/javascripts/RGraph.drawing.image.js +23 -26
- data/vendor/assets/javascripts/RGraph.drawing.marker1.js +47 -40
- data/vendor/assets/javascripts/RGraph.drawing.marker2.js +38 -42
- data/vendor/assets/javascripts/RGraph.drawing.marker3.js +24 -28
- data/vendor/assets/javascripts/RGraph.drawing.poly.js +25 -39
- data/vendor/assets/javascripts/RGraph.drawing.rect.js +27 -32
- data/vendor/assets/javascripts/RGraph.drawing.text.js +53 -58
- data/vendor/assets/javascripts/RGraph.drawing.xaxis.js +24 -29
- data/vendor/assets/javascripts/RGraph.drawing.yaxis.js +45 -51
- data/vendor/assets/javascripts/RGraph.fuel.js +11 -9
- data/vendor/assets/javascripts/RGraph.funnel.js +40 -43
- data/vendor/assets/javascripts/RGraph.gantt.js +34 -34
- data/vendor/assets/javascripts/RGraph.gauge.js +64 -55
- data/vendor/assets/javascripts/RGraph.hbar.js +194 -137
- data/vendor/assets/javascripts/RGraph.hprogress.js +261 -167
- data/vendor/assets/javascripts/RGraph.line.js +520 -512
- data/vendor/assets/javascripts/RGraph.meter.js +11 -10
- data/vendor/assets/javascripts/RGraph.modaldialog.js +11 -2
- data/vendor/assets/javascripts/RGraph.odo.js +11 -9
- data/vendor/assets/javascripts/RGraph.pie.js +385 -100
- data/vendor/assets/javascripts/RGraph.radar.js +36 -29
- data/vendor/assets/javascripts/RGraph.rose.js +58 -41
- data/vendor/assets/javascripts/RGraph.rscatter.js +40 -36
- data/vendor/assets/javascripts/RGraph.scatter.js +441 -499
- data/vendor/assets/javascripts/RGraph.semicircularprogress.js +1015 -0
- data/vendor/assets/javascripts/RGraph.thermometer.js +37 -37
- data/vendor/assets/javascripts/RGraph.vprogress.js +285 -157
- data/vendor/assets/javascripts/RGraph.waterfall.js +62 -62
- data/vendor/assets/stylesheets/website.css +30 -16
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZjVkYTI4NTFiZjU0ZTUwZmQ4M2EwMDdlMDU5ZGNjYjA5YzAyMjg5Ng==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
N2NkZGUyOGFkYjI0YWY2ZWNlMTM3YjI3ZmM5MTE4MjJkN2ZiMjRhZg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZDRhMDMwMmUyODg1NTQ4ZDQ5MWNjYWI4MDExOWM1MjFmYWZkNDRkNjdlMzI0
|
10
|
+
Nzc4YjI3MDRhNmEwNTFhN2VlN2IyMmQ4ZmViNzQ2MTJiNzJkZTBmZGExYzYy
|
11
|
+
NGMyN2NkOTFkYzk5MmM2ZjQ0NWZhMGRiZmFiNjBjMGYyOTBlNzY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZDY0M2NhZWMzYmU5NGM1NTllYjZmZmVjMjM1MzlmNGMyZDM0YjE0YmRiNWYz
|
14
|
+
NjJhN2MyM2MwZjI5MmQ4NTA3ODk1Zjk0MzQ0NjU2YTI1NDdkMjJhZmMzZDEy
|
15
|
+
Yjk4OTA3MmY5MTQwMWI1YTMwYTgxMDU1N2EwYTBjNWEzZjI5OGQ=
|
data/.travis.yml
CHANGED
@@ -8,4 +8,5 @@ deploy:
|
|
8
8
|
api_key:
|
9
9
|
secure: afUjE//0Dbsz5hq99BS5MAq4mS5m+ZQws9nsUTUXr9I1UQud0sng4/0KsCZJkmJeGmmagWPAOJ4uZF5gnl0STmnYVRavLYwjIZ8pesTeh+wofGIXwhuE2T3JzGLlX9NADNk0tm67wWMztTOiZUMtWHjrfApahoH3NO8EblwBd0PrwghNIP3bq8xS5X5FOi02Om+SxD3Px/JFiLHePejiLc4T1Uw2rX2fy3buy0XKz08tLZ0tKVs16vASR8AfsiW2vDLdJ655bv0x4JaDROyIRn+hPr+5xt2OO+HLLK/kEfQDINXrsUve7BOW0zxGEUnjIwDMtBgfkUvPG1yz7yVOQvz585TQ7w/pxRCZ0JfLxv+DVaCVwk9EyAKFFo6oM+i1cWThQiaxy0TPyZV8a/ffhuTcbMzdJbTKeTXmGooY2DuDIEmZ4ldVltVkoy+3mzMTnHyLn4t69M2jEw27Frn/gE/lwMIbgPHaXDkFGqQDT8NYqT3P9KzigRPlq6wrmoCpo8wwwCqENk7iwE0JPtrhgQA4UcmJN1bhwpjIv7S8URj2Ltn/NBxDsxPtLCs6EFUgJ2KRAuK7MGGfGQgJmO0yF6n+OvCji+eFcw+FwKBDspAqo8Y4jBBfrvajSt23KUp6kaw41UGdoTzRqdPXA9RMV16aVBBrk7SLXYm19Zl0+1I=
|
10
10
|
on:
|
11
|
+
branch: master
|
11
12
|
tags: true
|
data/README.md
CHANGED
@@ -10,7 +10,7 @@ Use the [rgraph](http://www.rgraph.net/) chart/graph library with the Rails asse
|
|
10
10
|
Include the gem in your application's Gemfile:
|
11
11
|
|
12
12
|
```ruby
|
13
|
-
gem 'rgraph-rails', '~> 1.0'
|
13
|
+
gem 'rgraph-rails', '~> 1.0.5'
|
14
14
|
```
|
15
15
|
|
16
16
|
And then execute:
|
@@ -60,7 +60,7 @@ To install this gem onto your local machine, run `bundle exec rake install`.
|
|
60
60
|
|
61
61
|
## Deployment
|
62
62
|
|
63
|
-
Automatically on tagged release. Reading: https://docs.travis-ci.com/user/deployment/rubygems/
|
63
|
+
Automatically on tagged release to master. Reading: https://docs.travis-ci.com/user/deployment/rubygems/
|
64
64
|
|
65
65
|
## Issues
|
66
66
|
|
data/lib/rgraph-rails/version.rb
CHANGED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -1,4 +1,4 @@
|
|
1
|
-
// version: 2016-
|
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 starts at just
|
10
|
+
* | the terms of the GPL. The commercial license starts at just 99GBP and |
|
11
11
|
* | you can read about it here: |
|
12
12
|
* | |
|
13
13
|
* | http://www.rgraph.net/license |
|
@@ -97,7 +97,7 @@
|
|
97
97
|
'chart.numyticks': 10,
|
98
98
|
'chart.hmargin': 5,
|
99
99
|
'chart.hmargin.grouped': 1,
|
100
|
-
'chart.strokecolor': '
|
100
|
+
'chart.strokecolor': 'rgba(0,0,0,0)',
|
101
101
|
'chart.axis.color': 'black',
|
102
102
|
'chart.axis.linewidth': 1,
|
103
103
|
'chart.gutter.top': 25,
|
@@ -112,6 +112,7 @@
|
|
112
112
|
'chart.labels.above.decimals': 0,
|
113
113
|
'chart.labels.above.size': null,
|
114
114
|
'chart.labels.above.color': null,
|
115
|
+
'chart.labels.above.background':'rgba(0,0,0,0)',
|
115
116
|
'chart.labels.above.angle': null,
|
116
117
|
'chart.labels.above.offset': 4,
|
117
118
|
'chart.labels.above.units.pre': '',
|
@@ -119,13 +120,19 @@
|
|
119
120
|
'chart.ylabels': true,
|
120
121
|
'chart.ylabels.count': 5,
|
121
122
|
'chart.ylabels.inside': false,
|
122
|
-
'chart.
|
123
|
+
'chart.ylabels.offsetx': 0,
|
124
|
+
'chart.ylabels.offsety': 0,
|
125
|
+
'chart.labels.offsetx': 0,
|
126
|
+
'chart.labels.offsety': 0,
|
123
127
|
'chart.xaxispos': 'bottom',
|
124
128
|
'chart.yaxispos': 'left',
|
125
129
|
'chart.text.angle': 0,
|
126
130
|
'chart.text.color': 'black', // Gradients aren't supported for this color
|
127
131
|
'chart.text.size': 12,
|
128
|
-
'chart.text.font': 'Arial',
|
132
|
+
'chart.text.font': 'Segoe UI, Arial, Verdana, sans-serif',
|
133
|
+
'chart.text.accessible': true,
|
134
|
+
'chart.text.accessible.overflow': 'visible',
|
135
|
+
'chart.text.accessible.pointerevents': false,
|
129
136
|
'chart.ymin': 0,
|
130
137
|
'chart.ymax': null,
|
131
138
|
'chart.title': '',
|
@@ -213,6 +220,7 @@
|
|
213
220
|
'chart.scale.point': '.',
|
214
221
|
'chart.scale.thousand': ',',
|
215
222
|
'chart.scale.round': false,
|
223
|
+
'chart.scale.zerostart': true,
|
216
224
|
'chart.crosshairs': false,
|
217
225
|
'chart.crosshairs.color': '#333',
|
218
226
|
'chart.crosshairs.hline': true,
|
@@ -246,7 +254,8 @@
|
|
246
254
|
'chart.errorbars.linewidth': 1,
|
247
255
|
'chart.combinedchart.effect': null,
|
248
256
|
'chart.combinedchart.effect.options': null,
|
249
|
-
'chart.combinedchart.effect.callback': null
|
257
|
+
'chart.combinedchart.effect.callback': null,
|
258
|
+
'chart.clearto': 'rgba(0,0,0,0)'
|
250
259
|
}
|
251
260
|
|
252
261
|
// Check for support
|
@@ -255,6 +264,22 @@
|
|
255
264
|
return;
|
256
265
|
}
|
257
266
|
|
267
|
+
|
268
|
+
//
|
269
|
+
// Convert strings into numbers
|
270
|
+
//
|
271
|
+
for (var i=0; i<data.length; ++i) {
|
272
|
+
if (typeof data[i] === 'string') {
|
273
|
+
data[i] = parseFloat(data[i]);
|
274
|
+
} else if (typeof data[i] === 'object' && data[i]) {
|
275
|
+
for (var j=0; j<data[i].length; ++j) {
|
276
|
+
if (typeof data[i][j] === 'string') {
|
277
|
+
data[i][j] = parseFloat(data[i][j]);
|
278
|
+
}
|
279
|
+
}
|
280
|
+
}
|
281
|
+
}
|
282
|
+
|
258
283
|
/**
|
259
284
|
* Determine whether the chart will contain stacked or grouped bars
|
260
285
|
*/
|
@@ -311,7 +336,6 @@
|
|
311
336
|
ca = this.canvas,
|
312
337
|
co = ca.getContext('2d'),
|
313
338
|
prop = this.properties,
|
314
|
-
pa = RG.Path,
|
315
339
|
pa2 = RG.path2,
|
316
340
|
win = window,
|
317
341
|
doc = document,
|
@@ -368,10 +392,15 @@
|
|
368
392
|
|
369
393
|
|
370
394
|
// Convert uppercase letters to dot+lower case letter
|
371
|
-
name
|
372
|
-
|
373
|
-
|
374
|
-
|
395
|
+
while(name.match(/([A-Z])/)) {
|
396
|
+
name = name.replace(/([A-Z])/, '.' + RegExp.$1.toLowerCase());
|
397
|
+
}
|
398
|
+
|
399
|
+
|
400
|
+
// BC accommodation
|
401
|
+
if (name === 'chart.xlabels.offset') {
|
402
|
+
name = 'chart.labels.offsety';
|
403
|
+
}
|
375
404
|
|
376
405
|
if (name == 'chart.labels.abovebar') {
|
377
406
|
name = 'chart.labels.above';
|
@@ -468,7 +497,11 @@
|
|
468
497
|
// If the chart is 3d then angle it it
|
469
498
|
//
|
470
499
|
if (prop['chart.variant'] === '3d') {
|
471
|
-
|
500
|
+
if (prop['chart.text.accessible']) {
|
501
|
+
// Nada
|
502
|
+
} else {
|
503
|
+
co.setTransform(1,prop['chart.variant.threed.angle'],0,1,0.5,0.5);
|
504
|
+
}
|
472
505
|
}
|
473
506
|
|
474
507
|
|
@@ -535,13 +568,13 @@
|
|
535
568
|
|
536
569
|
|
537
570
|
//If it's a sketch chart variant, draw the axes first
|
538
|
-
if (prop['chart.variant'] == 'sketch') {
|
539
|
-
|
540
|
-
|
541
|
-
} else {
|
542
|
-
this.
|
543
|
-
this.
|
544
|
-
}
|
571
|
+
//if (prop['chart.variant'] == 'sketch') {
|
572
|
+
// this.DrawAxes();
|
573
|
+
// this.Drawbars();
|
574
|
+
//} else {
|
575
|
+
this.drawbars();
|
576
|
+
this.drawAxes();
|
577
|
+
//}
|
545
578
|
|
546
579
|
this.DrawLabels();
|
547
580
|
|
@@ -682,15 +715,25 @@
|
|
682
715
|
co.moveTo(this.gutterLeft - (isSketch ? 3 : 0), this.gutterTop - (isSketch ? 3 : 0));
|
683
716
|
co.lineTo(ca.width - this.gutterRight + (isSketch ? 5 : 0), this.gutterTop + (isSketch ? 2 : 0));
|
684
717
|
} else {
|
685
|
-
co.moveTo(
|
686
|
-
|
718
|
+
co.moveTo(
|
719
|
+
this.gutterLeft - (isSketch ? 5 : 0),
|
720
|
+
ma.round(this.getYCoord(0) - (isSketch ? 2 : 0))
|
721
|
+
);
|
722
|
+
co.lineTo(
|
723
|
+
ca.width - this.gutterRight + (isSketch ? 8 : 0),
|
724
|
+
ma.round(this.getYCoord(0) + (isSketch ? 2 : 0))
|
725
|
+
);
|
726
|
+
|
687
727
|
}
|
688
728
|
}
|
689
729
|
|
690
730
|
var numYTicks = prop['chart.numyticks'];
|
691
731
|
|
692
|
-
//
|
732
|
+
//
|
733
|
+
// DRAW THE Y TICKMARKS
|
734
|
+
//
|
693
735
|
if (prop['chart.noyaxis'] == false && !isSketch) {
|
736
|
+
|
694
737
|
var yTickGap = (ca.height - this.gutterTop - this.gutterBottom) / numYTicks;
|
695
738
|
var xpos = yaxispos == 'left' ? this.gutterLeft : ca.width - this.gutterRight;
|
696
739
|
|
@@ -698,14 +741,27 @@
|
|
698
741
|
for (y=this.gutterTop;
|
699
742
|
xaxispos == 'center' ? y <= (ca.height - this.gutterBottom) : y < (ca.height - this.gutterBottom + (xaxispos == 'top' ? 1 : 0));
|
700
743
|
y += yTickGap) {
|
701
|
-
|
702
|
-
if (xaxispos == 'center' && y == (this.gutterTop + (this.grapharea / 2)))
|
744
|
+
|
745
|
+
if (xaxispos == 'center' && y == (this.gutterTop + (this.grapharea / 2))) {
|
746
|
+
continue;
|
747
|
+
}
|
703
748
|
|
704
749
|
// X axis at the top
|
705
|
-
if (xaxispos == 'top' && y == this.gutterTop)
|
750
|
+
if (xaxispos == 'top' && y == this.gutterTop) {
|
751
|
+
continue;
|
752
|
+
}
|
706
753
|
|
707
|
-
co.moveTo(xpos + (yaxispos == 'left' ? 0 : 0),
|
708
|
-
co.lineTo(xpos + (yaxispos == 'left' ? -3 : 3),
|
754
|
+
co.moveTo(xpos + (yaxispos == 'left' ? 0 : 0), ma.round(y));
|
755
|
+
co.lineTo(xpos + (yaxispos == 'left' ? -3 : 3), ma.round(y));
|
756
|
+
}
|
757
|
+
|
758
|
+
//
|
759
|
+
// If the X axis is offset (ie not at the bottom when xaxispos
|
760
|
+
// is set to bottom) - draw an extra tick
|
761
|
+
//
|
762
|
+
if (xaxispos === 'bottom' && prop['chart.ymin'] !== 0) {
|
763
|
+
co.moveTo(xpos + (yaxispos == 'left' ? 0 : 0), ma.round(ca.height - prop['chart.gutter.bottom']));
|
764
|
+
co.lineTo(xpos + (yaxispos == 'left' ? -3 : 3), ma.round(ca.height - prop['chart.gutter.bottom']));
|
709
765
|
}
|
710
766
|
}
|
711
767
|
|
@@ -737,8 +793,8 @@
|
|
737
793
|
}
|
738
794
|
|
739
795
|
if (xaxispos == 'bottom') {
|
740
|
-
yStart =
|
741
|
-
yEnd =
|
796
|
+
yStart = prop['chart.ymin'] < 0 ? this.getYCoord(0) - 3 : this.getYCoord(0);
|
797
|
+
yEnd = this.getYCoord(0) + 3;
|
742
798
|
} else if (xaxispos == 'top') {
|
743
799
|
yStart = this.gutterTop - 3;
|
744
800
|
yEnd = this.gutterTop;
|
@@ -747,8 +803,8 @@
|
|
747
803
|
yEnd = ((ca.height - this.gutterTop - this.gutterBottom) / 2) + this.gutterTop - 3;
|
748
804
|
}
|
749
805
|
|
750
|
-
yStart = yStart;
|
751
|
-
yEnd
|
806
|
+
//yStart = yStart;
|
807
|
+
//yEnd = yEnd;
|
752
808
|
|
753
809
|
//////////////// X TICKS ////////////////
|
754
810
|
var noEndXTick = prop['chart.noendxtick'];
|
@@ -756,23 +812,23 @@
|
|
756
812
|
for (x=this.gutterLeft + (yaxispos == 'left' ? xTickGap : 0),len=(ca.width - this.gutterRight + (yaxispos == 'left' ? 5 : 0)); x<len; x+=xTickGap) {
|
757
813
|
|
758
814
|
if (yaxispos == 'left' && !noEndXTick && x > this.gutterLeft) {
|
759
|
-
co.moveTo(
|
760
|
-
co.lineTo(
|
815
|
+
co.moveTo(ma.round(x), yStart);
|
816
|
+
co.lineTo(ma.round(x), yEnd);
|
761
817
|
|
762
818
|
} else if (yaxispos == 'left' && noEndXTick && x > this.gutterLeft && x < (ca.width - this.gutterRight) ) {
|
763
|
-
co.moveTo(
|
764
|
-
co.lineTo(
|
819
|
+
co.moveTo(ma.round(x), yStart);
|
820
|
+
co.lineTo(ma.round(x), yEnd);
|
765
821
|
|
766
822
|
} else if (yaxispos == 'right' && x < (ca.width - this.gutterRight) && !noEndXTick) {
|
767
|
-
co.moveTo(
|
768
|
-
co.lineTo(
|
823
|
+
co.moveTo(ma.round(x), yStart);
|
824
|
+
co.lineTo(ma.round(x), yEnd);
|
769
825
|
|
770
826
|
} else if (yaxispos == 'right' && x < (ca.width - this.gutterRight) && x > (this.gutterLeft) && noEndXTick) {
|
771
|
-
co.moveTo(
|
772
|
-
co.lineTo(
|
827
|
+
co.moveTo(ma.round(x), yStart);
|
828
|
+
co.lineTo(ma.round(x), yEnd);
|
773
829
|
}
|
774
830
|
}
|
775
|
-
|
831
|
+
|
776
832
|
if (prop['chart.noyaxis'] || prop['chart.numxticks'] == null) {
|
777
833
|
if (typeof(prop['chart.numxticks']) == 'number' && prop['chart.numxticks'] > 0) {
|
778
834
|
co.moveTo(Math.round(this.gutterLeft), yStart);
|
@@ -788,11 +844,11 @@
|
|
788
844
|
*/
|
789
845
|
if (prop['chart.noyaxis'] && prop['chart.noxaxis'] == false && prop['chart.numxticks'] == null) {
|
790
846
|
if (xaxispos == 'center') {
|
791
|
-
co.moveTo(
|
792
|
-
co.lineTo(
|
847
|
+
co.moveTo(ma.round(this.gutterLeft), (ca.height / 2) - 3);
|
848
|
+
co.lineTo(ma.round(this.gutterLeft), (ca.height / 2) + 3);
|
793
849
|
} else {
|
794
|
-
co.moveTo(
|
795
|
-
co.lineTo(
|
850
|
+
co.moveTo(ma.round(this.gutterLeft), ca.height - this.gutterBottom);
|
851
|
+
co.lineTo(ma.round(this.gutterLeft), ca.height - this.gutterBottom + 3);
|
796
852
|
}
|
797
853
|
}
|
798
854
|
|
@@ -956,34 +1012,51 @@
|
|
956
1012
|
strokeStyle = prop['chart.strokecolor'],
|
957
1013
|
colors = prop['chart.colors'],
|
958
1014
|
sequentialColorIndex = 0
|
1015
|
+
|
1016
|
+
var height;
|
959
1017
|
|
960
1018
|
for (i=0,len=this.data.length; i<len; i+=1) {
|
961
1019
|
|
1020
|
+
|
1021
|
+
|
1022
|
+
|
1023
|
+
|
962
1024
|
// Work out the height
|
963
1025
|
//The width is up outside the loop
|
964
|
-
|
965
|
-
|
966
|
-
|
967
|
-
|
968
|
-
height /= 2;
|
1026
|
+
if (RG.arraySum(this.data[i]) < 0) {
|
1027
|
+
var height = (RG.arraySum(this.data[i]) + this.scale2.min) / (this.scale2.max - this.scale2.min);
|
1028
|
+
} else {
|
1029
|
+
var height = (RG.arraySum(this.data[i]) - this.scale2.min) / (this.scale2.max - this.scale2.min);
|
969
1030
|
}
|
1031
|
+
|
1032
|
+
height *= ma.abs(this.getYCoord(this.scale2.max) - this.getYCoord(this.scale2.min));
|
1033
|
+
|
1034
|
+
|
1035
|
+
|
1036
|
+
|
1037
|
+
|
970
1038
|
|
971
1039
|
var x = (i * width) + this.gutterLeft;
|
972
1040
|
var y = xaxispos == 'center' ? ((ca.height - this.gutterTop - this.gutterBottom) / 2) + this.gutterTop - height
|
973
1041
|
: ca.height - height - this.gutterBottom;
|
974
|
-
|
1042
|
+
|
975
1043
|
// xaxispos is top
|
976
1044
|
if (xaxispos == 'top') {
|
977
|
-
y = this.gutterTop +
|
1045
|
+
y = this.gutterTop + ma.abs(height);
|
978
1046
|
}
|
979
1047
|
|
980
1048
|
|
981
|
-
// Account for negative lengths - Some browsers
|
1049
|
+
// Account for negative lengths - Some browsers don't like a negative value
|
982
1050
|
if (height < 0) {
|
983
1051
|
y += height;
|
984
|
-
height =
|
1052
|
+
height = ma.abs(height);
|
985
1053
|
}
|
986
|
-
|
1054
|
+
|
1055
|
+
|
1056
|
+
|
1057
|
+
|
1058
|
+
|
1059
|
+
|
987
1060
|
/**
|
988
1061
|
* Turn on the shadow if need be
|
989
1062
|
*/
|
@@ -1000,6 +1073,17 @@
|
|
1000
1073
|
co.beginPath();
|
1001
1074
|
if (typeof this.data[i] == 'number') {
|
1002
1075
|
|
1076
|
+
|
1077
|
+
// If the Y axis is offset change the bar start (the top of the bar)
|
1078
|
+
if (xaxispos === 'bottom' && prop['chart.ymin'] < 0) {
|
1079
|
+
if (this.data[i] >= 0) {
|
1080
|
+
height = ma.abs(this.getYCoord(0) - this.getYCoord(this.data[i]));
|
1081
|
+
} else {
|
1082
|
+
y = this.getYCoord(0);
|
1083
|
+
height = ma.abs(this.getYCoord(0) - this.getYCoord(this.data[i]));
|
1084
|
+
}
|
1085
|
+
}
|
1086
|
+
|
1003
1087
|
var barWidth = width - (2 * hmargin);
|
1004
1088
|
|
1005
1089
|
/**
|
@@ -1093,7 +1177,7 @@
|
|
1093
1177
|
|
1094
1178
|
// 3D effect
|
1095
1179
|
if (variant == '3d') {
|
1096
|
-
|
1180
|
+
|
1097
1181
|
var prevStrokeStyle = co.strokeStyle;
|
1098
1182
|
var prevFillStyle = co.fillStyle;
|
1099
1183
|
|
@@ -1115,15 +1199,29 @@
|
|
1115
1199
|
co.moveTo(x + hmargin + barWidth, y);
|
1116
1200
|
co.lineTo(
|
1117
1201
|
x + hmargin + barWidth + prop['chart.variant.threed.offsetx'],
|
1118
|
-
this.data[i] < 0 && xaxispos === 'bottom' ?
|
1202
|
+
this.data[i] < 0 && xaxispos === 'bottom' ?
|
1203
|
+
this.getYCoord(0) : (
|
1204
|
+
this.data[i] < 0 && (y - prop['chart.variant.threed.offsety'])
|
1205
|
+
< (this.gutterTop + this.halfgrapharea)
|
1206
|
+
|
1207
|
+
?
|
1208
|
+
|
1209
|
+
(this.gutterTop + this.halfgrapharea)
|
1210
|
+
|
1211
|
+
: (y - prop['chart.variant.threed.offsety']))
|
1119
1212
|
);
|
1120
1213
|
|
1121
|
-
|
1122
|
-
|
1123
|
-
|
1124
|
-
|
1125
|
-
|
1126
|
-
|
1214
|
+
co.lineTo(
|
1215
|
+
x + hmargin + barWidth + prop['chart.variant.threed.offsetx'],
|
1216
|
+
|
1217
|
+
|
1218
|
+
this.data[i] < 0 && (y - prop['chart.variant.threed.offsety'] + height) < (this.gutterTop + this.getYCoord(0))
|
1219
|
+
? this.getYCoord(this.data[i]) - prop['chart.variant.threed.offsety']
|
1220
|
+
: (this.data[i] > 0 ?
|
1221
|
+
y - prop['chart.variant.threed.offsety'] + height :
|
1222
|
+
ma.min(y - prop['chart.variant.threed.offsety'] + height, ca.height - this.gutterBottom)
|
1223
|
+
)
|
1224
|
+
);
|
1127
1225
|
co.lineTo(x + hmargin + barWidth, y + height);
|
1128
1226
|
co.closePath();
|
1129
1227
|
co.stroke();
|
@@ -1133,38 +1231,40 @@
|
|
1133
1231
|
|
1134
1232
|
|
1135
1233
|
// Draw the lighter top section
|
1136
|
-
|
1137
|
-
co.
|
1138
|
-
|
1139
|
-
|
1140
|
-
|
1141
|
-
|
1142
|
-
|
1143
|
-
|
1144
|
-
|
1145
|
-
|
1146
|
-
|
1234
|
+
if (this.data[i] > 0) {
|
1235
|
+
co.beginPath();
|
1236
|
+
co.fillStyle = 'rgba(255,255,255,0.5)';
|
1237
|
+
co.moveTo(x + hmargin, y);
|
1238
|
+
co.lineTo(x + hmargin + prop['chart.variant.threed.offsetx'], y - prop['chart.variant.threed.offsety']);
|
1239
|
+
co.lineTo(x + hmargin + prop['chart.variant.threed.offsetx'] + barWidth, y - prop['chart.variant.threed.offsety']);
|
1240
|
+
co.lineTo(x + hmargin + barWidth, y);
|
1241
|
+
co.lineTo(x + hmargin, y);
|
1242
|
+
co.closePath();
|
1243
|
+
co.stroke();
|
1244
|
+
co.fill();
|
1245
|
+
}
|
1147
1246
|
|
1148
1247
|
|
1149
1248
|
|
1249
|
+
|
1150
1250
|
// Draw the darker right side section
|
1151
1251
|
co.beginPath();
|
1152
1252
|
co.fillStyle = 'rgba(0,0,0,0.4)';
|
1153
1253
|
// TL
|
1154
1254
|
co.moveTo(x + hmargin + barWidth, y);
|
1155
|
-
|
1255
|
+
|
1156
1256
|
// TR
|
1157
1257
|
co.lineTo(
|
1158
1258
|
x + hmargin + barWidth + prop['chart.variant.threed.offsetx'],
|
1159
|
-
this.data[i] < 0 && xaxispos === 'bottom' ?
|
1259
|
+
this.data[i] < 0 && xaxispos === 'bottom' ? this.getYCoord(0) : (this.data[i] < 0 && (y - prop['chart.variant.threed.offsety']) < (this.gutterTop + this.halfgrapharea) ? (this.gutterTop + this.halfgrapharea) : y - prop['chart.variant.threed.offsety'])
|
1160
1260
|
);
|
1161
1261
|
|
1162
1262
|
// BR
|
1163
1263
|
co.lineTo(
|
1164
1264
|
x + hmargin + barWidth + prop['chart.variant.threed.offsetx'],
|
1165
1265
|
|
1166
|
-
this.data[i] < 0 && (y - prop['chart.variant.threed.offsety'] + height) <
|
1167
|
-
?
|
1266
|
+
this.data[i] < 0 && (y - prop['chart.variant.threed.offsety'] + height) < this.getYCoord(0)
|
1267
|
+
? this.getYCoord(0)
|
1168
1268
|
: this.data[i] > 0 ? y - prop['chart.variant.threed.offsety'] + height : ma.min(y - prop['chart.variant.threed.offsety'] + height, ca.height - this.gutterBottom)
|
1169
1269
|
);
|
1170
1270
|
// BL
|
@@ -1465,15 +1565,13 @@
|
|
1465
1565
|
var startY = this.gutterTop + (this.grapharea / 2) - height;
|
1466
1566
|
|
1467
1567
|
} else {
|
1468
|
-
var startY = ca.height - this.gutterBottom - height;
|
1469
|
-
var height =
|
1470
|
-
|
1471
|
-
|
1472
|
-
|
1473
|
-
|
1474
|
-
|
1475
|
-
if (RGraph.ISOLD && shadow) {
|
1476
|
-
this.DrawIEShadow([startX, startY, individualBarWidth, height]);
|
1568
|
+
var startY = this.getYCoord(0);//ca.height - this.gutterBottom - height;
|
1569
|
+
var height = ma.abs(ma.abs(this.getYCoord(this.data[i][j])) - this.getYCoord(0));
|
1570
|
+
|
1571
|
+
if (this.data[i][j] >= 0) {
|
1572
|
+
startY -= height;
|
1573
|
+
}
|
1574
|
+
|
1477
1575
|
}
|
1478
1576
|
|
1479
1577
|
co.strokeRect(startX + groupedMargin, startY, individualBarWidth - (2 * groupedMargin), height);
|
@@ -1486,6 +1584,7 @@
|
|
1486
1584
|
* Grouped 3D effect
|
1487
1585
|
*/
|
1488
1586
|
if (variant == '3d') {
|
1587
|
+
|
1489
1588
|
var prevFillStyle = co.fillStyle;
|
1490
1589
|
var prevStrokeStyle = co.strokeStyle;
|
1491
1590
|
var hmarginGrouped = prop['chart.hmargin.grouped'];
|
@@ -1508,8 +1607,9 @@
|
|
1508
1607
|
co.moveTo(startX + individualBarWidth - hmarginGrouped - 1, startY);
|
1509
1608
|
co.lineTo(
|
1510
1609
|
startX + individualBarWidth - hmarginGrouped + prop['chart.variant.threed.offsetx'],
|
1511
|
-
this.data[i][j] < 0
|
1610
|
+
this.data[i][j] < 0 ? (this.getYCoord(0) + ma.abs(height) - prop['chart.variant.threed.offsety']) : this.getYCoord(0) - height - prop['chart.variant.threed.offsety']
|
1512
1611
|
);
|
1612
|
+
|
1513
1613
|
co.lineTo(
|
1514
1614
|
startX + individualBarWidth - hmarginGrouped + prop['chart.variant.threed.offsetx'],
|
1515
1615
|
this.data[i][j] < 0 && (startY + height - prop['chart.variant.threed.offsety']) < (this.gutterTop + this.halfgrapharea) ? (this.gutterTop + this.halfgrapharea) : (startY + height - prop['chart.variant.threed.offsety'])
|
@@ -1544,14 +1644,23 @@
|
|
1544
1644
|
// Draw the darker side section
|
1545
1645
|
co.fillStyle = 'rgba(0,0,0,0.4)';
|
1546
1646
|
co.beginPath();
|
1547
|
-
//
|
1548
|
-
co.moveTo(
|
1647
|
+
// TL corner
|
1648
|
+
co.moveTo(
|
1649
|
+
startX + individualBarWidth - hmarginGrouped,
|
1650
|
+
startY
|
1651
|
+
);
|
1549
1652
|
|
1550
|
-
|
1551
|
-
co.lineTo(
|
1653
|
+
|
1654
|
+
co.lineTo(
|
1655
|
+
startX + individualBarWidth + prop['chart.variant.threed.offsetx'] - hmarginGrouped,
|
1656
|
+
this.data[i][j] < 0 ? (this.getYCoord(0) + ma.abs(height) - prop['chart.variant.threed.offsety']) : this.getYCoord(0) - height - prop['chart.variant.threed.offsety']
|
1657
|
+
);
|
1552
1658
|
|
1553
1659
|
// TR corner
|
1554
|
-
co.lineTo(
|
1660
|
+
co.lineTo(
|
1661
|
+
startX + individualBarWidth + prop['chart.variant.threed.offsetx'] - hmarginGrouped,
|
1662
|
+
this.data[i][j] < 0 && (startY + height - 5) < (this.gutterTop + this.halfgrapharea) ? (this.gutterTop + this.halfgrapharea) : (startY + height - prop['chart.variant.threed.offsety'])
|
1663
|
+
);
|
1555
1664
|
|
1556
1665
|
// TL corner
|
1557
1666
|
co.lineTo(startX + individualBarWidth - hmarginGrouped, startY + height);
|
@@ -1617,11 +1726,20 @@
|
|
1617
1726
|
|
1618
1727
|
co.closePath();
|
1619
1728
|
}
|
1620
|
-
|
1729
|
+
|
1730
|
+
// If 3D, redraw the right hand Y axis
|
1731
|
+
if (prop['chart.variant'] === '3d' && prop['chart.yaxispos'] === 'right') {
|
1732
|
+
RG.draw3DYAxis(this);
|
1733
|
+
}
|
1734
|
+
|
1735
|
+
|
1736
|
+
|
1737
|
+
|
1738
|
+
|
1621
1739
|
/**
|
1622
1740
|
* Turn off any shadow
|
1623
1741
|
*/
|
1624
|
-
RGraph.
|
1742
|
+
RGraph.noShadow(this);
|
1625
1743
|
};
|
1626
1744
|
|
1627
1745
|
|
@@ -1652,7 +1770,8 @@
|
|
1652
1770
|
*/
|
1653
1771
|
if (typeof(labels) == 'object' && labels) {
|
1654
1772
|
|
1655
|
-
var yOffset = Number(prop['chart.
|
1773
|
+
var yOffset = Number(prop['chart.labels.offsety']),
|
1774
|
+
xOffset = Number(prop['chart.labels.offsetx']),
|
1656
1775
|
bold = prop['chart.labels.bold']
|
1657
1776
|
|
1658
1777
|
/**
|
@@ -1683,11 +1802,11 @@
|
|
1683
1802
|
|
1684
1803
|
for (x=this.gutterLeft + (xTickGap / 2); x<=ca.width - this.gutterRight; x+=xTickGap) {
|
1685
1804
|
|
1686
|
-
|
1805
|
+
RG.text2(this, {
|
1687
1806
|
'font': font,
|
1688
1807
|
'size': text_size,
|
1689
|
-
'x': x,
|
1690
|
-
'y': prop['chart.xaxispos'] == 'top' ? this.gutterTop
|
1808
|
+
'x': x + xOffset,
|
1809
|
+
'y': prop['chart.xaxispos'] == 'top' ? this.gutterTop + yOffset - 5: (ca.height - this.gutterBottom) + yOffset + 3,
|
1691
1810
|
'bold': bold,
|
1692
1811
|
'text': String(labels[i++]),
|
1693
1812
|
'valign': prop['chart.xaxispos'] == 'top' ? 'bottom' : valign,
|
@@ -1732,6 +1851,8 @@
|
|
1732
1851
|
var font = prop['chart.text.font'];
|
1733
1852
|
var numYLabels = prop['chart.ylabels.count'];
|
1734
1853
|
var ymin = prop['chart.ymin'];
|
1854
|
+
var offsetx = prop['chart.ylabels.offsetx'];
|
1855
|
+
var offsety = prop['chart.ylabels.offsety'];
|
1735
1856
|
|
1736
1857
|
if (prop['chart.ylabels.inside'] == true) {
|
1737
1858
|
var xpos = prop['chart.yaxispos'] == 'left' ? this.gutterLeft + 5 : ca.width - this.gutterRight - 5;
|
@@ -1753,17 +1874,18 @@
|
|
1753
1874
|
for (var i=0; i<labels.length; ++i) {
|
1754
1875
|
|
1755
1876
|
var y = this.gutterTop + (grapharea * (i / labels.length)) + (grapharea / labels.length);
|
1756
|
-
|
1757
|
-
|
1758
|
-
|
1759
|
-
|
1760
|
-
|
1761
|
-
|
1762
|
-
|
1763
|
-
|
1764
|
-
|
1765
|
-
|
1766
|
-
|
1877
|
+
|
1878
|
+
RG.text2(this, {
|
1879
|
+
'font': font,
|
1880
|
+
'size': text_size,
|
1881
|
+
'x': xpos + offsetx,
|
1882
|
+
'y': y + offsety,
|
1883
|
+
'text': String(labels[i]),
|
1884
|
+
'valign': 'center',
|
1885
|
+
'halign': align,
|
1886
|
+
'bordered':boxed,
|
1887
|
+
'tag': 'scale'
|
1888
|
+
});
|
1767
1889
|
}
|
1768
1890
|
|
1769
1891
|
return;
|
@@ -1780,15 +1902,17 @@
|
|
1780
1902
|
*/
|
1781
1903
|
var labels = this.scale2.labels;
|
1782
1904
|
for (var i=0; i<labels.length; ++i) {
|
1783
|
-
RGraph.Text2(this, {
|
1784
|
-
|
1785
|
-
|
1786
|
-
|
1787
|
-
|
1788
|
-
|
1789
|
-
|
1790
|
-
|
1791
|
-
|
1905
|
+
RGraph.Text2(this, {
|
1906
|
+
'font': font,
|
1907
|
+
'size':text_size,
|
1908
|
+
'x':xpos + offsetx,
|
1909
|
+
'y':this.gutterTop + ((this.grapharea / labels.length) * (i + 1)) + offsety,
|
1910
|
+
'text': '-' + labels[i],
|
1911
|
+
'valign': 'center',
|
1912
|
+
'halign': align,
|
1913
|
+
'bordered': boxed,
|
1914
|
+
'tag':'scale'
|
1915
|
+
});
|
1792
1916
|
}
|
1793
1917
|
|
1794
1918
|
|
@@ -1803,15 +1927,17 @@
|
|
1803
1927
|
*/
|
1804
1928
|
if (prop['chart.ymin'] != 0 || prop['chart.noxaxis'] || prop['chart.scale.zerostart']) {
|
1805
1929
|
|
1806
|
-
RGraph.Text2(this, {
|
1807
|
-
|
1808
|
-
|
1809
|
-
|
1810
|
-
|
1811
|
-
|
1812
|
-
|
1813
|
-
|
1814
|
-
|
1930
|
+
RGraph.Text2(this, {
|
1931
|
+
'font': font,
|
1932
|
+
'size': text_size,
|
1933
|
+
'x': xpos + offsetx,
|
1934
|
+
'y': this.gutterTop + offsety,
|
1935
|
+
'text': (this.scale2.min != 0 ? '-' : '') + RGraph.number_format(this,(this.scale2.min.toFixed((prop['chart.scale.decimals']))), units_pre, units_post),
|
1936
|
+
'valign': 'center',
|
1937
|
+
'halign': align,
|
1938
|
+
'bordered': boxed,
|
1939
|
+
'tag': 'scale'
|
1940
|
+
});
|
1815
1941
|
}
|
1816
1942
|
|
1817
1943
|
}
|
@@ -1849,6 +1975,8 @@
|
|
1849
1975
|
var xpos = 0;
|
1850
1976
|
var boxed = false;
|
1851
1977
|
var ymin = prop['chart.ymin'];
|
1978
|
+
var offsetx = prop['chart.ylabels.offsetx'];
|
1979
|
+
var offsety = prop['chart.ylabels.offsety'];
|
1852
1980
|
|
1853
1981
|
co.fillStyle = prop['chart.text.color'];
|
1854
1982
|
co.strokeStyle = 'black';
|
@@ -1887,16 +2015,17 @@
|
|
1887
2015
|
|
1888
2016
|
var y = this.gutterTop + ((grapharea / 2) / (labels.length - 1)) * i;
|
1889
2017
|
|
1890
|
-
RGraph.Text2(this, {
|
1891
|
-
|
1892
|
-
|
1893
|
-
|
1894
|
-
|
1895
|
-
|
1896
|
-
|
1897
|
-
|
1898
|
-
|
1899
|
-
|
2018
|
+
RGraph.Text2(this, {
|
2019
|
+
'font':font,
|
2020
|
+
'size':text_size,
|
2021
|
+
'x':xpos + offsetx,
|
2022
|
+
'y':y + offsety,
|
2023
|
+
'text':String(labels[i]),
|
2024
|
+
'valign':'center',
|
2025
|
+
'halign':align,
|
2026
|
+
'bordered':boxed,
|
2027
|
+
'tag': 'scale'
|
2028
|
+
});
|
1900
2029
|
}
|
1901
2030
|
|
1902
2031
|
// Draw the bottom halves labels
|
@@ -1904,16 +2033,17 @@
|
|
1904
2033
|
|
1905
2034
|
var y = this.gutterTop + (grapharea * (i / ((labels.length - 1) * 2) )) + (grapharea / 2);
|
1906
2035
|
|
1907
|
-
RG.Text2(this, {
|
1908
|
-
|
1909
|
-
|
1910
|
-
|
1911
|
-
|
1912
|
-
|
1913
|
-
|
1914
|
-
|
1915
|
-
|
1916
|
-
|
2036
|
+
RG.Text2(this, {
|
2037
|
+
'font':font,
|
2038
|
+
'size':text_size,
|
2039
|
+
'x':xpos + offsetx,
|
2040
|
+
'y':y + offsety,
|
2041
|
+
'text':String(labels[labels.length - i - 1]),
|
2042
|
+
'valign':'center',
|
2043
|
+
'halign':align,
|
2044
|
+
'bordered':boxed,
|
2045
|
+
'tag': 'scale'
|
2046
|
+
});
|
1917
2047
|
}
|
1918
2048
|
|
1919
2049
|
return;
|
@@ -1934,7 +2064,19 @@
|
|
1934
2064
|
for (var i=0; i<this.scale2.labels.length; ++i) {
|
1935
2065
|
var y = this.gutterTop + this.halfgrapharea - ((this.halfgrapharea / numYLabels) * (i + 1));
|
1936
2066
|
var text = this.scale2.labels[i];
|
1937
|
-
RG.Text2(this, {
|
2067
|
+
RG.Text2(this, {
|
2068
|
+
'font':font,
|
2069
|
+
'size':text_size,
|
2070
|
+
'x':xpos + offsetx,
|
2071
|
+
'y':y + offsety,
|
2072
|
+
'text':
|
2073
|
+
text,
|
2074
|
+
'valign':
|
2075
|
+
'center',
|
2076
|
+
'halign': align,
|
2077
|
+
'bordered': boxed,
|
2078
|
+
'tag':'scale'
|
2079
|
+
});
|
1938
2080
|
}
|
1939
2081
|
|
1940
2082
|
/**
|
@@ -1943,7 +2085,17 @@
|
|
1943
2085
|
for (var i=(this.scale2.labels.length - 1); i>=0; --i) {
|
1944
2086
|
var y = this.gutterTop + ((this.halfgrapharea / numYLabels) * (i + 1)) + this.halfgrapharea;
|
1945
2087
|
var text = this.scale2.labels[i];
|
1946
|
-
RG.Text2(this, {
|
2088
|
+
RG.Text2(this, {
|
2089
|
+
'font':font,
|
2090
|
+
'size':text_size,
|
2091
|
+
'x':xpos + offsetx,
|
2092
|
+
'y':y + offsety,
|
2093
|
+
'text': '-' + text,
|
2094
|
+
'valign':'center',
|
2095
|
+
'halign': align,
|
2096
|
+
'bordered': boxed,
|
2097
|
+
'tag':'scale'
|
2098
|
+
});
|
1947
2099
|
}
|
1948
2100
|
|
1949
2101
|
|
@@ -1954,7 +2106,18 @@
|
|
1954
2106
|
* Show the minimum value if its not zero
|
1955
2107
|
*/
|
1956
2108
|
if (this.scale2.min != 0 || prop['chart.scale.zerostart']) {
|
1957
|
-
RG.Text2(this, {
|
2109
|
+
RG.Text2(this, {
|
2110
|
+
'font':font,
|
2111
|
+
'size':text_size,
|
2112
|
+
'x':xpos + offsetx,
|
2113
|
+
'y':this.gutterTop + this.halfgrapharea + offsety,
|
2114
|
+
'text': RG.number_format(this,(this.scale2.min.toFixed((prop['chart.scale.decimals']))), units_pre, units_post),
|
2115
|
+
'valign':'center',
|
2116
|
+
'valign':'center',
|
2117
|
+
'halign': align,
|
2118
|
+
'bordered': boxed,
|
2119
|
+
'tag':'scale'
|
2120
|
+
});
|
1958
2121
|
}
|
1959
2122
|
}
|
1960
2123
|
};
|
@@ -1975,7 +2138,9 @@
|
|
1975
2138
|
align = prop['chart.yaxispos'] == 'left' ? 'right' : 'left',
|
1976
2139
|
font = prop['chart.text.font'],
|
1977
2140
|
numYLabels = prop['chart.ylabels.count'],
|
1978
|
-
ymin = prop['chart.ymin']
|
2141
|
+
ymin = prop['chart.ymin'],
|
2142
|
+
offsetx = prop['chart.ylabels.offsetx'],
|
2143
|
+
offsety = prop['chart.ylabels.offsety']
|
1979
2144
|
|
1980
2145
|
co.beginPath();
|
1981
2146
|
|
@@ -2002,16 +2167,17 @@
|
|
2002
2167
|
for (var i=0; i<labels.length; ++i) {
|
2003
2168
|
var y = this.gutterTop + (grapharea * (i / (labels.length - 1)));
|
2004
2169
|
|
2005
|
-
RGraph.Text2(this, {
|
2006
|
-
|
2007
|
-
|
2008
|
-
|
2009
|
-
|
2010
|
-
|
2011
|
-
|
2012
|
-
|
2013
|
-
|
2014
|
-
|
2170
|
+
RGraph.Text2(this, {
|
2171
|
+
'font':font,
|
2172
|
+
'size':text_size,
|
2173
|
+
'x':xpos + offsetx,
|
2174
|
+
'y':y + offsety,
|
2175
|
+
'text': labels[i],
|
2176
|
+
'valign':'center',
|
2177
|
+
'halign': align,
|
2178
|
+
'bordered': boxed,
|
2179
|
+
'tag':'scale'
|
2180
|
+
});
|
2015
2181
|
}
|
2016
2182
|
|
2017
2183
|
return;
|
@@ -2024,15 +2190,17 @@
|
|
2024
2190
|
|
2025
2191
|
for (var i=0; i<numYLabels; ++i) {
|
2026
2192
|
var text = this.scale2.labels[i];
|
2027
|
-
RGraph.Text2(this, {
|
2028
|
-
|
2029
|
-
|
2030
|
-
|
2031
|
-
|
2032
|
-
|
2033
|
-
|
2034
|
-
|
2035
|
-
|
2193
|
+
RGraph.Text2(this, {
|
2194
|
+
'font':font,
|
2195
|
+
'size':text_size,
|
2196
|
+
'x':xpos + offsetx,
|
2197
|
+
'y':this.gutterTop + this.grapharea - ((this.grapharea / numYLabels) * (i+1)) + offsety,
|
2198
|
+
'text': text,
|
2199
|
+
'valign':'center',
|
2200
|
+
'halign': align,
|
2201
|
+
'bordered': boxed,
|
2202
|
+
'tag':'scale'
|
2203
|
+
});
|
2036
2204
|
}
|
2037
2205
|
|
2038
2206
|
|
@@ -2040,15 +2208,17 @@
|
|
2040
2208
|
* Show the minimum value if its not zero
|
2041
2209
|
*/
|
2042
2210
|
if (prop['chart.ymin'] != 0 || prop['chart.noxaxis'] || prop['chart.scale.zerostart']) {
|
2043
|
-
RG.Text2(this, {
|
2044
|
-
|
2045
|
-
|
2046
|
-
|
2047
|
-
|
2048
|
-
|
2049
|
-
|
2050
|
-
|
2051
|
-
|
2211
|
+
RG.Text2(this, {
|
2212
|
+
'font':font,
|
2213
|
+
'size':text_size,
|
2214
|
+
'x':xpos + offsetx,
|
2215
|
+
'y':ca.height - this.gutterBottom + offsety,
|
2216
|
+
'text': RG.number_format(this,(this.scale2.min.toFixed((prop['chart.scale.decimals']))), units_pre, units_post),
|
2217
|
+
'valign':'center',
|
2218
|
+
'halign': align,
|
2219
|
+
'bordered': boxed,
|
2220
|
+
'tag':'scale'
|
2221
|
+
});
|
2052
2222
|
}
|
2053
2223
|
|
2054
2224
|
co.fill();
|
@@ -2127,9 +2297,21 @@
|
|
2127
2297
|
// Recreate the path/rectangle so that it can be tested
|
2128
2298
|
// ** DO NOT STROKE OR FILL IT **
|
2129
2299
|
if (prop['chart.tooltips.hotspot.xonly']) {
|
2130
|
-
|
2300
|
+
pa2(co,
|
2301
|
+
'b r % % % %',
|
2302
|
+
left,
|
2303
|
+
this.gutterTop,
|
2304
|
+
width,
|
2305
|
+
ca.height - this.gutterBottom
|
2306
|
+
);
|
2131
2307
|
} else {
|
2132
|
-
|
2308
|
+
pa2(co,
|
2309
|
+
'b r % % % %',
|
2310
|
+
left,
|
2311
|
+
top,
|
2312
|
+
width,
|
2313
|
+
height
|
2314
|
+
);
|
2133
2315
|
}
|
2134
2316
|
|
2135
2317
|
if (co.isPointInPath(mouseX, mouseY)) {
|
@@ -2294,6 +2476,7 @@
|
|
2294
2476
|
*/
|
2295
2477
|
this.getYCoord = function (value)
|
2296
2478
|
{
|
2479
|
+
|
2297
2480
|
if (value > this.scale2.max) {
|
2298
2481
|
return null;
|
2299
2482
|
}
|
@@ -2302,14 +2485,13 @@
|
|
2302
2485
|
ca = this.canvas,
|
2303
2486
|
prop = this.properties;
|
2304
2487
|
|
2305
|
-
var y;
|
2306
|
-
var xaxispos = prop['chart.xaxispos'];
|
2488
|
+
var y, xaxispos = prop['chart.xaxispos'];
|
2307
2489
|
|
2308
2490
|
if (xaxispos == 'top') {
|
2309
2491
|
|
2310
2492
|
// Account for negative numbers
|
2311
2493
|
if (value < 0) {
|
2312
|
-
value =
|
2494
|
+
value = ma.abs(value);
|
2313
2495
|
}
|
2314
2496
|
|
2315
2497
|
y = ((value - this.scale2.min) / (this.scale2.max - this.scale2.min)) * this.grapharea;
|
@@ -2322,16 +2504,17 @@
|
|
2322
2504
|
y += this.gutterTop;
|
2323
2505
|
|
2324
2506
|
} else {
|
2325
|
-
|
2507
|
+
|
2326
2508
|
if (value < this.scale2.min) {
|
2327
2509
|
value = this.scale2.min;
|
2328
2510
|
}
|
2329
|
-
|
2330
|
-
y
|
2511
|
+
|
2512
|
+
y = ((value - this.scale2.min) / (this.scale2.max - this.scale2.min));
|
2513
|
+
y *= (ca.height - this.gutterTop - this.gutterBottom);
|
2331
2514
|
|
2332
2515
|
y = ca.height - this.gutterBottom - y;
|
2333
2516
|
}
|
2334
|
-
|
2517
|
+
|
2335
2518
|
return y;
|
2336
2519
|
};
|
2337
2520
|
|
@@ -2345,8 +2528,12 @@
|
|
2345
2528
|
this.highlight =
|
2346
2529
|
this.Highlight = function (shape)
|
2347
2530
|
{
|
2348
|
-
|
2349
|
-
|
2531
|
+
if (typeof prop['chart.highlight.style'] === 'function') {
|
2532
|
+
(prop['chart.highlight.style'])(shape);
|
2533
|
+
} else {
|
2534
|
+
// Add the new highlight
|
2535
|
+
RG.Highlight.Rect(this, shape);
|
2536
|
+
}
|
2350
2537
|
};
|
2351
2538
|
|
2352
2539
|
|
@@ -2447,25 +2634,19 @@
|
|
2447
2634
|
width = tooltip.offsetWidth,
|
2448
2635
|
height = tooltip.offsetHeight,
|
2449
2636
|
value = obj.data_arr[tooltip.__index__]
|
2450
|
-
|
2451
2637
|
|
2452
|
-
// If the chart is a 3D version the tooltip Y position needs this
|
2453
|
-
// adjustment
|
2454
|
-
if (prop['chart.variant'] === '3d' && mouseXY) {
|
2455
|
-
var adjustment = (prop['chart.variant.threed.angle'] * mouseXY[0]);
|
2456
|
-
}
|
2457
2638
|
|
2458
2639
|
|
2459
2640
|
// Set the top position
|
2460
2641
|
tooltip.style.left = 0;
|
2461
|
-
tooltip.style.top =
|
2462
|
-
|
2642
|
+
tooltip.style.top = window.event.pageY - height - 5 + 'px';
|
2643
|
+
|
2463
2644
|
/**
|
2464
2645
|
* If the tooltip is for a negative value - position it underneath the bar
|
2465
2646
|
*/
|
2466
|
-
if (value < 0) {
|
2467
|
-
tooltip.style.top = canvasXY[1] + coordY + coordH
|
2468
|
-
}
|
2647
|
+
//if (value < 0) {
|
2648
|
+
//tooltip.style.top = canvasXY[1] + coordY + coordH + 'px';
|
2649
|
+
//}
|
2469
2650
|
|
2470
2651
|
|
2471
2652
|
// By default any overflow is hidden
|
@@ -2475,35 +2656,37 @@
|
|
2475
2656
|
// data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAFCAMAAACkeOZkAAAAK3RFWHRDcmVhdGlvbiBUaW1lAFNhdCA2IE9jdCAyMDEyIDEyOjQ5OjMyIC0wMDAw2S1RlgAAAAd0SU1FB9wKBgszM4Ed2k4AAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAEZ0FNQQAAsY8L/GEFAAAACVBMVEX/AAC9vb3//+92Pom0AAAAAXRSTlMAQObYZgAAAB1JREFUeNpjYAABRgY4YGRiRDCZYBwQE8qBMEEcAANCACqByy1sAAAAAElFTkSuQmCC
|
2476
2657
|
|
2477
2658
|
// The arrow
|
2478
|
-
var img = new Image();
|
2479
|
-
|
2480
|
-
|
2481
|
-
|
2482
|
-
|
2483
|
-
|
2484
|
-
|
2485
|
-
|
2486
|
-
|
2487
|
-
|
2488
|
-
|
2489
|
-
|
2659
|
+
//var img = new Image();
|
2660
|
+
// img.style.position = 'absolute';
|
2661
|
+
// img.id = '__rgraph_tooltip_pointer__';
|
2662
|
+
// if (value >= 0) {
|
2663
|
+
// //img.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAICAYAAAAm06XyAAAARUlEQVQYV2P8///TfwYyASNIHzkGMDLyMYI1k2oASCNID1wzsQbANGJoJmQAskasmnEZgK4Rp2Z0A7BpxKsZZgAujSB5AB8hH/j9emSYAAAAAElFTkSuQmCC';
|
2664
|
+
// img.src = '/images/tooltips-pointer-large.png?jkl';
|
2665
|
+
// img.style.top = tooltip.offsetHeight + 'px';
|
2666
|
+
// } else {
|
2667
|
+
// img.src = '/images/tooltips-pointer-large.png?jkl';
|
2668
|
+
// //img.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAICAYAAAAm06XyAAAARUlEQVQYV2P8///TfwYyASNIHzkGMDLyMYI1k2oASCNID1wzsQbANGJoJmQAskasmnEZgK4Rp2Z0A7BpxKsZZgAujSB5AB8hH/j9emSYAAAAAElFTkSuQmCC';
|
2669
|
+
// img.style.top = '-5px';
|
2670
|
+
// }
|
2671
|
+
//
|
2672
|
+
//tooltip.appendChild(img);
|
2490
2673
|
|
2491
2674
|
// Reposition the tooltip if at the edges:
|
2492
2675
|
|
2493
2676
|
// LEFT edge
|
2494
2677
|
if ((canvasXY[0] + coordX + (coordW / 2) - (width / 2)) < 10) {
|
2495
|
-
tooltip.style.left =
|
2496
|
-
img.style.left = ((width * 0.1) - 8.5) + 'px';
|
2678
|
+
tooltip.style.left = canvasXY[0] + mouseXY[0] - (width * 0.1) + 'px';
|
2679
|
+
//img.style.left = ((width * 0.1) - 8.5) + 'px';
|
2497
2680
|
|
2498
2681
|
// RIGHT edge
|
2499
2682
|
} else if ((canvasXY[0] + coordX + (width / 2)) > doc.body.offsetWidth) {
|
2500
|
-
tooltip.style.left = canvasXY[0] +
|
2501
|
-
img.style.left = ((width * 0.9) - 8.5) + 'px';
|
2683
|
+
tooltip.style.left = canvasXY[0] + mouseXY[0] - (width * 0.9) + 'px';
|
2684
|
+
//img.style.left = ((width * 0.9) - 8.5) + 'px';
|
2502
2685
|
|
2503
2686
|
// Default positioning - CENTERED
|
2504
2687
|
} else {
|
2505
|
-
tooltip.style.left =
|
2506
|
-
img.style.left = ((width * 0.5) - 8.5) + 'px';
|
2688
|
+
tooltip.style.left = canvasXY[0] + mouseXY[0] - (width / 2) + 'px';
|
2689
|
+
//img.style.left = ((width * 0.5) - 8.5) + 'px';
|
2507
2690
|
}
|
2508
2691
|
};
|
2509
2692
|
|
@@ -2758,6 +2941,7 @@
|
|
2758
2941
|
var labels = prop['chart.labels.above'],
|
2759
2942
|
specific = prop['chart.labels.above.specific'],
|
2760
2943
|
color = prop['chart.labels.above.color'],
|
2944
|
+
background= prop['chart.labels.above.background'],
|
2761
2945
|
decimals = prop['chart.labels.above.decimals'],
|
2762
2946
|
size = prop['chart.labels.above.size'],
|
2763
2947
|
angle = -1 * prop['chart.labels.above.angle'],
|
@@ -2801,7 +2985,9 @@
|
|
2801
2985
|
'valign': valign,
|
2802
2986
|
'angle': angle,
|
2803
2987
|
'marker': false,
|
2804
|
-
'bounding':
|
2988
|
+
'bounding': true,
|
2989
|
+
'bounding.fill': background,
|
2990
|
+
'bounding.stroke': 'rgba(0,0,0,0)',
|
2805
2991
|
'tag': 'labels.above'
|
2806
2992
|
});
|
2807
2993
|
|
@@ -2829,7 +3015,9 @@
|
|
2829
3015
|
'halign': halign,
|
2830
3016
|
'valign': valign,
|
2831
3017
|
'angle': angle,
|
2832
|
-
'bounding':
|
3018
|
+
'bounding': true,
|
3019
|
+
'bounding.fill': background,
|
3020
|
+
'bounding.stroke': 'rgba(0,0,0,0)',
|
2833
3021
|
'marker': false,
|
2834
3022
|
'tag': 'labels.above'
|
2835
3023
|
});
|
@@ -2861,7 +3049,9 @@
|
|
2861
3049
|
'halign': halign,
|
2862
3050
|
'valign': valign,
|
2863
3051
|
'angle': angle,
|
2864
|
-
'bounding':
|
3052
|
+
'bounding': true,
|
3053
|
+
'bounding.fill': background,
|
3054
|
+
'bounding.stroke': 'rgba(0,0,0,0)',
|
2865
3055
|
'marker': false,
|
2866
3056
|
'tag': 'labels.above'
|
2867
3057
|
});
|
@@ -2894,7 +3084,9 @@
|
|
2894
3084
|
'halign': halign,
|
2895
3085
|
'valign': valign,
|
2896
3086
|
'angle': angle,
|
2897
|
-
'bounding':
|
3087
|
+
'bounding': true,
|
3088
|
+
'bounding.fill': background,
|
3089
|
+
'bounding.stroke': 'rgba(0,0,0,0)',
|
2898
3090
|
'marker': false,
|
2899
3091
|
'tag': 'labels.above'
|
2900
3092
|
});
|
@@ -2919,7 +3111,9 @@
|
|
2919
3111
|
'halign': halign,
|
2920
3112
|
'valign': valign,
|
2921
3113
|
'angle': angle,
|
2922
|
-
'bounding':
|
3114
|
+
'bounding': true,
|
3115
|
+
'bounding.fill': background,
|
3116
|
+
'bounding.stroke': 'rgba(0,0,0,0)',
|
2923
3117
|
'marker': false,
|
2924
3118
|
'tag': 'labels.above'
|
2925
3119
|
});
|
@@ -3018,16 +3212,23 @@
|
|
3018
3212
|
this.wave = function ()
|
3019
3213
|
{
|
3020
3214
|
var obj = this,
|
3021
|
-
opt = arguments[0] || {}
|
3022
|
-
|
3023
|
-
|
3024
|
-
|
3215
|
+
opt = arguments[0] || {},
|
3216
|
+
labelsAbove = this.get('labelsAbove');
|
3217
|
+
|
3218
|
+
opt.frames = opt.frames || 60;
|
3219
|
+
opt.startFrames = [];
|
3220
|
+
opt.counters = [];
|
3025
3221
|
|
3026
3222
|
var framesperbar = opt.frames / 3,
|
3027
3223
|
frame = -1,
|
3028
3224
|
callback = arguments[1] || function () {},
|
3029
3225
|
original = RG.arrayClone(obj.data);
|
3030
3226
|
|
3227
|
+
//
|
3228
|
+
// turn off the labelsAbove option whilst animating
|
3229
|
+
//
|
3230
|
+
this.set('labelsAbove', false);
|
3231
|
+
|
3031
3232
|
for (var i=0,len=obj.data.length; i<len; i+=1) {
|
3032
3233
|
opt.startFrames[i] = ((opt.frames / 2) / (obj.data.length - 1)) * i;
|
3033
3234
|
|
@@ -3085,6 +3286,86 @@
|
|
3085
3286
|
}
|
3086
3287
|
|
3087
3288
|
|
3289
|
+
if (frame >= opt.frames) {
|
3290
|
+
|
3291
|
+
if (labelsAbove) {
|
3292
|
+
obj.set('labelsAbove', true);
|
3293
|
+
RG.redraw();
|
3294
|
+
}
|
3295
|
+
|
3296
|
+
callback(obj);
|
3297
|
+
} else {
|
3298
|
+
RG.redrawCanvas(obj.canvas);
|
3299
|
+
RG.Effects.updateCanvas(iterator);
|
3300
|
+
}
|
3301
|
+
}
|
3302
|
+
|
3303
|
+
iterator();
|
3304
|
+
|
3305
|
+
return this;
|
3306
|
+
};
|
3307
|
+
|
3308
|
+
|
3309
|
+
|
3310
|
+
|
3311
|
+
/**
|
3312
|
+
* Color Wave effect. This fades in color sequentially like the wave effect
|
3313
|
+
* makes the bars grow.
|
3314
|
+
*
|
3315
|
+
* @param object OPTIONAL An object map of options. You specify 'frames'
|
3316
|
+
* here to give the number of frames in the effect
|
3317
|
+
* @param function OPTIONAL A function that will be called when the effect
|
3318
|
+
* is complete
|
3319
|
+
*/
|
3320
|
+
this.colorWave = function ()
|
3321
|
+
{
|
3322
|
+
var obj = this,
|
3323
|
+
opt = arguments[0] || {};
|
3324
|
+
opt.frames = opt.frames || 60;
|
3325
|
+
opt.startFrames = [];
|
3326
|
+
opt.counters = [],
|
3327
|
+
colors = obj.properties['chart.colors'];
|
3328
|
+
|
3329
|
+
// If just one color is specified and colorsSequential is not, then
|
3330
|
+
// pad the colors array out
|
3331
|
+
if (colors.length <= obj.data.length) {
|
3332
|
+
obj.set('chart.colors.sequential', true);
|
3333
|
+
colors = RG.arrayPad(colors, obj.data.length, colors[colors.length - 1]);
|
3334
|
+
}
|
3335
|
+
|
3336
|
+
var framesperbar = opt.frames / 2,
|
3337
|
+
frame = -1,
|
3338
|
+
callback = arguments[1] || function () {},
|
3339
|
+
originalColors = RG.arrayClone(obj.properties['chart.colors']);
|
3340
|
+
|
3341
|
+
|
3342
|
+
|
3343
|
+
for (var i=0,len=originalColors.length; i<len; i+=1) {
|
3344
|
+
opt.startFrames[i] = ((opt.frames / 2) / (originalColors.length - 1)) * i;
|
3345
|
+
opt.counters[i] = 0;
|
3346
|
+
}
|
3347
|
+
|
3348
|
+
|
3349
|
+
function iterator ()
|
3350
|
+
{
|
3351
|
+
++frame;
|
3352
|
+
|
3353
|
+
for (var i=0,len=colors.length; i<len; i+=1) {
|
3354
|
+
if (frame > opt.startFrames[i] && colors[i].match(/^rgba?\(([0-9 ]+),([0-9 ]+),([0-9 ]+)(,([ 0-9.]+)?)\)/)) {
|
3355
|
+
|
3356
|
+
// DO NOT USE SPACES!
|
3357
|
+
colors[i] = 'rgba({1},{2},{3},{4})'.format(
|
3358
|
+
RegExp.$1,
|
3359
|
+
RegExp.$2,
|
3360
|
+
RegExp.$3,
|
3361
|
+
(frame - opt.startFrames[i]) / framesperbar
|
3362
|
+
);
|
3363
|
+
} else {
|
3364
|
+
colors[i] = colors[i].replace(/,[0-9. ]+\)/, ',0)');
|
3365
|
+
}
|
3366
|
+
}
|
3367
|
+
|
3368
|
+
|
3088
3369
|
if (frame >= opt.frames) {
|
3089
3370
|
callback(obj);
|
3090
3371
|
} else {
|
@@ -3112,14 +3393,20 @@
|
|
3112
3393
|
this.grow = function ()
|
3113
3394
|
{
|
3114
3395
|
// Callback
|
3115
|
-
var opt
|
3116
|
-
|
3117
|
-
|
3118
|
-
|
3119
|
-
|
3396
|
+
var opt = arguments[0] || {},
|
3397
|
+
frames = opt.frames || 30,
|
3398
|
+
frame = 0,
|
3399
|
+
callback = arguments[1] || function () {},
|
3400
|
+
obj = this,
|
3401
|
+
labelsAbove = this.get('labelsAbove')
|
3402
|
+
|
3403
|
+
//
|
3404
|
+
// turn off the labelsAbove option whilst animating
|
3405
|
+
//
|
3406
|
+
this.set('labelsAbove', false);
|
3120
3407
|
|
3121
3408
|
// Save the data
|
3122
|
-
|
3409
|
+
this.original_data = RG.arrayClone(this.data);
|
3123
3410
|
|
3124
3411
|
|
3125
3412
|
// Stop the scale from changing by setting chart.ymax (if it's not already set)
|
@@ -3128,24 +3415,24 @@
|
|
3128
3415
|
var ymax = 0;
|
3129
3416
|
|
3130
3417
|
for (var i=0; i<obj.data.length; ++i) {
|
3131
|
-
if (RG.isArray(
|
3132
|
-
ymax = ma.max(ymax, ma.abs(RG.arraySum(
|
3418
|
+
if (RG.isArray(this.data[i]) && prop['chart.grouping'] === 'stacked') {
|
3419
|
+
ymax = ma.max(ymax, ma.abs(RG.arraySum(this.data[i])));
|
3133
3420
|
|
3134
|
-
} else if (RG.isArray(
|
3421
|
+
} else if (RG.isArray(this.data[i]) && prop['chart.grouping'] === 'grouped') {
|
3135
3422
|
|
3136
|
-
for (var j=0,group=[]; j<
|
3137
|
-
group.push(ma.abs(
|
3423
|
+
for (var j=0,group=[]; j<this.data[i].length; j++) {
|
3424
|
+
group.push(ma.abs(this.data[i][j]));
|
3138
3425
|
}
|
3139
3426
|
|
3140
3427
|
ymax = ma.max(ymax, ma.abs(RG.arrayMax(group)));
|
3141
3428
|
|
3142
3429
|
} else {
|
3143
|
-
ymax = ma.max(ymax, ma.abs(
|
3430
|
+
ymax = ma.max(ymax, ma.abs(this.data[i]));
|
3144
3431
|
}
|
3145
3432
|
}
|
3146
3433
|
|
3147
|
-
var scale = RG.getScale2(
|
3148
|
-
|
3434
|
+
var scale = RG.getScale2(this, {'max':ymax});
|
3435
|
+
this.Set('chart.ymax', scale.max);
|
3149
3436
|
}
|
3150
3437
|
|
3151
3438
|
|
@@ -3181,6 +3468,10 @@
|
|
3181
3468
|
|
3182
3469
|
// Call the callback function
|
3183
3470
|
} else {
|
3471
|
+
if (labelsAbove) {
|
3472
|
+
obj.set('labelsAbove', true);
|
3473
|
+
RG.redraw();
|
3474
|
+
}
|
3184
3475
|
callback(obj);
|
3185
3476
|
}
|
3186
3477
|
};
|