rgraph-rails 1.0.3 → 1.0.4

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 (63) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +1 -0
  3. data/README.md +5 -5
  4. data/lib/rgraph-rails/version.rb +1 -1
  5. data/rgraph-rails.gemspec +2 -2
  6. data/vendor/assets/images/bg.png +0 -0
  7. data/vendor/assets/images/bullet.png +0 -0
  8. data/vendor/assets/images/facebook-large.png +0 -0
  9. data/vendor/assets/images/google-plus-large.png +0 -0
  10. data/vendor/assets/images/logo.png +0 -0
  11. data/vendor/assets/images/meter-image-sd-needle.png +0 -0
  12. data/vendor/assets/images/meter-image-sd.png +0 -0
  13. data/vendor/assets/images/meter-sketch-needle.png +0 -0
  14. data/vendor/assets/images/meter-sketch.png +0 -0
  15. data/vendor/assets/images/odometer-background.png +0 -0
  16. data/vendor/assets/images/rgraph.jpg +0 -0
  17. data/vendor/assets/images/title.png +0 -0
  18. data/vendor/assets/images/twitter-large.png +0 -0
  19. data/vendor/assets/javascripts/RGraph.bar.js +258 -30
  20. data/vendor/assets/javascripts/RGraph.bipolar.js +4 -3
  21. data/vendor/assets/javascripts/RGraph.common.annotate.js +4 -3
  22. data/vendor/assets/javascripts/RGraph.common.context.js +4 -3
  23. data/vendor/assets/javascripts/RGraph.common.core.js +227 -105
  24. data/vendor/assets/javascripts/RGraph.common.csv.js +4 -3
  25. data/vendor/assets/javascripts/RGraph.common.deprecated.js +4 -3
  26. data/vendor/assets/javascripts/RGraph.common.dynamic.js +5 -4
  27. data/vendor/assets/javascripts/RGraph.common.effects.js +4 -3
  28. data/vendor/assets/javascripts/RGraph.common.key.js +4 -3
  29. data/vendor/assets/javascripts/RGraph.common.resizing.js +4 -3
  30. data/vendor/assets/javascripts/RGraph.common.sheets.js +357 -0
  31. data/vendor/assets/javascripts/RGraph.common.tooltips.js +6 -4
  32. data/vendor/assets/javascripts/RGraph.common.zoom.js +4 -3
  33. data/vendor/assets/javascripts/RGraph.drawing.background.js +4 -3
  34. data/vendor/assets/javascripts/RGraph.drawing.circle.js +4 -3
  35. data/vendor/assets/javascripts/RGraph.drawing.image.js +4 -3
  36. data/vendor/assets/javascripts/RGraph.drawing.marker1.js +4 -3
  37. data/vendor/assets/javascripts/RGraph.drawing.marker2.js +4 -3
  38. data/vendor/assets/javascripts/RGraph.drawing.marker3.js +1 -1
  39. data/vendor/assets/javascripts/RGraph.drawing.poly.js +1 -1
  40. data/vendor/assets/javascripts/RGraph.drawing.rect.js +1 -1
  41. data/vendor/assets/javascripts/RGraph.drawing.text.js +1 -1
  42. data/vendor/assets/javascripts/RGraph.drawing.xaxis.js +1 -1
  43. data/vendor/assets/javascripts/RGraph.drawing.yaxis.js +33 -30
  44. data/vendor/assets/javascripts/RGraph.fuel.js +14 -16
  45. data/vendor/assets/javascripts/RGraph.funnel.js +1 -1
  46. data/vendor/assets/javascripts/RGraph.gantt.js +1 -1
  47. data/vendor/assets/javascripts/RGraph.gauge.js +3 -5
  48. data/vendor/assets/javascripts/RGraph.hbar.js +738 -212
  49. data/vendor/assets/javascripts/RGraph.hprogress.js +30 -33
  50. data/vendor/assets/javascripts/RGraph.line.js +246 -31
  51. data/vendor/assets/javascripts/RGraph.meter.js +72 -36
  52. data/vendor/assets/javascripts/RGraph.modaldialog.js +1 -1
  53. data/vendor/assets/javascripts/RGraph.odo.js +3 -5
  54. data/vendor/assets/javascripts/RGraph.pie.js +23 -15
  55. data/vendor/assets/javascripts/RGraph.radar.js +1 -1
  56. data/vendor/assets/javascripts/RGraph.rose.js +2 -2
  57. data/vendor/assets/javascripts/RGraph.rscatter.js +116 -27
  58. data/vendor/assets/javascripts/RGraph.scatter.js +14 -15
  59. data/vendor/assets/javascripts/RGraph.thermometer.js +8 -10
  60. data/vendor/assets/javascripts/RGraph.vprogress.js +8 -10
  61. data/vendor/assets/javascripts/RGraph.waterfall.js +1 -1
  62. data/vendor/assets/stylesheets/website.css +32 -2
  63. metadata +6 -5
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NTZlMjliMTg5MjJmYTJhMDU0MWE0ODYzZDZkMWI2MTkyOGRmNDc4OA==
4
+ ZjgxMzVlOTc0MDk3OWJjZjlkOTBkOGQzNTUwYjllODUyZTQ3MmNiNw==
5
5
  data.tar.gz: !binary |-
6
- NmFhMGIyYjg0YThkMjllYjUxOWQ5NTE1ZDA1NWM4MDYyY2Y1ZmI4Nw==
6
+ YTcyNDQ3YjczYzE5NTA5ZTNlN2Y2ZjkzODM4Y2RlY2JkNjJhNWU2Mg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZjBkNWI1NmEzYjc5MGZmZmZiYzM3MDY0NTM3YWJkMDgzOGQ1MTQ1Y2U2Njkx
10
- YWM0YjA2MzUyMTJmNWY3ZDllYmMwOTViNmNmMDRjMzRhYjE2NTkyMGQ2OTg5
11
- N2RmOTg4ZjBjMDlhYTZjNWM4MTU2MDEzMDE1MzM5NGFlOThmNmE=
9
+ NGY5YTU0MjExMDQ3ZmIxYzEwOWZkNTI2YmQxMmRjZTZhYWZhMTdkNTc3NTdk
10
+ MTU0MzkzZjIwOGQ5YmFjMjU4NDkyZGI4NTI1YmVkYWUyNzk4NTQwMjQxYjRl
11
+ NWQyNTUzMDE1MGFhOWQ0OTljZjRjNGVkMjQ1YTllNzgzYzM4MGE=
12
12
  data.tar.gz: !binary |-
13
- YzY4MjYyNjE0NmVlN2E4YWJhZTA2YTFjZmQxNjI1OTdkMjI0ZDA0MWNlMzA5
14
- MDQ3NzgwZmI3Y2VlZWY2NzEwMmJkZTQ2NGEwODE2Y2JjNjIwN2UzYjI0YWUz
15
- YzkyN2RlMWUyN2E2OWVmZTU3MTc3ZjQzMTQ0NDAwN2I4OTgwZTQ=
13
+ NmJlOGY0Zjg0YjQ2ZmU3Y2QzYTk5YjBlNjJmNTg5NjdiNTU4NTMxOGJkMzRi
14
+ ZjM0MDViNDVlMDBiMmI2MWJlMWY5ZGFiNzFjZGExY2Y1ZTU4ZWRlYTY5NzYw
15
+ YTZkNDMyZTJiMGI1MGI2ZGQxZmZkMWFlZDc0NzhiZDk5NmVhNDc=
@@ -1,6 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 2.2.1
4
+ - 2.3.0
4
5
  before_install: gem install bundler -v 1.10.6
5
6
  deploy:
6
7
  provider: rubygems
data/README.md CHANGED
@@ -7,7 +7,7 @@ Use the [rgraph](http://www.rgraph.net/) chart/graph library with the Rails asse
7
7
 
8
8
  ## Installation
9
9
 
10
- Add this line to your application's Gemfile:
10
+ Include the gem in your application's Gemfile:
11
11
 
12
12
  ```ruby
13
13
  gem 'rgraph-rails', '~> 1.0'
@@ -19,18 +19,18 @@ And then execute:
19
19
 
20
20
  ## Usage
21
21
 
22
- In your application.js, include the core RGraph file
22
+ In your `application.js`, include the core RGraph file
23
23
 
24
24
  ```ruby
25
25
  //= require RGraph.common.core
26
26
  ```
27
27
 
28
- Next, include one or more graph types - depending on which one's you'd like to use. For example:
28
+ Next, include one or more graph types - depending on which one's you'd like to use. For example
29
29
 
30
30
  ```ruby
31
31
  //= require RGraph.hprogress.js
32
32
  ```
33
- Then you'd add the Graphical data to your `example.coffee`/`example.js`:
33
+ Then you'd add the Graphical data to your `example.coffee`/`example.js`
34
34
 
35
35
  ```coffeescript
36
36
  $(window).load ->
@@ -72,5 +72,5 @@ Bug reports and pull requests are welcome. This project is intended to be a safe
72
72
 
73
73
  ## License
74
74
 
75
- See license.txt
75
+ See `license.txt`
76
76
 
@@ -1,3 +1,3 @@
1
1
  module RgraphRails
2
- VERSION = "1.0.3"
2
+ VERSION = "1.0.4"
3
3
  end
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.version = RgraphRails::VERSION
9
9
  spec.authors = ["Daniel Griffin"]
10
10
  spec.email = ["danielseangriffin@gmail.com"]
11
- spec.licenses = ["GPL"]
11
+ spec.licenses = ["GPL-3.0"]
12
12
 
13
13
  spec.summary = %q{ The rgraph (http://www.rgraph.net/) interactive chart/graph library with the Rails asset pipeline. }
14
14
  spec.description = %q{ The rgraph (http://www.rgraph.net/) interactive chart/graph library with the Rails asset pipeline. }
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_dependency "railties", "~> 4.2"
22
+ spec.add_dependency "railties", ">= 4.2"
23
23
  spec.add_development_dependency "bundler", "~> 1.10"
24
24
  spec.add_development_dependency "rake", "~> 10.0"
25
25
  spec.add_development_dependency "rspec", "~> 3.3"
Binary file
@@ -1,4 +1,4 @@
1
- // version: 2015-11-02
1
+ // version: 2016-02-06
2
2
  /**
3
3
  * o--------------------------------------------------------------------------------o
4
4
  * | This file is part of the RGraph package - you can learn more at: |
@@ -7,8 +7,9 @@
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 |
11
- * | read about it here: |
10
+ * | the terms of the GPL. The commercial license starts at just �99 (GBP) and |
11
+ * | you can read about it here: |
12
+ * | |
12
13
  * | http://www.rgraph.net/license |
13
14
  * o--------------------------------------------------------------------------------o
14
15
  */
@@ -165,6 +166,8 @@
165
166
  'chart.grouping': 'grouped',
166
167
  'chart.variant': 'bar',
167
168
  'chart.variant.sketch.verticals': true,
169
+ 'chart.variant.threed.xaxis': true,
170
+ 'chart.variant.threed.yaxis': true,
168
171
  'chart.variant.threed.angle': 0.1,
169
172
  'chart.variant.threed.offsetx': 10,
170
173
  'chart.variant.threed.offsety': 5,
@@ -178,6 +181,7 @@
178
181
  'chart.tooltips.css.class': 'RGraph_tooltip',
179
182
  'chart.tooltips.event': 'onclick',
180
183
  'chart.tooltips.highlight': true,
184
+ 'chart.tooltips.hotspot.xonly': false,
181
185
  'chart.highlight.stroke': 'rgba(0,0,0,0)',
182
186
  'chart.highlight.fill': 'rgba(255,255,255,0.7)',
183
187
  'chart.key': null,
@@ -234,7 +238,15 @@
234
238
  'chart.events.click': null,
235
239
  'chart.events.mousemove': null,
236
240
  'chart.numxticks': null,
237
- 'chart.bevel': false
241
+ 'chart.bevel': false,
242
+ 'chart.errorbars': false,
243
+ 'chart.errorbars.color': 'black',
244
+ 'chart.errorbars.capped': true,
245
+ 'chart.errorbars.capped.width': 14,
246
+ 'chart.errorbars.linewidth': 1,
247
+ 'chart.combinedchart.effect': null,
248
+ 'chart.combinedchart.effect.options': null,
249
+ 'chart.combinedchart.effect.callback': null
238
250
  }
239
251
 
240
252
  // Check for support
@@ -485,7 +497,8 @@
485
497
  // Cache this in a class variable as it's used rather a lot
486
498
 
487
499
  /**
488
- * Check for tooltips and alert the user that they're not supported with pyramid charts
500
+ * Check for tooltips and alert the user that they're not supported
501
+ * with pyramid charts
489
502
  */
490
503
  if ( (prop['chart.variant'] == 'pyramid' || prop['chart.variant'] == 'dot')
491
504
  && typeof(prop['chart.tooltips']) == 'object'
@@ -510,6 +523,8 @@
510
523
  this.grapharea = ca.height - this.gutterTop - this.gutterBottom;
511
524
  this.halfgrapharea = this.grapharea / 2;
512
525
  this.halfTextHeight = prop['chart.text.size'] / 2;
526
+
527
+
513
528
 
514
529
 
515
530
 
@@ -555,6 +570,16 @@
555
570
 
556
571
 
557
572
 
573
+ /**
574
+ * Draw errorbars
575
+ */
576
+ if (prop['chart.errorbars']) {
577
+ this.drawErrorbars();
578
+ }
579
+
580
+
581
+
582
+
558
583
  /**
559
584
  * Draw "in graph" labels
560
585
  */
@@ -782,14 +807,16 @@
782
807
  */
783
808
  this.drawbars =
784
809
  this.Drawbars = function ()
785
- {
810
+ {
786
811
  co.lineWidth = prop['chart.linewidth'];
787
812
  co.strokeStyle = prop['chart.strokecolor'];
788
813
  co.fillStyle = prop['chart.colors'][0];
789
- var prevX = 0;
790
- var prevY = 0;
791
- var decimals = prop['chart.scale.decimals'];
792
-
814
+
815
+ var prevX = 0,
816
+ prevY = 0,
817
+ decimals = prop['chart.scale.decimals'];
818
+
819
+
793
820
  /**
794
821
  * Work out the max value
795
822
  */
@@ -810,17 +837,70 @@
810
837
 
811
838
  } else {
812
839
 
840
+
841
+
842
+
843
+
844
+ //
845
+ // If errorbars are given as a number then convert the nuumber to an
846
+ // array.
847
+ //
848
+ var errorbars = prop['chart.errorbars'];
849
+
850
+ if (typeof errorbars === 'number') {
851
+
852
+ var value = errorbars;
853
+
854
+ prop['chart.errorbars'] = [];
855
+
856
+ for (var i=0; i<this.data.length; ++i) {
857
+ if (typeof this.data[i] === 'number') {
858
+ prop['chart.errorbars'].push([value, null]);
859
+
860
+ } else if (typeof this.data[i] === 'object' && !RG.isNull(this.data[i])) {
861
+ for (var j=0; j<this.data[i].length; ++j) {
862
+ prop['chart.errorbars'].push([value, null]);
863
+ }
864
+ }
865
+ }
866
+
867
+ errorbars = prop['chart.errorbars'];
868
+ }
869
+
870
+
871
+
872
+
873
+
874
+
875
+
876
+
813
877
  for (i=0; i<this.data.length; ++i) {
814
878
  if (typeof(this.data[i]) == 'object') {
815
- var value = prop['chart.grouping'] == 'grouped' ? Number(RG.arrayMax(this.data[i], true)) : Number(RG.array_sum(this.data[i]));
879
+ var value = prop['chart.grouping'] === 'grouped' ? Number(RG.arrayMax(this.data[i], true)) : Number(RG.array_sum(this.data[i]));
816
880
 
817
881
  } else {
818
882
  var value = Number(this.data[i]);
819
883
  }
820
884
 
821
- this.max = ma.max(ma.abs(this.max), Math.abs(value));
885
+ this.max = ma.max(ma.abs(this.max), ma.abs(value) +
886
+
887
+ Number(
888
+ (
889
+ typeof prop['chart.errorbars'] === 'object'
890
+ && typeof prop['chart.errorbars'][i] === 'object'
891
+ && !RG.isNull(prop['chart.errorbars'][i])
892
+ && typeof prop['chart.errorbars'][i][0] === 'number'
893
+ ) ? prop['chart.errorbars'][i][0] : 0
894
+ )
895
+ );
822
896
  }
823
897
 
898
+
899
+
900
+
901
+
902
+
903
+
824
904
  this.scale2 = RGraph.getScale2(this, {
825
905
  'max':this.max,
826
906
  'min':prop['chart.ymin'],
@@ -858,7 +938,7 @@
858
938
  if (variant === '3d') {
859
939
  RG.draw3DAxes(this);
860
940
  }
861
-
941
+
862
942
  /**
863
943
  * Get the variant once, and draw the bars, be they regular, stacked or grouped
864
944
  */
@@ -1052,9 +1132,9 @@
1052
1132
 
1053
1133
 
1054
1134
 
1055
- // Draw the darker top section
1135
+ // Draw the lighter top section
1056
1136
  co.beginPath();
1057
- co.fillStyle = 'rgba(255,255,255,0.3)';
1137
+ co.fillStyle = 'rgba(255,255,255,0.5)';
1058
1138
  co.moveTo(x + hmargin, y);
1059
1139
  co.lineTo(x + hmargin + prop['chart.variant.threed.offsetx'], y - prop['chart.variant.threed.offsety']);
1060
1140
  co.lineTo(x + hmargin + prop['chart.variant.threed.offsetx'] + barWidth, y - prop['chart.variant.threed.offsety']);
@@ -1277,9 +1357,9 @@
1277
1357
  co.fill();
1278
1358
  co.stroke();
1279
1359
 
1280
- // Draw the darker top side
1360
+ // Draw the lighter top side
1281
1361
  if (j == 0) {
1282
- co.fillStyle = 'rgba(255,255,255,0.3)';
1362
+ co.fillStyle = 'rgba(255,255,255,0.5)';
1283
1363
  co.beginPath();
1284
1364
  co.moveTo(startX + hmargin, y);
1285
1365
  co.lineTo(startX + prop['chart.variant.threed.offsetx'] + hmargin, y - prop['chart.variant.threed.offsety']);
@@ -1442,7 +1522,7 @@
1442
1522
 
1443
1523
  // Draw the lighter top side - but only if the current value is positive
1444
1524
  if (this.data[i][j] >= 0) {
1445
- co.fillStyle = 'rgba(255,255,255,0.3)';
1525
+ co.fillStyle = 'rgba(255,255,255,0.5)';
1446
1526
  co.beginPath();
1447
1527
  // BL
1448
1528
  co.moveTo(startX + hmarginGrouped, startY);
@@ -1554,8 +1634,8 @@
1554
1634
  {
1555
1635
  var context = co;
1556
1636
 
1557
- var text_angle = prop['chart.text.angle']
1558
- text_size = prop['chart.text.size']
1637
+ var text_angle = prop['chart.text.angle'],
1638
+ text_size = prop['chart.text.size'],
1559
1639
  labels = prop['chart.labels']
1560
1640
 
1561
1641
 
@@ -2046,7 +2126,11 @@
2046
2126
 
2047
2127
  // Recreate the path/rectangle so that it can be tested
2048
2128
  // ** DO NOT STROKE OR FILL IT **
2049
- pa(co,['b','r',left,top,width,height]);
2129
+ if (prop['chart.tooltips.hotspot.xonly']) {
2130
+ pa(co,['b','r',left,this.gutterTop,width,ca.height - this.gutterBottom]);
2131
+ } else {
2132
+ pa(co,['b','r',left,top,width,height]);
2133
+ }
2050
2134
 
2051
2135
  if (co.isPointInPath(mouseX, mouseY)) {
2052
2136
 
@@ -2214,9 +2298,9 @@
2214
2298
  return null;
2215
2299
  }
2216
2300
 
2217
- var co = this.context;
2218
- var ca = this.canvas;
2219
- var prop = this.properties;
2301
+ var co = this.context,
2302
+ ca = this.canvas,
2303
+ prop = this.properties;
2220
2304
 
2221
2305
  var y;
2222
2306
  var xaxispos = prop['chart.xaxispos'];
@@ -3109,6 +3193,139 @@
3109
3193
 
3110
3194
 
3111
3195
 
3196
+ //
3197
+ // Draws error-bars for the Bar and Line charts
3198
+ //
3199
+ this.drawErrorbars = function ()
3200
+ {
3201
+ var coords = this.coords,
3202
+ color = prop['chart.errorbars.color'] || 'black',
3203
+ default_halfwidth = ma.min(prop['chart.errorbars.capped.width'], coords[0][2]) / 2,
3204
+ x = 0,
3205
+ errorbars = prop['chart.errorbars'],
3206
+ length = 0;
3207
+
3208
+
3209
+ // If not capped set the width of the cqap to zero
3210
+ if (!prop['chart.errorbars.capped']) {
3211
+ prop['chart.errorbars.capped.width'] = 0;
3212
+ halfwidth = 0;
3213
+ }
3214
+
3215
+ // Set the linewidth
3216
+ co.lineWidth = prop['chart.errorbars.linewidth'];
3217
+
3218
+
3219
+
3220
+
3221
+ for (var i=0; i<coords.length; ++i) {
3222
+
3223
+
3224
+ // Default to black
3225
+ color = prop['chart.errorbars.color'] || 'black';
3226
+
3227
+ // Set the perbar linewidth if the fourth option in the array
3228
+ // is specified
3229
+ if (errorbars[i] && typeof errorbars[i][3] === 'number') {
3230
+ co.lineWidth = errorbars[i][3];
3231
+ }
3232
+
3233
+ // Set the halfwidth
3234
+ var halfwidth = (errorbars[i]&& typeof errorbars[i][4] === 'number') ? errorbars[i][4] / 2 : default_halfwidth;
3235
+
3236
+ if (!prop['chart.errorbars.capped']) {
3237
+ halfwidth = 0;
3238
+ }
3239
+
3240
+
3241
+
3242
+ // Calulate the pixel size
3243
+ if (typeof errorbars[i] === 'number') {
3244
+
3245
+ length = ma.abs(this.getYCoord(errorbars[i]) - this.getYCoord(0));
3246
+
3247
+ if (length) {
3248
+ pa2(
3249
+ co,
3250
+ 'b m % % l % % l % % l % % s %',
3251
+ coords[i][0] + (coords[i][2] / 2),
3252
+ coords[i][1],
3253
+ coords[i][0] + (coords[i][2] / 2),
3254
+ coords[i][1] - length,
3255
+ coords[i][0] + (coords[i][2] / 2) - halfwidth,
3256
+ ma.round(coords[i][1] - length),
3257
+ coords[i][0] + (coords[i][2] / 2) + halfwidth,
3258
+ ma.round(coords[i][1] - length),
3259
+ color
3260
+ );
3261
+ }
3262
+ } else if (typeof errorbars[i] === 'object' && !RG.isNull(errorbars[i])) {
3263
+
3264
+ var positiveLength = ma.abs(this.getYCoord(errorbars[i][0]) - this.getYCoord(0));
3265
+
3266
+ // Color
3267
+ if (typeof errorbars[i][1] === 'string') {
3268
+ color = errorbars[i][1];
3269
+
3270
+ } else if (typeof errorbars[i][2] === 'string') {
3271
+ color = errorbars[i][2];
3272
+ }
3273
+
3274
+ // Cap width
3275
+ halfwidth = typeof errorbars[i][4] === 'number' ? errorbars[i][4] / 2 : default_halfwidth;
3276
+
3277
+ if (!prop['chart.errorbars.capped']) {
3278
+ halfwidth = 0;
3279
+ }
3280
+
3281
+ if (!RG.isNull(errorbars[i][0])) {
3282
+ pa2(
3283
+ co,
3284
+ 'b m % % l % % l % % l % % s %',
3285
+ coords[i][0] + (coords[i][2] / 2),
3286
+ coords[i][1],
3287
+ coords[i][0] + (coords[i][2] / 2),
3288
+ coords[i][1] - positiveLength,
3289
+ coords[i][0] + (coords[i][2] / 2) - halfwidth,
3290
+ ma.round(coords[i][1] - positiveLength),
3291
+ coords[i][0] + (coords[i][2] / 2) + halfwidth,
3292
+ ma.round(coords[i][1] - positiveLength),
3293
+ color
3294
+ );
3295
+ }
3296
+
3297
+ if (typeof errorbars[i][1] === 'number') {
3298
+
3299
+ var negativeLength = ma.abs(this.getYCoord(errorbars[i][1]) - this.getYCoord(0));
3300
+
3301
+ pa2(
3302
+ co,
3303
+ 'b m % % l % % l % % l % % s %',
3304
+ coords[i][0] + (coords[i][2] / 2),
3305
+ coords[i][1],
3306
+ coords[i][0] + (coords[i][2] / 2),
3307
+ coords[i][1] + negativeLength,
3308
+ coords[i][0] + (coords[i][2] / 2) - halfwidth,
3309
+ ma.round(coords[i][1] + negativeLength),
3310
+ coords[i][0] + (coords[i][2] / 2) + halfwidth,
3311
+ ma.round(coords[i][1] + negativeLength),
3312
+ color
3313
+ );
3314
+ }
3315
+ }
3316
+
3317
+
3318
+ // Reset the perbar linewidth to the default if the fourth option
3319
+ // in the array was specified specified
3320
+ if (errorbars[i] && typeof errorbars[i][3] === 'number') {
3321
+ co.lineWidth = prop['chart.errorbars.linewidth'];
3322
+ }
3323
+ }
3324
+ };
3325
+
3326
+
3327
+
3328
+
3112
3329
  /**
3113
3330
  * Register the object
3114
3331
  */
@@ -3165,11 +3382,11 @@
3165
3382
  /**
3166
3383
  * Set the Line chart gutters to match the Bar chart gutters
3167
3384
  */
3168
- this.objects[i].Set({
3169
- gutterLeft: this.objects[0].get('gutterLeft'),
3170
- gutterRight: this.objects[0].get('gutterRight'),
3171
- gutterTop: this.objects[0].get('gutterTop'),
3172
- gutterBottom: this.objects[0].get('gutterBottom')
3385
+ this.objects[i].set({
3386
+ gutterLeft: this.objects[0].get('gutter.left'), // Needs to use the dot form to skirt an IE9 bug
3387
+ gutterRight: this.objects[0].get('gutter.right'), // Needs to use the dot form to skirt an IE9 bug
3388
+ gutterTop: this.objects[0].get('gutter.top'), // Needs to use the dot form to skirt an IE9 bug
3389
+ gutterBottom: this.objects[0].get('gutter.bottom') // Needs to use the dot form to skirt an IE9 bug
3173
3390
  });
3174
3391
 
3175
3392
  if (this.objects[i].type == 'line') {
@@ -3241,6 +3458,17 @@
3241
3458
  RGraph.CombinedChart.prototype.Draw = function ()
3242
3459
  {
3243
3460
  for (var i=0; i<this.objects.length; ++i) {
3244
- this.objects[i].Draw();
3461
+ if (this.objects[i].properties['chart.combinedchart.effect']) {
3462
+
3463
+ var options = this.objects[i].properties['chart.combinedchart.effect.options'] ? eval('(' + this.objects[i].properties['chart.combinedchart.effect.options'] + ')') : null;
3464
+
3465
+ (this.objects[i][this.objects[i].properties['chart.combinedchart.effect']])
3466
+ (
3467
+ options,
3468
+ this.objects[i].properties['chart.combinedchart.effect.callback']
3469
+ )
3470
+ } else {
3471
+ this.objects[i].draw();
3472
+ }
3245
3473
  }
3246
3474
  };