rgraph-rails 1.0.5 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +0 -1
  3. data/README.md +3 -3
  4. data/lib/rgraph-rails/version.rb +1 -1
  5. data/vendor/assets/javascripts/RGraph.bar.js +239 -3764
  6. data/vendor/assets/javascripts/RGraph.bipolar.js +115 -1986
  7. data/vendor/assets/javascripts/RGraph.common.annotate.js +35 -399
  8. data/vendor/assets/javascripts/RGraph.common.context.js +30 -600
  9. data/vendor/assets/javascripts/RGraph.common.core.js +403 -5187
  10. data/vendor/assets/javascripts/RGraph.common.csv.js +19 -275
  11. data/vendor/assets/javascripts/RGraph.common.deprecated.js +35 -454
  12. data/vendor/assets/javascripts/RGraph.common.dynamic.js +84 -1189
  13. data/vendor/assets/javascripts/RGraph.common.effects.js +90 -1548
  14. data/vendor/assets/javascripts/RGraph.common.key.js +54 -755
  15. data/vendor/assets/javascripts/RGraph.common.resizing.js +37 -567
  16. data/vendor/assets/javascripts/RGraph.common.sheets.js +29 -356
  17. data/vendor/assets/javascripts/RGraph.common.tooltips.js +32 -614
  18. data/vendor/assets/javascripts/RGraph.common.zoom.js +14 -223
  19. data/vendor/assets/javascripts/RGraph.cornergauge.js +71 -0
  20. data/vendor/assets/javascripts/RGraph.drawing.background.js +35 -620
  21. data/vendor/assets/javascripts/RGraph.drawing.circle.js +35 -576
  22. data/vendor/assets/javascripts/RGraph.drawing.image.js +52 -807
  23. data/vendor/assets/javascripts/RGraph.drawing.marker1.js +41 -717
  24. data/vendor/assets/javascripts/RGraph.drawing.marker2.js +37 -668
  25. data/vendor/assets/javascripts/RGraph.drawing.marker3.js +36 -563
  26. data/vendor/assets/javascripts/RGraph.drawing.poly.js +40 -608
  27. data/vendor/assets/javascripts/RGraph.drawing.rect.js +35 -597
  28. data/vendor/assets/javascripts/RGraph.drawing.text.js +34 -642
  29. data/vendor/assets/javascripts/RGraph.drawing.xaxis.js +50 -809
  30. data/vendor/assets/javascripts/RGraph.drawing.yaxis.js +51 -856
  31. data/vendor/assets/javascripts/RGraph.fuel.js +58 -964
  32. data/vendor/assets/javascripts/RGraph.funnel.js +55 -984
  33. data/vendor/assets/javascripts/RGraph.gantt.js +75 -1241
  34. data/vendor/assets/javascripts/RGraph.gauge.js +87 -1397
  35. data/vendor/assets/javascripts/RGraph.hbar.js +143 -2376
  36. data/vendor/assets/javascripts/RGraph.hprogress.js +80 -1397
  37. data/vendor/assets/javascripts/RGraph.line.js +241 -4162
  38. data/vendor/assets/javascripts/RGraph.meter.js +74 -1278
  39. metadata +3 -30
  40. data/vendor/assets/images/bg.png +0 -0
  41. data/vendor/assets/images/bullet.png +0 -0
  42. data/vendor/assets/images/facebook-large.png +0 -0
  43. data/vendor/assets/images/google-plus-large.png +0 -0
  44. data/vendor/assets/images/logo.png +0 -0
  45. data/vendor/assets/images/meter-image-sd-needle.png +0 -0
  46. data/vendor/assets/images/meter-image-sd.png +0 -0
  47. data/vendor/assets/images/meter-sketch-needle.png +0 -0
  48. data/vendor/assets/images/meter-sketch.png +0 -0
  49. data/vendor/assets/images/odometer-background.png +0 -0
  50. data/vendor/assets/images/rgraph.jpg +0 -0
  51. data/vendor/assets/images/title.png +0 -0
  52. data/vendor/assets/images/twitter-large.png +0 -0
  53. data/vendor/assets/javascripts/RGraph.modaldialog.js +0 -301
  54. data/vendor/assets/javascripts/RGraph.odo.js +0 -1265
  55. data/vendor/assets/javascripts/RGraph.pie.js +0 -2272
  56. data/vendor/assets/javascripts/RGraph.radar.js +0 -1847
  57. data/vendor/assets/javascripts/RGraph.rose.js +0 -1877
  58. data/vendor/assets/javascripts/RGraph.rscatter.js +0 -1425
  59. data/vendor/assets/javascripts/RGraph.scatter.js +0 -2970
  60. data/vendor/assets/javascripts/RGraph.semicircularprogress.js +0 -1015
  61. data/vendor/assets/javascripts/RGraph.thermometer.js +0 -1129
  62. data/vendor/assets/javascripts/RGraph.vprogress.js +0 -1452
  63. data/vendor/assets/javascripts/RGraph.waterfall.js +0 -1252
  64. data/vendor/assets/javascripts/financial-data.js +0 -1067
  65. data/vendor/assets/stylesheets/ModalDialog.css +0 -90
  66. data/vendor/assets/stylesheets/animations.css +0 -3347
  67. data/vendor/assets/stylesheets/website.css +0 -446
@@ -1,756 +1,55 @@
1
- // version: 2016-06-04
2
- /**
3
- * o--------------------------------------------------------------------------------o
4
- * | This file is part of the RGraph package - you can learn more at: |
5
- * | |
6
- * | http://www.rgraph.net |
7
- * | |
8
- * | RGraph is dual licensed under the Open Source GPL (General Public License) |
9
- * | v2.0 license and a commercial license which means that you're not bound by |
10
- * | the terms of the GPL. The commercial license starts at just 99 GBP and |
11
- * | you can read about it here: |
12
- * | |
13
- * | http://www.rgraph.net/license |
14
- * o--------------------------------------------------------------------------------o
15
- */
16
1
 
17
- RGraph = window.RGraph || {isRGraph: true};
18
- RGraph.HTML = RGraph.HTML || {};
19
-
20
- // Module pattern
21
- (function (win, doc, undefined)
22
- {
23
- var RG = RGraph,
24
- ua = navigator.userAgent,
25
- ma = Math;
26
-
27
-
28
-
29
-
30
- /**
31
- * Draws the graph key (used by various graphs)
32
- *
33
- * @param object obj The graph object
34
- * @param array key An array of the texts to be listed in the key
35
- * @param colors An array of the colors to be used
36
- */
37
- RG.drawKey =
38
- RG.DrawKey = function (obj, key, colors)
39
- {
40
- if (!key) {
41
- return;
42
- }
43
-
44
- var ca = obj.canvas,
45
- co = obj.context,
46
- prop = obj.properties,
47
-
48
- // Key positioned in the gutter
49
- keypos = prop['chart.key.position'],
50
- textsize = prop['chart.text.size'],
51
- key_non_null = [],
52
- colors_non_null = [];
53
-
54
- co.lineWidth = 1;
55
-
56
- co.beginPath();
57
-
58
- /**
59
- * Change the older chart.key.vpos to chart.key.position.y
60
- */
61
- if (typeof(prop['chart.key.vpos']) == 'number') {
62
- obj.Set('chart.key.position.y', prop['chart.key.vpos'] * prop['chart.gutter.top']);
63
- }
64
-
65
- /**
66
- * Account for null values in the key
67
- */
68
- for (var i=0; i<key.length; ++i) {
69
- if (key[i] != null) {
70
- colors_non_null.push(colors[i]);
71
- key_non_null.push(key[i]);
72
- }
73
- }
74
-
75
- key = key_non_null;
76
- colors = colors_non_null;
77
-
78
-
79
-
80
-
81
-
82
-
83
-
84
-
85
-
86
-
87
-
88
-
89
-
90
-
91
-
92
-
93
-
94
-
95
-
96
-
97
-
98
-
99
-
100
-
101
-
102
-
103
-
104
- /**
105
- * This does the actual drawing of the key when it's in the graph
106
- *
107
- * @param object obj The graph object
108
- * @param array key The key items to draw
109
- * @param array colors An aray of colors that the key will use
110
- */
111
- function DrawKey_graph (obj, key, colors)
112
- {
113
- var text_size = typeof(prop['chart.key.text.size']) == 'number' ? prop['chart.key.text.size'] : prop['chart.text.size'];
114
- var text_italic = prop['chart.key.text.italic'] ? true : false
115
- var text_bold = prop['chart.key.text.bold'] ? true : false
116
- var text_font = prop['chart.key.text.font'] || prop['chart.key.font'] || prop['chart.text.font'];
117
-
118
- var gutterLeft = obj.gutterLeft;
119
- var gutterRight = obj.gutterRight;
120
- var gutterTop = obj.gutterTop;
121
- var gutterBottom = obj.gutterBottom;
122
- var hpos = prop['chart.yaxispos'] == 'right' ? gutterLeft + 10 : ca.width - gutterRight - 10;
123
- var vpos = gutterTop + 10;
124
- var title = prop['chart.title'];
125
- var blob_size = text_size; // The blob of color
126
- var hmargin = 8; // This is the size of the gaps between the blob of color and the text
127
- var vmargin = 4; // This is the vertical margin of the key
128
- var fillstyle = prop['chart.key.background'];
129
- var text_color = prop['chart.key.text.color'];
130
- var strokestyle = '#333';
131
- var height = 0;
132
- var width = 0;
133
-
134
- if (!obj.coords) obj.coords = {};
135
- obj.coords.key = [];
136
-
137
-
138
- // Need to set this so that measuring the text works out OK
139
- co.font = text_size + 'pt ' + prop['chart.text.font'];
140
-
141
- // Work out the longest bit of text
142
- for (i=0; i<key.length; ++i) {
143
- width = Math.max(width, co.measureText(key[i]).width);
144
- }
145
-
146
- width += 5;
147
- width += blob_size;
148
- width += 5;
149
- width += 5;
150
- width += 5;
151
-
152
- /**
153
- * Now we know the width, we can move the key left more accurately
154
- */
155
- if ( prop['chart.yaxispos'] == 'left'
156
- || (obj.type === 'pie' && !prop['chart.yaxispos'])
157
- || (obj.type === 'hbar' && !prop['chart.yaxispos'])
158
- || (obj.type === 'hbar' && prop['chart.yaxispos'] === 'center')
159
- || (obj.type === 'hbar' && prop['chart.yaxispos'] === 'right')
160
- || (obj.type === 'rscatter' && !prop['chart.yaxispos'])
161
- || (obj.type === 'radar' && !prop['chart.yaxispos'])
162
- || (obj.type === 'rose' && !prop['chart.yaxispos'])
163
- || (obj.type === 'funnel' && !prop['chart.yaxispos'])
164
- || (obj.type === 'vprogress' && !prop['chart.yaxispos'])
165
- || (obj.type === 'hprogress' && !prop['chart.yaxispos'])
166
- ) {
167
-
168
- hpos -= width;
169
- }
170
-
171
- /**
172
- * Horizontal alignment
173
- */
174
- if (typeof(prop['chart.key.halign']) == 'string') {
175
- if (prop['chart.key.halign'] == 'left') {
176
- hpos = gutterLeft + 10;
177
- } else if (prop['chart.key.halign'] == 'right') {
178
- hpos = ca.width - gutterRight - width;
179
- }
180
- }
181
-
182
- /**
183
- * Specific location coordinates
184
- */
185
- if (typeof(prop['chart.key.position.x']) == 'number') {
186
- hpos = prop['chart.key.position.x'];
187
- }
188
-
189
- if (typeof(prop['chart.key.position.y']) == 'number') {
190
- vpos = prop['chart.key.position.y'];
191
- }
192
-
193
-
194
- // Stipulate the shadow for the key box
195
- if (prop['chart.key.shadow']) {
196
- co.shadowColor = prop['chart.key.shadow.color'];
197
- co.shadowBlur = prop['chart.key.shadow.blur'];
198
- co.shadowOffsetX = prop['chart.key.shadow.offsetx'];
199
- co.shadowOffsetY = prop['chart.key.shadow.offsety'];
200
- }
201
-
202
-
203
-
204
-
205
- // Draw the box that the key resides in
206
- co.beginPath();
207
- co.fillStyle = prop['chart.key.background'];
208
- co.strokeStyle = 'black';
209
-
210
- if (typeof(prop['chart.key.position.graph.boxed']) == 'undefined' || (typeof(prop['chart.key.position.graph.boxed']) == 'boolean' && prop['chart.key.position.graph.boxed']) ) {
211
- if (arguments[3] != false) {
212
-
213
- co.lineWidth = typeof(prop['chart.key.linewidth']) == 'number' ? prop['chart.key.linewidth'] : 1;
214
-
215
- // The older square rectangled key
216
- if (prop['chart.key.rounded'] == true) {
217
- co.beginPath();
218
- co.strokeStyle = strokestyle;
219
- RG.strokedCurvyRect(co, Math.round(hpos), Math.round(vpos), width - 5, 5 + ( (text_size + 5) * RG.getKeyLength(key)),4);
220
- co.stroke();
221
- co.fill();
222
-
223
- RG.NoShadow(obj);
224
-
225
- } else {
226
- co.strokeRect(Math.round(hpos), Math.round(vpos), width - 5, 5 + ( (text_size + 5) * RG.getKeyLength(key)));
227
- co.fillRect(Math.round(hpos), Math.round(vpos), width - 5, 5 + ( (text_size + 5) * RG.getKeyLength(key)));
228
- }
229
- }
230
- }
231
-
232
- RG.NoShadow(obj);
233
-
234
- co.beginPath();
235
-
236
- /**
237
- * Custom colors for the key
238
- */
239
- if (prop['chart.key.colors']) {
240
- colors = prop['chart.key.colors'];
241
- }
242
-
243
-
244
-
245
- ////////////////////////////////////////////////////////////////////////////////////////////
246
-
247
-
248
-
249
- // Draw the labels given
250
- for (var i=key.length - 1; i>=0; i--) {
251
-
252
- var j = Number(i) + 1;
253
-
254
- /**
255
- * Draw the blob of color
256
- */
257
- if (typeof(prop['chart.key.color.shape']) == 'object' && typeof(prop['chart.key.color.shape'][i]) == 'string') {
258
- var blob_shape = prop['chart.key.color.shape'][i];
259
-
260
- } else if (typeof(prop['chart.key.color.shape']) == 'string') {
261
- var blob_shape = prop['chart.key.color.shape'];
262
- } else {
263
- var blob_shape = 'square';
264
- }
265
-
266
- if (blob_shape == 'circle') {
267
- co.beginPath();
268
- co.fillStyle = colors[i];
269
- co.arc(hpos + 5 + (blob_size / 2), vpos + (5 * j) + (text_size * j) - text_size + (blob_size / 2), blob_size / 2, 0, 6.26, 0);
270
- co.fill();
271
-
272
- } else if (blob_shape == 'line') {
273
- co.beginPath();
274
- co.strokeStyle = colors[i];
275
- co.moveTo(hpos + 5, vpos + (5 * j) + (text_size * j) - text_size + (blob_size / 2));
276
- co.lineTo(hpos + blob_size + 5, vpos + (5 * j) + (text_size * j) - text_size + (blob_size / 2));
277
- co.stroke();
278
-
279
- } else if (blob_shape == 'triangle') {
280
- co.beginPath();
281
- co.strokeStyle = colors[i];
282
- co.moveTo(hpos + 5, vpos + (5 * j) + (text_size * j) - text_size + blob_size);
283
- co.lineTo(hpos + (blob_size / 2) + 5, vpos + (5 * j) + (text_size * j) - text_size );
284
- co.lineTo(hpos + blob_size + 5, vpos + (5 * j) + (text_size * j) - text_size + blob_size);
285
- co.closePath();
286
- co.fillStyle = colors[i];
287
- co.fill();
288
-
289
- } else {
290
- co.fillStyle = colors[i];
291
- co.fillRect(hpos + 5, vpos + (5 * j) + (text_size * j) - text_size, text_size, text_size + 1);
292
- }
293
-
294
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////
295
-
296
-
297
-
298
- co.beginPath();
299
- co.fillStyle = typeof text_color == 'object' ? text_color[i] : text_color;
300
-
301
- ret = RG.Text2(obj, {
302
- 'font': text_font,
303
- 'size': text_size,
304
- 'bold': text_bold,
305
- 'italic': text_italic,
306
- 'x': hpos + blob_size + 5 + 5,
307
- 'y': vpos + (5 * j) + (text_size * j) + 3,
308
- 'text': key[i],
309
- 'accessible': !obj.properties['chart.key.interactive']
310
- });
311
-
312
- obj.coords.key[i] = [
313
- ret.x,
314
- ret.y,
315
- ret.width,
316
- ret.height,
317
- key[i],
318
- colors[i],
319
- obj
320
- ];
321
- }
322
- co.fill();
323
- }
324
-
325
-
326
-
327
-
328
-
329
-
330
-
331
-
332
-
333
-
334
-
335
-
336
-
337
-
338
-
339
-
340
-
341
-
342
-
343
-
344
-
345
-
346
-
347
- /**
348
- * This does the actual drawing of the key when it's in the gutter
349
- *
350
- * @param object obj The graph object
351
- * @param array key The key items to draw
352
- * @param array colors An aray of colors that the key will use
353
- */
354
- function DrawKey_gutter (obj, key, colors)
355
- {
356
- var text_size = typeof(prop['chart.key.text.size']) == 'number' ? prop['chart.key.text.size'] : prop['chart.text.size'],
357
- text_bold = prop['chart.key.text.bold'],
358
- text_italic = prop['chart.key.text.italic'],
359
- text_font = prop['chart.key.text.font'] || prop['chart.key.font'] || prop['chart.text.font'],
360
- text_color = prop['chart.key.text.color'],
361
- gutterLeft = obj.gutterLeft,
362
- gutterRight = obj.gutterRight,
363
- gutterTop = obj.gutterTop,
364
- gutterBottom = obj.gutterBottom,
365
- hpos = ((ca.width - gutterLeft - gutterRight) / 2) + obj.gutterLeft,
366
- vpos = gutterTop - text_size - 5,
367
- title = prop['chart.title'],
368
- blob_size = text_size, // The blob of color
369
- hmargin = 8, // This is the size of the gaps between the blob of color and the text
370
- vmargin = 4, // This is the vertical margin of the key
371
- fillstyle = prop['chart.key.background'],
372
- strokestyle = '#999',
373
- length = 0;
374
-
375
- if (!obj.coords) obj.coords = {};
376
- obj.coords.key = [];
377
-
378
-
379
-
380
- // Need to work out the length of the key first
381
- co.font = text_size + 'pt ' + text_font;
382
- for (i=0; i<key.length; ++i) {
383
- length += hmargin;
384
- length += blob_size;
385
- length += hmargin;
386
- length += co.measureText(key[i]).width;
387
- }
388
- length += hmargin;
389
-
390
-
391
-
392
-
393
- /**
394
- * Work out hpos since in the Pie it isn't necessarily dead center
395
- */
396
- if (obj.type == 'pie') {
397
- if (prop['chart.align'] == 'left') {
398
- var hpos = obj.radius + gutterLeft;
399
-
400
- } else if (prop['chart.align'] == 'right') {
401
- var hpos = ca.width - obj.radius - gutterRight;
402
-
403
- } else {
404
- hpos = ca.width / 2;
405
- }
406
- }
407
-
408
-
409
-
410
-
411
-
412
- /**
413
- * This makes the key centered
414
- */
415
- hpos -= (length / 2);
416
-
417
-
418
- /**
419
- * Override the horizontal/vertical positioning
420
- */
421
- if (typeof(prop['chart.key.position.x']) == 'number') {
422
- hpos = prop['chart.key.position.x'];
423
- }
424
- if (typeof(prop['chart.key.position.y']) == 'number') {
425
- vpos = prop['chart.key.position.y'];
426
- }
427
-
428
-
429
-
430
- /**
431
- * Draw the box that the key sits in
432
- */
433
- if (obj.Get('chart.key.position.gutter.boxed')) {
434
-
435
- if (prop['chart.key.shadow']) {
436
- co.shadowColor = prop['chart.key.shadow.color'];
437
- co.shadowBlur = prop['chart.key.shadow.blur'];
438
- co.shadowOffsetX = prop['chart.key.shadow.offsetx'];
439
- co.shadowOffsetY = prop['chart.key.shadow.offsety'];
440
- }
441
-
442
-
443
- co.beginPath();
444
- co.fillStyle = fillstyle;
445
- co.strokeStyle = strokestyle;
446
-
447
- if (prop['chart.key.rounded']) {
448
- RG.strokedCurvyRect(co, hpos, vpos - vmargin, length, text_size + vmargin + vmargin)
449
- // Odd... RG.filledCurvyRect(co, hpos, vpos - vmargin, length, text_size + vmargin + vmargin);
450
- } else {
451
- co.rect(hpos, vpos - vmargin, length, text_size + vmargin + vmargin);
452
- }
453
-
454
- co.stroke();
455
- co.fill();
456
-
457
-
458
- RG.NoShadow(obj);
459
- }
460
-
461
-
462
- /**
463
- * Draw the blobs of color and the text
464
- */
465
-
466
- // Custom colors for the key
467
- if (prop['chart.key.colors']) {
468
- colors = prop['chart.key.colors'];
469
- }
470
-
471
- for (var i=0, pos=hpos; i<key.length; ++i) {
472
- pos += hmargin;
473
-
474
-
475
-
476
- //////////////////////////////////////////////////////////////////////////////////////////////////////
477
-
478
-
479
-
480
- // Draw the blob of color
481
- if (typeof(prop['chart.key.color.shape']) == 'object' && typeof(prop['chart.key.color.shape'][i]) == 'string') {
482
- var blob_shape = prop['chart.key.color.shape'][i];
483
-
484
- } else if (typeof(prop['chart.key.color.shape']) == 'string') {
485
- var blob_shape = prop['chart.key.color.shape'];
486
-
487
- } else {
488
- var blob_shape = 'square';
489
- }
490
-
491
-
492
- /**
493
- * Draw the blob of color - line
494
- */
495
- if (blob_shape =='line') {
496
-
497
- co.beginPath();
498
- co.strokeStyle = colors[i];
499
- co.moveTo(pos, vpos + (blob_size / 2));
500
- co.lineTo(pos + blob_size, vpos + (blob_size / 2));
501
- co.stroke();
502
-
503
- // Circle
504
- } else if (blob_shape == 'circle') {
505
-
506
- co.beginPath();
507
- co.fillStyle = colors[i];
508
- co.moveTo(pos, vpos + (blob_size / 2));
509
- co.arc(pos + (blob_size / 2), vpos + (blob_size / 2), (blob_size / 2), 0, 6.28, 0);
510
- co.fill();
511
-
512
- } else if (blob_shape == 'triangle') {
513
-
514
- co.fillStyle = colors[i];
515
- co.beginPath();
516
- co.strokeStyle = colors[i];
517
- co.moveTo(pos, vpos + blob_size);
518
- co.lineTo(pos + (blob_size / 2), vpos);
519
- co.lineTo(pos + blob_size, vpos + blob_size);
520
- co.closePath();
521
- co.fill();
522
-
523
- } else {
524
-
525
- co.beginPath();
526
- co.fillStyle = colors[i];
527
- co.rect(pos, vpos, blob_size, blob_size);
528
- co.fill();
529
- }
530
-
531
-
532
-
533
- //////////////////////////////////////////////////////////////////////////////////////////////////////
534
-
535
-
536
-
537
-
538
- pos += blob_size;
539
-
540
- pos += hmargin;
541
-
542
- co.beginPath();
543
- co.fillStyle = typeof text_color == 'object' ? text_color[i] : text_color;;
544
- var ret = RG.Text2(obj, {
545
- 'font':text_font,
546
- 'bold':text_bold,
547
- 'size':text_size,
548
- 'italic': text_italic,
549
- 'x':pos,
550
- 'y':vpos + text_size + 3,
551
- 'text': key[i],
552
- accessible: !obj.properties['chart.key.interactive']
553
- });
554
- co.fill();
555
- pos += co.measureText(key[i]).width;
556
-
557
- obj.coords.key[i] = [
558
- ret.x,
559
- ret.y,
560
- ret.width,
561
- ret.height,
562
- key[i],
563
- colors[i],
564
- obj
565
- ];
566
- }
567
- }
568
-
569
-
570
-
571
-
572
- if (keypos && keypos == 'gutter') {
573
- DrawKey_gutter(obj, key, colors);
574
- } else if (keypos && keypos == 'graph') {
575
- DrawKey_graph(obj, key, colors);
576
- } else {
577
- alert('[COMMON] (' + obj.id + ') Unknown key position: ' + keypos);
578
- }
579
-
580
-
581
-
582
-
583
-
584
-
585
- if (prop['chart.key.interactive']) {
586
-
587
- if (!RGraph.Drawing || !RGraph.Drawing.Rect) {
588
- alert('[INTERACTIVE KEY] The drawing API Rect library does not appear to have been included (which the interactive key uses)');
589
- }
590
-
591
-
592
-
593
- /**
594
- * Check that the RGraph.common.dynamic.js file has been included
595
- */
596
- if (!RGraph.InstallWindowMousedownListener) {
597
- alert('[INTERACTIVE KEY] The dynamic library does not appear to have been included');
598
- }
599
-
600
-
601
-
602
- // Determine the maximum width of the labels
603
- for (var i=0,len=obj.coords.key.length,maxlen=0; i<len; i+=1) {
604
- maxlen = Math.max(maxlen, obj.coords.key[i][2]);
605
- }
606
-
607
-
608
- //obj.coords.key.forEach(function (value, index, arr)
609
- //{
610
- for (var i=0,len=obj.coords.key.length; i<len; i+=1) {
611
-
612
- // Because the loop would have finished when the i variable is needed - put
613
- // the onclick function inside a new context so that the value of the i
614
- // variable is what we expect when the key has been clicked
615
- (function (idx)
616
- {
617
- var arr = obj.coords.key;
618
- var value = obj.coords.key[idx];
619
- var index = idx;
620
-
621
-
622
- var rect = new RGraph.Drawing.Rect(obj.id,value[0], value[1], prop['chart.key.position'] == 'gutter' ? value[2] : maxlen, value[3])
623
- .Set('fillstyle', 'rgba(0,0,0,0)')
624
- .Draw();
625
-
626
- rect.onclick = function (e, shape)
627
- {
628
- var co = rect.context;
629
-
630
- co.fillStyle = prop['chart.key.interactive.highlight.label'];
631
- co.fillRect(shape.x, shape.y, shape.width, shape.height);
632
-
633
- if (typeof obj.interactiveKeyHighlight == 'function') {
634
-
635
- obj.Set('chart.key.interactive.index', idx);
636
-
637
- RG.FireCustomEvent(obj, 'onbeforeinteractivekey');
638
- obj.interactiveKeyHighlight(index);
639
- RG.FireCustomEvent(obj, 'onafterinteractivekey');
640
- }
641
- }
642
-
643
- rect.onmousemove = function (e, shape)
644
- {
645
- return true;
646
- }
647
- })(i);
648
- }
649
- }
650
- };
651
-
652
-
653
-
654
-
655
- /**
656
- * Returns the key length, but accounts for null values
657
- *
658
- * @param array key The key elements
659
- */
660
- RG.getKeyLength = function (key)
661
- {
662
- var length = 0;
663
-
664
- for (var i=0,len=key.length; i<len; i+=1) {
665
- if (key[i] != null) {
666
- ++length;
667
- }
668
- }
669
-
670
- return length;
671
- };
672
-
673
-
674
-
675
-
676
- /**
677
- * Create a TABLE based HTML key. There's lots of options so it's
678
- * suggested that you consult the documentation page
679
- *
680
- * @param mixed id This should be a string consisting of the ID of the container
681
- * @param object prop An object map of the various properties that you can use to
682
- * configure the key. See the documentation page for a list.
683
- */
684
- RGraph.HTML.key =
685
- RGraph.HTML.Key = function (id, prop)
686
- {
687
- var div = doc.getElementById(id);
688
-
689
-
690
- /**
691
- * Create the table that becomes the key
692
- */
693
- var str = '<table border="0" cellspacing="0" cellpadding="0" id="rgraph_key" style="display: inline;' + (function ()
694
- {
695
- var style = ''
696
- for (i in prop.tableCss) {
697
- if (typeof i === 'string') {
698
- style = style + i + ': ' + prop.tableCss[i] + ';';
699
- }
700
- }
701
- return style;
702
- })() + '" ' + (prop.tableClass ? 'class="' + prop.tableClass + '"' : '') + '>';
703
-
704
-
705
-
706
- /**
707
- * Add the individual key elements
708
- */
709
- for (var i=0; i<prop.labels.length; i+=1) {
710
- str += '<tr><td><div style="' + (function ()
711
- {
712
- var style = '';
713
-
714
- for (var j in prop.blobCss) {
715
- if (typeof j === 'string') {
716
- style = style + j + ': ' + prop.blobCss[j] + ';';
717
- }
718
- }
719
-
720
- return style;
721
- })() + 'display: inline-block; margin-right: 5px; margin-top: 4px; width: 15px; height: 15px; background-color: ' + prop.colors[i] + '"' + (prop.blobClass ? 'class="' + prop.blobClass + '"' : '') + '>&nbsp;</div><td>' + (prop.links && prop.links[i] ? '<a href="' + prop.links[i] + '">' : '') + '<span ' + (prop.labelClass ? 'class="' + prop.labelClass + '"' : '') + '" ' + (function ()
722
- {
723
- var style = '';
724
-
725
- for (var j in prop.labelCss) {
726
- if (typeof j === 'string') {
727
- style = style + j + ': ' + prop.labelCss[j] + ';';
728
- }
729
- }
730
-
731
- return style;
732
- })() + (function ()
733
- {
734
- var style = '';
735
-
736
- if (prop['labelCss_' + i]) {
737
- for (var j in prop['labelCss_' + i]) {
738
- style = style + j + ': ' + prop['labelCss_' + i][j] + ';';
739
- }
740
- }
741
-
742
- return style ? 'style="' + style + '"' : '';
743
- })() + '>' + prop.labels[i] + '</span>' + (prop.links && prop.links[i] ? '</a>' : '') + '</td></tr>';
744
- }
745
-
746
- div.innerHTML += (str + '</table>');
747
-
748
- // Return the TABLE object that is the HTML key
749
- return doc.getElementById('rgraph_key');
750
- };
751
-
752
-
753
-
754
-
755
- // End module pattern
756
- })(window, document);
2
+ RGraph=window.RGraph||{isRGraph:true};RGraph.HTML=RGraph.HTML||{};(function(win,doc,undefined)
3
+ {var RG=RGraph,ua=navigator.userAgent,ma=Math;RG.drawKey=RG.DrawKey=function(obj,key,colors)
4
+ {if(!key){return;}
5
+ var ca=obj.canvas,co=obj.context,prop=obj.properties,keypos=prop['chart.key.position'],textsize=prop['chart.text.size'],key_non_null=[],colors_non_null=[];co.lineWidth=1;co.beginPath();if(typeof(prop['chart.key.vpos'])=='number'){obj.Set('chart.key.position.y',prop['chart.key.vpos']*prop['chart.gutter.top']);}
6
+ for(var i=0;i<key.length;++i){if(key[i]!=null){colors_non_null.push(colors[i]);key_non_null.push(key[i]);}}
7
+ key=key_non_null;colors=colors_non_null;function DrawKey_graph(obj,key,colors)
8
+ {var text_size=typeof(prop['chart.key.text.size'])=='number'?prop['chart.key.text.size']:prop['chart.text.size'];var text_italic=prop['chart.key.text.italic']?true:false
9
+ var text_bold=prop['chart.key.text.bold']?true:false
10
+ var text_font=prop['chart.key.text.font']||prop['chart.key.font']||prop['chart.text.font'];var gutterLeft=obj.gutterLeft;var gutterRight=obj.gutterRight;var gutterTop=obj.gutterTop;var gutterBottom=obj.gutterBottom;var hpos=prop['chart.yaxispos']=='right'?gutterLeft+10:ca.width-gutterRight-10;var vpos=gutterTop+10;var title=prop['chart.title'];var blob_size=text_size;var hmargin=8;var vmargin=4;var fillstyle=prop['chart.key.background'];var text_color=prop['chart.key.text.color'];var strokestyle='#333';var height=0;var width=0;if(!obj.coords)obj.coords={};obj.coords.key=[];co.font=text_size+'pt '+prop['chart.text.font'];for(i=0;i<key.length;++i){width=Math.max(width,co.measureText(key[i]).width);}
11
+ width+=5;width+=blob_size;width+=5;width+=5;width+=5;if(prop['chart.yaxispos']=='left'||(obj.type==='pie'&&!prop['chart.yaxispos'])||(obj.type==='hbar'&&!prop['chart.yaxispos'])||(obj.type==='hbar'&&prop['chart.yaxispos']==='center')||(obj.type==='hbar'&&prop['chart.yaxispos']==='right')||(obj.type==='rscatter'&&!prop['chart.yaxispos'])||(obj.type==='radar'&&!prop['chart.yaxispos'])||(obj.type==='rose'&&!prop['chart.yaxispos'])||(obj.type==='funnel'&&!prop['chart.yaxispos'])||(obj.type==='vprogress'&&!prop['chart.yaxispos'])||(obj.type==='hprogress'&&!prop['chart.yaxispos'])){hpos-=width;}
12
+ if(typeof(prop['chart.key.halign'])=='string'){if(prop['chart.key.halign']=='left'){hpos=gutterLeft+10;}else if(prop['chart.key.halign']=='right'){hpos=ca.width-gutterRight-width;}}
13
+ if(typeof(prop['chart.key.position.x'])=='number'){hpos=prop['chart.key.position.x'];}
14
+ if(typeof(prop['chart.key.position.y'])=='number'){vpos=prop['chart.key.position.y'];}
15
+ if(prop['chart.key.shadow']){co.shadowColor=prop['chart.key.shadow.color'];co.shadowBlur=prop['chart.key.shadow.blur'];co.shadowOffsetX=prop['chart.key.shadow.offsetx'];co.shadowOffsetY=prop['chart.key.shadow.offsety'];}
16
+ co.beginPath();co.fillStyle=prop['chart.key.background'];co.strokeStyle='black';if(typeof(prop['chart.key.position.graph.boxed'])=='undefined'||(typeof(prop['chart.key.position.graph.boxed'])=='boolean'&&prop['chart.key.position.graph.boxed'])){if(arguments[3]!=false){co.lineWidth=typeof(prop['chart.key.linewidth'])=='number'?prop['chart.key.linewidth']:1;if(prop['chart.key.rounded']==true){co.beginPath();co.strokeStyle=strokestyle;RG.strokedCurvyRect(co,Math.round(hpos),Math.round(vpos),width-5,5+((text_size+5)*RG.getKeyLength(key)),4);co.stroke();co.fill();RG.NoShadow(obj);}else{co.strokeRect(Math.round(hpos),Math.round(vpos),width-5,5+((text_size+5)*RG.getKeyLength(key)));co.fillRect(Math.round(hpos),Math.round(vpos),width-5,5+((text_size+5)*RG.getKeyLength(key)));}}}
17
+ RG.NoShadow(obj);co.beginPath();if(prop['chart.key.colors']){colors=prop['chart.key.colors'];}
18
+ for(var i=key.length-1;i>=0;i--){var j=Number(i)+1;if(typeof(prop['chart.key.color.shape'])=='object'&&typeof(prop['chart.key.color.shape'][i])=='string'){var blob_shape=prop['chart.key.color.shape'][i];}else if(typeof(prop['chart.key.color.shape'])=='string'){var blob_shape=prop['chart.key.color.shape'];}else{var blob_shape='square';}
19
+ if(blob_shape=='circle'){co.beginPath();co.fillStyle=colors[i];co.arc(hpos+5+(blob_size/2),vpos+(5*j)+(text_size*j)-text_size+(blob_size/2),blob_size/2,0,6.26,0);co.fill();}else if(blob_shape=='line'){co.beginPath();co.strokeStyle=colors[i];co.moveTo(hpos+5,vpos+(5*j)+(text_size*j)-text_size+(blob_size/2));co.lineTo(hpos+blob_size+5,vpos+(5*j)+(text_size*j)-text_size+(blob_size/2));co.stroke();}else if(blob_shape=='triangle'){co.beginPath();co.strokeStyle=colors[i];co.moveTo(hpos+5,vpos+(5*j)+(text_size*j)-text_size+blob_size);co.lineTo(hpos+(blob_size/2)+5,vpos+(5*j)+(text_size*j)-text_size);co.lineTo(hpos+blob_size+5,vpos+(5*j)+(text_size*j)-text_size+blob_size);co.closePath();co.fillStyle=colors[i];co.fill();}else{co.fillStyle=colors[i];co.fillRect(hpos+5,vpos+(5*j)+(text_size*j)-text_size,text_size,text_size+1);}
20
+ co.beginPath();co.fillStyle=typeof text_color=='object'?text_color[i]:text_color;ret=RG.Text2(obj,{'font':text_font,'size':text_size,'bold':text_bold,'italic':text_italic,'x':hpos+blob_size+5+5,'y':vpos+(5*j)+(text_size*j)+3,'text':key[i],'accessible':!obj.properties['chart.key.interactive']});obj.coords.key[i]=[ret.x,ret.y,ret.width,ret.height,key[i],colors[i],obj];}
21
+ co.fill();}
22
+ function DrawKey_gutter(obj,key,colors)
23
+ {var text_size=typeof(prop['chart.key.text.size'])=='number'?prop['chart.key.text.size']:prop['chart.text.size'],text_bold=prop['chart.key.text.bold'],text_italic=prop['chart.key.text.italic'],text_font=prop['chart.key.text.font']||prop['chart.key.font']||prop['chart.text.font'],text_color=prop['chart.key.text.color'],gutterLeft=obj.gutterLeft,gutterRight=obj.gutterRight,gutterTop=obj.gutterTop,gutterBottom=obj.gutterBottom,hpos=((ca.width-gutterLeft-gutterRight)/2)+obj.gutterLeft,vpos=gutterTop-text_size-5,title=prop['chart.title'],blob_size=text_size,hmargin=8,vmargin=4,fillstyle=prop['chart.key.background'],strokestyle='#999',length=0;if(!obj.coords)obj.coords={};obj.coords.key=[];co.font=text_size+'pt '+text_font;for(i=0;i<key.length;++i){length+=hmargin;length+=blob_size;length+=hmargin;length+=co.measureText(key[i]).width;}
24
+ length+=hmargin;if(obj.type=='pie'){if(prop['chart.align']=='left'){var hpos=obj.radius+gutterLeft;}else if(prop['chart.align']=='right'){var hpos=ca.width-obj.radius-gutterRight;}else{hpos=ca.width/2;}}
25
+ hpos-=(length/2);if(typeof(prop['chart.key.position.x'])=='number'){hpos=prop['chart.key.position.x'];}
26
+ if(typeof(prop['chart.key.position.y'])=='number'){vpos=prop['chart.key.position.y'];}
27
+ if(obj.Get('chart.key.position.gutter.boxed')){if(prop['chart.key.shadow']){co.shadowColor=prop['chart.key.shadow.color'];co.shadowBlur=prop['chart.key.shadow.blur'];co.shadowOffsetX=prop['chart.key.shadow.offsetx'];co.shadowOffsetY=prop['chart.key.shadow.offsety'];}
28
+ co.beginPath();co.fillStyle=fillstyle;co.strokeStyle=strokestyle;if(prop['chart.key.rounded']){RG.strokedCurvyRect(co,hpos,vpos-vmargin,length,text_size+vmargin+vmargin)}else{co.rect(hpos,vpos-vmargin,length,text_size+vmargin+vmargin);}
29
+ co.stroke();co.fill();RG.NoShadow(obj);}
30
+ if(prop['chart.key.colors']){colors=prop['chart.key.colors'];}
31
+ for(var i=0,pos=hpos;i<key.length;++i){pos+=hmargin;if(typeof(prop['chart.key.color.shape'])=='object'&&typeof(prop['chart.key.color.shape'][i])=='string'){var blob_shape=prop['chart.key.color.shape'][i];}else if(typeof(prop['chart.key.color.shape'])=='string'){var blob_shape=prop['chart.key.color.shape'];}else{var blob_shape='square';}
32
+ if(blob_shape=='line'){co.beginPath();co.strokeStyle=colors[i];co.moveTo(pos,vpos+(blob_size/2));co.lineTo(pos+blob_size,vpos+(blob_size/2));co.stroke();}else if(blob_shape=='circle'){co.beginPath();co.fillStyle=colors[i];co.moveTo(pos,vpos+(blob_size/2));co.arc(pos+(blob_size/2),vpos+(blob_size/2),(blob_size/2),0,6.28,0);co.fill();}else if(blob_shape=='triangle'){co.fillStyle=colors[i];co.beginPath();co.strokeStyle=colors[i];co.moveTo(pos,vpos+blob_size);co.lineTo(pos+(blob_size/2),vpos);co.lineTo(pos+blob_size,vpos+blob_size);co.closePath();co.fill();}else{co.beginPath();co.fillStyle=colors[i];co.rect(pos,vpos,blob_size,blob_size);co.fill();}
33
+ pos+=blob_size;pos+=hmargin;co.beginPath();co.fillStyle=(typeof text_color==='object')?text_color[i]:text_color;var ret=RG.Text2(obj,{'font':text_font,'bold':text_bold,'size':text_size,'italic':text_italic,'x':pos,'y':vpos+text_size+3,'text':key[i],accessible:!obj.properties['chart.key.interactive']});co.fill();pos+=co.measureText(key[i]).width;obj.coords.key[i]=[ret.x,ret.y,ret.width,ret.height,key[i],colors[i],obj];}}
34
+ if(keypos&&keypos=='gutter'){DrawKey_gutter(obj,key,colors);}else if(keypos&&keypos=='graph'){DrawKey_graph(obj,key,colors);}else{alert('[COMMON] ('+obj.id+') Unknown key position: '+keypos);}
35
+ if(prop['chart.key.interactive']){if(!RGraph.Drawing||!RGraph.Drawing.Rect){alert('[INTERACTIVE KEY] The drawing API Rect library does not appear to have been included (which the interactive key uses)');}
36
+ if(!RGraph.InstallWindowMousedownListener){alert('[INTERACTIVE KEY] The dynamic library does not appear to have been included');}
37
+ for(var i=0,len=obj.coords.key.length,maxlen=0;i<len;i+=1){maxlen=Math.max(maxlen,obj.coords.key[i][2]);}
38
+ for(var i=0,len=obj.coords.key.length;i<len;i+=1){(function(idx)
39
+ {var arr=obj.coords.key;var value=obj.coords.key[idx];var index=idx;var rect=new RGraph.Drawing.Rect(obj.id,value[0],value[1],prop['chart.key.position']=='gutter'?value[2]:maxlen,value[3]).Set('fillstyle','rgba(0,0,0,0)').Draw();rect.onclick=function(e,shape)
40
+ {var co=rect.context;co.fillStyle=prop['chart.key.interactive.highlight.label'];co.fillRect(shape.x,shape.y,shape.width,shape.height);if(typeof obj.interactiveKeyHighlight=='function'){obj.Set('chart.key.interactive.index',idx);RG.FireCustomEvent(obj,'onbeforeinteractivekey');obj.interactiveKeyHighlight(index);RG.FireCustomEvent(obj,'onafterinteractivekey');}}
41
+ rect.onmousemove=function(e,shape)
42
+ {return true;}})(i);}}};RG.getKeyLength=function(key)
43
+ {var length=0;for(var i=0,len=key.length;i<len;i+=1){if(key[i]!=null){++length;}}
44
+ return length;};RGraph.HTML.key=RGraph.HTML.Key=function(id,prop)
45
+ {var div=doc.getElementById(id);var str='<table border="0" cellspacing="0" cellpadding="0" id="rgraph_key" style="display: inline;'+(function()
46
+ {var style=''
47
+ for(i in prop.tableCss){if(typeof i==='string'){style=style+i+': '+prop.tableCss[i]+';';}}
48
+ return style;})()+'" '+(prop.tableClass?'class="'+prop.tableClass+'"':'')+'>';for(var i=0;i<prop.labels.length;i+=1){str+='<tr><td><div style="'+(function()
49
+ {var style='';for(var j in prop.blobCss){if(typeof j==='string'){style=style+j+': '+prop.blobCss[j]+';';}}
50
+ return style;})()+'display: inline-block; margin-right: 5px; margin-top: 4px; width: 15px; height: 15px; background-color: '+prop.colors[i]+'"'+(prop.blobClass?'class="'+prop.blobClass+'"':'')+'>&nbsp;</div><td>'+(prop.links&&prop.links[i]?'<a href="'+prop.links[i]+'">':'')+'<span '+(prop.labelClass?'class="'+prop.labelClass+'"':'')+'" '+(function()
51
+ {var style='';for(var j in prop.labelCss){if(typeof j==='string'){style=style+j+': '+prop.labelCss[j]+';';}}
52
+ return style;})()+(function()
53
+ {var style='';if(prop['labelCss_'+i]){for(var j in prop['labelCss_'+i]){style=style+j+': '+prop['labelCss_'+i][j]+';';}}
54
+ return style?'style="'+style+'"':'';})()+'>'+prop.labels[i]+'</span>'+(prop.links&&prop.links[i]?'</a>':'')+'</td></tr>';}
55
+ div.innerHTML+=(str+'</table>');return doc.getElementById('rgraph_key');};})(window,document);