rgraph-rails 4.62 → 4.64
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.
- checksums.yaml +5 -5
- data/README.md +3 -4
- data/lib/rgraph-rails/version.rb +1 -1
- data/vendor/assets/javascripts/RGraph.bar.js +240 -3742
- data/vendor/assets/javascripts/RGraph.bipolar.js +165 -2005
- data/vendor/assets/javascripts/RGraph.common.annotate.js +35 -395
- data/vendor/assets/javascripts/RGraph.common.context.js +30 -595
- data/vendor/assets/javascripts/RGraph.common.core.js +418 -5359
- data/vendor/assets/javascripts/RGraph.common.csv.js +20 -276
- data/vendor/assets/javascripts/RGraph.common.deprecated.js +35 -450
- data/vendor/assets/javascripts/RGraph.common.dynamic.js +88 -1395
- data/vendor/assets/javascripts/RGraph.common.effects.js +90 -1545
- data/vendor/assets/javascripts/RGraph.common.key.js +52 -753
- data/vendor/assets/javascripts/RGraph.common.resizing.js +37 -563
- data/vendor/assets/javascripts/RGraph.common.sheets.js +29 -352
- data/vendor/assets/javascripts/RGraph.common.tooltips.js +32 -450
- data/vendor/assets/javascripts/RGraph.common.zoom.js +14 -219
- data/vendor/assets/javascripts/RGraph.cornergauge.js +71 -0
- data/vendor/assets/javascripts/RGraph.drawing.background.js +34 -570
- data/vendor/assets/javascripts/RGraph.drawing.circle.js +33 -544
- data/vendor/assets/javascripts/RGraph.drawing.image.js +51 -755
- data/vendor/assets/javascripts/RGraph.drawing.marker1.js +37 -645
- data/vendor/assets/javascripts/RGraph.drawing.marker2.js +36 -633
- data/vendor/assets/javascripts/RGraph.drawing.marker3.js +35 -514
- data/vendor/assets/javascripts/RGraph.drawing.poly.js +37 -559
- data/vendor/assets/javascripts/RGraph.drawing.rect.js +33 -548
- data/vendor/assets/javascripts/RGraph.drawing.text.js +36 -664
- data/vendor/assets/javascripts/RGraph.drawing.xaxis.js +50 -812
- data/vendor/assets/javascripts/RGraph.drawing.yaxis.js +51 -856
- data/vendor/assets/javascripts/RGraph.fuel.js +58 -964
- data/vendor/assets/javascripts/RGraph.funnel.js +55 -984
- data/vendor/assets/javascripts/RGraph.gantt.js +77 -1354
- data/vendor/assets/javascripts/RGraph.gauge.js +85 -1421
- data/vendor/assets/javascripts/RGraph.hbar.js +162 -2788
- data/vendor/assets/javascripts/RGraph.hprogress.js +80 -1401
- data/vendor/assets/javascripts/RGraph.line.js +249 -4248
- data/vendor/assets/javascripts/RGraph.meter.js +74 -1280
- data/vendor/assets/javascripts/RGraph.modaldialog.js +19 -301
- data/vendor/assets/javascripts/RGraph.odo.js +71 -1264
- data/vendor/assets/javascripts/RGraph.pie.js +137 -2288
- data/vendor/assets/javascripts/RGraph.radar.js +110 -1847
- data/vendor/assets/javascripts/RGraph.rose.js +108 -1977
- data/vendor/assets/javascripts/RGraph.rscatter.js +80 -1432
- data/vendor/assets/javascripts/RGraph.scatter.js +172 -3163
- data/vendor/assets/javascripts/RGraph.semicircularprogress.js +60 -1120
- data/vendor/assets/javascripts/RGraph.svg.bar.js +66 -1735
- data/vendor/assets/javascripts/RGraph.svg.common.ajax.js +21 -246
- data/vendor/assets/javascripts/RGraph.svg.common.core.js +255 -3937
- data/vendor/assets/javascripts/RGraph.svg.common.csv.js +20 -276
- data/vendor/assets/javascripts/RGraph.svg.common.fx.js +68 -1303
- data/vendor/assets/javascripts/RGraph.svg.common.key.js +19 -205
- data/vendor/assets/javascripts/RGraph.svg.common.sheets.js +29 -352
- data/vendor/assets/javascripts/RGraph.svg.common.tooltips.js +22 -273
- data/vendor/assets/javascripts/RGraph.svg.funnel.js +32 -0
- data/vendor/assets/javascripts/RGraph.svg.hbar.js +59 -1400
- data/vendor/assets/javascripts/RGraph.svg.line.js +70 -1580
- data/vendor/assets/javascripts/RGraph.svg.pie.js +55 -1131
- data/vendor/assets/javascripts/RGraph.svg.radar.js +57 -1502
- data/vendor/assets/javascripts/RGraph.svg.rose.js +66 -1817
- data/vendor/assets/javascripts/RGraph.svg.scatter.js +58 -1261
- data/vendor/assets/javascripts/RGraph.svg.semicircularprogress.js +28 -865
- data/vendor/assets/javascripts/RGraph.svg.waterfall.js +45 -1252
- data/vendor/assets/javascripts/RGraph.thermometer.js +63 -1136
- data/vendor/assets/javascripts/RGraph.vprogress.js +83 -1470
- data/vendor/assets/javascripts/RGraph.waterfall.js +83 -1347
- metadata +5 -4
- data/vendor/assets/javascripts/financial-data.js +0 -1067
@@ -1,277 +1,21 @@
|
|
1
|
-
// version: 2017-05-08
|
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 licensed under the Open Source MIT license. That means that it's |
|
9
|
-
* | totally free to use! |
|
10
|
-
* o--------------------------------------------------------------------------------o
|
11
|
-
*/
|
12
1
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
this.url = url;
|
34
|
-
this.ready = func;
|
35
|
-
this.data = null;
|
36
|
-
this.numrows = null;
|
37
|
-
this.numcols = null;
|
38
|
-
this.seperator = arguments[2] || ',';
|
39
|
-
this.endofline = arguments[3] || /\r?\n/;
|
40
|
-
this.uid = RGraph.createUID();
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
/**
|
46
|
-
* A Custom split function
|
47
|
-
*
|
48
|
-
* @param string str The CSV string to split
|
49
|
-
* @param mixed char The character to split on - or it can also be an object like this:
|
50
|
-
* {
|
51
|
-
* preserve: false, // Whether to preserve whitespace
|
52
|
-
* char: ',' // The character to split on
|
53
|
-
* }
|
54
|
-
*/
|
55
|
-
this.splitCSV = function (str, split)
|
56
|
-
{
|
57
|
-
// Defaults
|
58
|
-
var arr = [];
|
59
|
-
var field = '';
|
60
|
-
var inDoubleQuotes = false;
|
61
|
-
var inSingleQuotes = false;
|
62
|
-
var preserve = (typeof split === 'object' && split.preserve) ? true : false;
|
63
|
-
|
64
|
-
// The character to split the CSV string on
|
65
|
-
if (typeof split === 'object') {
|
66
|
-
if (typeof split.char === 'string') {
|
67
|
-
split = split.char;
|
68
|
-
} else {
|
69
|
-
split = ',';
|
70
|
-
}
|
71
|
-
} // If not an object just leave the char as it's supplied
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
for (var i=0,len=str.length; i<len; i+=1) {
|
76
|
-
|
77
|
-
char = str.charAt(i);
|
78
|
-
|
79
|
-
if ( (char === '"') && !inDoubleQuotes) {
|
80
|
-
inDoubleQuotes = true;
|
81
|
-
continue;
|
82
|
-
|
83
|
-
} else if ( (char === '"') && inDoubleQuotes) {
|
84
|
-
inDoubleQuotes = false;
|
85
|
-
continue;
|
86
|
-
}
|
87
|
-
if ( (char === "'") && !inSingleQuotes) {
|
88
|
-
inSingleQuotes = true;
|
89
|
-
continue;
|
90
|
-
|
91
|
-
} else if ( (char === "'") && inSingleQuotes) {
|
92
|
-
inSingleQuotes = false;
|
93
|
-
continue;
|
94
|
-
|
95
|
-
} else if (char === split && !inDoubleQuotes && !inSingleQuotes) {
|
96
|
-
// TODO look ahead in order to allow for multi-character seperators
|
97
|
-
arr.push(field);
|
98
|
-
field = '';
|
99
|
-
continue;
|
100
|
-
|
101
|
-
} else {
|
102
|
-
field = field + char;
|
103
|
-
}
|
104
|
-
}
|
105
|
-
|
106
|
-
// Add the last field
|
107
|
-
arr.push(field);
|
108
|
-
|
109
|
-
// Now trim each value if necessary
|
110
|
-
if (!preserve) {
|
111
|
-
for (i=0,len=arr.length; i<len; i+=1) {
|
112
|
-
arr[i] = arr[i].trim();
|
113
|
-
}
|
114
|
-
}
|
115
|
-
|
116
|
-
return arr;
|
117
|
-
};
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
/**
|
123
|
-
* This function splits the CSV data into an array so that it can be useful.
|
124
|
-
*/
|
125
|
-
this.fetch = function ()
|
126
|
-
{
|
127
|
-
var sep = this.seperator,
|
128
|
-
eol = this.endofline,
|
129
|
-
obj = this;
|
130
|
-
|
131
|
-
if (this.url.substring(0,3) === 'id:' || this.url.substring(0,4) === 'str:') {
|
132
|
-
|
133
|
-
// Get rid of any surrounding whitespace
|
134
|
-
if (this.url.substring(0,3) === 'id:') {
|
135
|
-
var data = document.getElementById(this.url.substring(3)).innerHTML.trim();
|
136
|
-
|
137
|
-
} else if (this.url.substring(0,4) === 'str:') {
|
138
|
-
var data = this.url.substring(4).trim();
|
139
|
-
}
|
140
|
-
|
141
|
-
// Store the CSV data on the CSV object (ie - this object)
|
142
|
-
obj.data = data.split(eol);
|
143
|
-
|
144
|
-
// Store the number of rows
|
145
|
-
obj.numrows = obj.data.length;
|
146
|
-
|
147
|
-
for (var i=0,len=obj.data.length; i<len; i+=1) {
|
148
|
-
|
149
|
-
|
150
|
-
/**
|
151
|
-
* Split the individual line
|
152
|
-
*/
|
153
|
-
//var row = obj.data[i].split(sep);
|
154
|
-
var row = obj.splitCSV(obj.data[i], {preserve: false, char: sep});
|
155
|
-
|
156
|
-
|
157
|
-
if (!obj.numcols) {
|
158
|
-
obj.numcols = row.length;
|
159
|
-
}
|
160
|
-
|
161
|
-
/**
|
162
|
-
* If the cell is purely made up of numbers - convert it
|
163
|
-
*/
|
164
|
-
for (var j=0; j<row.length; j+=1) {
|
165
|
-
if ((/^\-?[0-9.]+$/).test(row[j])) {
|
166
|
-
row[j] = parseFloat(row[j]);
|
167
|
-
}
|
168
|
-
|
169
|
-
// Assign the split-up-row back to the data array
|
170
|
-
obj.data[i] = row;
|
171
|
-
}
|
172
|
-
}
|
173
|
-
|
174
|
-
// Call the ready function straight away
|
175
|
-
obj.ready(obj);
|
176
|
-
|
177
|
-
} else {
|
178
|
-
|
179
|
-
RGraph.AJAX.getString(this.url, function (data)
|
180
|
-
{
|
181
|
-
data = data.replace(/(\r?\n)+$/, '');
|
182
|
-
|
183
|
-
/**
|
184
|
-
* Split the lines in the CSV
|
185
|
-
*/
|
186
|
-
obj.data = data.split(eol);
|
187
|
-
|
188
|
-
/**
|
189
|
-
* Store the number of rows
|
190
|
-
*/
|
191
|
-
obj.numrows = obj.data.length;
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
/**
|
196
|
-
* Loop thru each lines in the CSV file
|
197
|
-
*/
|
198
|
-
for (var i=0,len=obj.data.length; i<len; i+=1) {
|
199
|
-
/**
|
200
|
-
* Use the new split function to split each row NOT preserving whitespace
|
201
|
-
*/
|
202
|
-
//var row = obj.data[i].split(sep);
|
203
|
-
var row = obj.splitCSV(obj.data[i], {preserve: false, char: sep});
|
204
|
-
|
205
|
-
if (!obj.numcols) {
|
206
|
-
obj.numcols = row.length;
|
207
|
-
}
|
208
|
-
|
209
|
-
/**
|
210
|
-
* If the cell is purely made up of numbers - convert it
|
211
|
-
*/
|
212
|
-
for (var j=0; j<row.length; j+=1) {
|
213
|
-
if ((/^\-?[0-9.]+$/).test(row[j])) {
|
214
|
-
row[j] = parseFloat(row[j]);
|
215
|
-
}
|
216
|
-
|
217
|
-
// Assign the split-up-row back to the data array
|
218
|
-
obj.data[i] = row;
|
219
|
-
}
|
220
|
-
}
|
221
|
-
|
222
|
-
// Call the ready function straight away
|
223
|
-
obj.ready(obj);
|
224
|
-
});
|
225
|
-
}
|
226
|
-
};
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
/**
|
232
|
-
* Returns a row of the CSV file
|
233
|
-
*
|
234
|
-
* @param number index The index of the row to fetch
|
235
|
-
* @param start OPTIONAL If desired you can specify a column to start at (which starts at 0 by default)
|
236
|
-
*/
|
237
|
-
this.getRow = function (index)
|
238
|
-
{
|
239
|
-
var row = [];
|
240
|
-
var start = arguments[1] || 0;
|
241
|
-
|
242
|
-
for (var i=start; i<this.numcols; i+=1) {
|
243
|
-
row.push(this.data[index][i]);
|
244
|
-
}
|
245
|
-
|
246
|
-
return row;
|
247
|
-
};
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
/**
|
253
|
-
* Returns a column of the CSV file
|
254
|
-
*
|
255
|
-
* @param number index The index of the column to fetch
|
256
|
-
* @param start OPTIONAL If desired you can specify a row to start at (which starts at 0 by default)
|
257
|
-
*/
|
258
|
-
this.getCol =
|
259
|
-
this.getColumn = function (index)
|
260
|
-
{
|
261
|
-
var col = [];
|
262
|
-
var start = arguments[1] || 0;
|
263
|
-
|
264
|
-
for (var i=start; i<this.numrows; i+=1) {
|
265
|
-
col.push(this.data[i][index]);
|
266
|
-
}
|
267
|
-
|
268
|
-
return col;
|
269
|
-
};
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
// Fetch the CSV file
|
276
|
-
this.fetch();
|
277
|
-
};
|
2
|
+
RGraph=window.RGraph||{isRGraph:true};RGraph.CSV=function(url,func)
|
3
|
+
{var RG=RGraph,ua=navigator.userAgent,ma=Math;this.url=url;this.ready=func;this.data=null;this.numrows=null;this.numcols=null;this.seperator=arguments[2]||',';this.endofline=arguments[3]||/\r?\n/;this.uid=RGraph.createUID();this.splitCSV=function(str,split)
|
4
|
+
{var arr=[];var field='';var inDoubleQuotes=false;var inSingleQuotes=false;var preserve=(typeof split==='object'&&split.preserve)?true:false;if(typeof split==='object'){if(typeof split.char==='string'){split=split.char;}else{split=',';}}
|
5
|
+
for(var i=0,len=str.length;i<len;i+=1){char=str.charAt(i);if((char==='"')&&!inDoubleQuotes){inDoubleQuotes=true;continue;}else if((char==='"')&&inDoubleQuotes){inDoubleQuotes=false;continue;}
|
6
|
+
if((char==="'")&&!inSingleQuotes){inSingleQuotes=true;continue;}else if((char==="'")&&inSingleQuotes){inSingleQuotes=false;continue;}else if(char===split&&!inDoubleQuotes&&!inSingleQuotes){arr.push(field);field='';continue;}else{field=field+char;}}
|
7
|
+
arr.push(field);if(!preserve){for(i=0,len=arr.length;i<len;i+=1){arr[i]=arr[i].trim();}}
|
8
|
+
return arr;};this.fetch=function()
|
9
|
+
{var sep=this.seperator,eol=this.endofline,obj=this;if(this.url.substring(0,3)==='id:'||this.url.substring(0,4)==='str:'){if(this.url.substring(0,3)==='id:'){var data=document.getElementById(this.url.substring(3)).innerHTML.trim();}else if(this.url.substring(0,4)==='str:'){var data=this.url.substring(4).trim();}
|
10
|
+
obj.data=data.split(eol);obj.numrows=obj.data.length;for(var i=0,len=obj.data.length;i<len;i+=1){var row=obj.splitCSV(obj.data[i],{preserve:false,char:sep});if(!obj.numcols){obj.numcols=row.length;}
|
11
|
+
for(var j=0;j<row.length;j+=1){if((/^\-?[0-9.]+$/).test(row[j])){row[j]=parseFloat(row[j]);}
|
12
|
+
obj.data[i]=row;}}
|
13
|
+
obj.ready(obj);}else{RGraph.AJAX.getString(this.url,function(data)
|
14
|
+
{data=data.replace(/(\r?\n)+$/,'');obj.data=data.split(eol);obj.numrows=obj.data.length;for(var i=0,len=obj.data.length;i<len;i+=1){var row=obj.splitCSV(obj.data[i],{preserve:false,char:sep});if(!obj.numcols){obj.numcols=row.length;}
|
15
|
+
for(var j=0;j<row.length;j+=1){if((/^\-?[0-9.]+$/).test(row[j])){row[j]=parseFloat(row[j]);}
|
16
|
+
obj.data[i]=row;}}
|
17
|
+
obj.ready(obj);});}};this.getRow=function(index)
|
18
|
+
{var row=[];var start=arguments[1]||0;for(var i=start;i<this.numcols;i+=1){row.push(this.data[index][i]);}
|
19
|
+
return row;};this.getCol=this.getColumn=function(index)
|
20
|
+
{var col=[];var start=arguments[1]||0;for(var i=start;i<this.numrows;i+=1){col.push(this.data[i][index]);}
|
21
|
+
return col;};this.fetch();};
|
@@ -1,451 +1,36 @@
|
|
1
|
-
// version: 2017-05-08
|
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 licensed under the Open Source MIT license. That means that it's |
|
9
|
-
* | totally free to use! |
|
10
|
-
* o--------------------------------------------------------------------------------o
|
11
|
-
*/
|
12
1
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
(
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
// Handle undefined - change it to an empty string
|
50
|
-
if ((typeof(text) != 'string' && typeof(text) != 'number') || text == 'undefined') {
|
51
|
-
return;
|
52
|
-
}
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
/**
|
58
|
-
* This accommodates multi-line text
|
59
|
-
*/
|
60
|
-
if (typeof(text) == 'string' && text.match(/\r\n/)) {
|
61
|
-
|
62
|
-
var dimensions = RGraph.MeasureText('M', args[11], font, size);
|
63
|
-
|
64
|
-
/**
|
65
|
-
* Measure the text (width and height)
|
66
|
-
*/
|
67
|
-
|
68
|
-
var arr = text.split('\r\n');
|
69
|
-
|
70
|
-
/**
|
71
|
-
* Adjust the Y position
|
72
|
-
*/
|
73
|
-
|
74
|
-
// This adjusts the initial y position
|
75
|
-
if (args[6] && args[6] == 'center') y = (y - (dimensions[1] * ((arr.length - 1) / 2)));
|
76
|
-
|
77
|
-
for (var i=1; i<arr.length; ++i) {
|
78
|
-
|
79
|
-
RGraph.Text(context,
|
80
|
-
font,
|
81
|
-
size,
|
82
|
-
args[9] == -90 ? (x + (size * 1.5)) : x,
|
83
|
-
y + (dimensions[1] * i),
|
84
|
-
arr[i],
|
85
|
-
args[6] ? args[6] : null,
|
86
|
-
args[7],
|
87
|
-
args[8],
|
88
|
-
args[9],
|
89
|
-
args[10],
|
90
|
-
args[11],
|
91
|
-
args[12]);
|
92
|
-
}
|
93
|
-
|
94
|
-
// Update text to just be the first line
|
95
|
-
text = arr[0];
|
96
|
-
}
|
97
|
-
|
98
|
-
|
99
|
-
// Accommodate MSIE
|
100
|
-
if (document.all && RGraph.ISOLD) {
|
101
|
-
y += 2;
|
102
|
-
}
|
103
|
-
|
104
|
-
|
105
|
-
context.font = (args[11] ? 'Bold ': '') + size + 'pt ' + font;
|
106
|
-
|
107
|
-
var i;
|
108
|
-
var origX = x;
|
109
|
-
var origY = y;
|
110
|
-
var originalFillStyle = context.fillStyle;
|
111
|
-
var originalLineWidth = context.lineWidth;
|
112
|
-
|
113
|
-
// Need these now the angle can be specified, ie defaults for the former two args
|
114
|
-
if (typeof(args[6]) == 'undefined') args[6] = 'bottom'; // Vertical alignment. Default to bottom/baseline
|
115
|
-
if (typeof(args[7]) == 'undefined') args[7] = 'left'; // Horizontal alignment. Default to left
|
116
|
-
if (typeof(args[8]) == 'undefined') args[8] = null; // Show a bounding box. Useful for positioning during development. Defaults to false
|
117
|
-
if (typeof(args[9]) == 'undefined') args[9] = 0; // Angle (IN DEGREES) that the text should be drawn at. 0 is middle right, and it goes clockwise
|
118
|
-
|
119
|
-
// The alignment is recorded here for purposes of Opera compatibility
|
120
|
-
if (navigator.userAgent.indexOf('Opera') != -1) {
|
121
|
-
context.canvas.__rgraph_valign__ = args[6];
|
122
|
-
context.canvas.__rgraph_halign__ = args[7];
|
123
|
-
}
|
124
|
-
|
125
|
-
// First, translate to x/y coords
|
126
|
-
context.save();
|
127
|
-
|
128
|
-
context.canvas.__rgraph_originalx__ = x;
|
129
|
-
context.canvas.__rgraph_originaly__ = y;
|
130
|
-
|
131
|
-
context.translate(x, y);
|
132
|
-
x = 0;
|
133
|
-
y = 0;
|
134
|
-
|
135
|
-
// Rotate the canvas if need be
|
136
|
-
if (args[9]) {
|
137
|
-
context.rotate(args[9] / (180 / RGraph.PI));
|
138
|
-
}
|
139
|
-
|
140
|
-
|
141
|
-
// Vertical alignment - defaults to bottom
|
142
|
-
if (args[6]) {
|
143
|
-
|
144
|
-
var vAlign = args[6];
|
145
|
-
|
146
|
-
if (vAlign == 'center') {
|
147
|
-
context.textBaseline = 'middle';
|
148
|
-
} else if (vAlign == 'top') {
|
149
|
-
context.textBaseline = 'top';
|
150
|
-
}
|
151
|
-
}
|
152
|
-
|
153
|
-
|
154
|
-
// Hoeizontal alignment - defaults to left
|
155
|
-
if (args[7]) {
|
156
|
-
|
157
|
-
var hAlign = args[7];
|
158
|
-
var width = context.measureText(text).width;
|
159
|
-
|
160
|
-
if (hAlign) {
|
161
|
-
if (hAlign == 'center') {
|
162
|
-
context.textAlign = 'center';
|
163
|
-
} else if (hAlign == 'right') {
|
164
|
-
context.textAlign = 'right';
|
165
|
-
}
|
166
|
-
}
|
167
|
-
}
|
168
|
-
|
169
|
-
|
170
|
-
context.fillStyle = originalFillStyle;
|
171
|
-
|
172
|
-
/**
|
173
|
-
* Draw a bounding box if requested
|
174
|
-
*/
|
175
|
-
context.save();
|
176
|
-
context.fillText(text,0,0);
|
177
|
-
context.lineWidth = 1;
|
178
|
-
|
179
|
-
var width = context.measureText(text).width;
|
180
|
-
var width_offset = (hAlign == 'center' ? (width / 2) : (hAlign == 'right' ? width : 0));
|
181
|
-
var height = size * 1.5; // !!!
|
182
|
-
var height_offset = (vAlign == 'center' ? (height / 2) : (vAlign == 'top' ? height : 0));
|
183
|
-
var ieOffset = RGraph.ISOLD ? 2 : 0;
|
184
|
-
|
185
|
-
if (args[8]) {
|
186
|
-
|
187
|
-
context.strokeRect(-3 - width_offset,
|
188
|
-
0 - 3 - height - ieOffset + height_offset,
|
189
|
-
width + 6,
|
190
|
-
height + 6);
|
191
|
-
/**
|
192
|
-
* If requested, draw a background for the text
|
193
|
-
*/
|
194
|
-
if (args[10]) {
|
195
|
-
context.fillStyle = args[10];
|
196
|
-
context.fillRect(-3 - width_offset,
|
197
|
-
0 - 3 - height - ieOffset + height_offset,
|
198
|
-
width + 6,
|
199
|
-
height + 6);
|
200
|
-
}
|
201
|
-
|
202
|
-
|
203
|
-
context.fillStyle = originalFillStyle;
|
204
|
-
|
205
|
-
|
206
|
-
/**
|
207
|
-
* Do the actual drawing of the text
|
208
|
-
*/
|
209
|
-
context.fillText(text,0,0);
|
210
|
-
}
|
211
|
-
context.restore();
|
212
|
-
|
213
|
-
// Reset the lineWidth
|
214
|
-
context.lineWidth = originalLineWidth;
|
215
|
-
|
216
|
-
context.restore();
|
217
|
-
};
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
/**
|
223
|
-
* This function returns the mouse position in relation to the canvas
|
224
|
-
*
|
225
|
-
* @param object e The event object.
|
226
|
-
*/
|
227
|
-
RG.getMouseXY = function (e)
|
228
|
-
{
|
229
|
-
var el = (RGraph.ISOLD ? event.srcElement : e.target);
|
230
|
-
var x;
|
231
|
-
var y;
|
232
|
-
|
233
|
-
// ???
|
234
|
-
var paddingLeft = el.style.paddingLeft ? parseInt(el.style.paddingLeft) : 0;
|
235
|
-
var paddingTop = el.style.paddingTop ? parseInt(el.style.paddingTop) : 0;
|
236
|
-
var borderLeft = el.style.borderLeftWidth ? parseInt(el.style.borderLeftWidth) : 0;
|
237
|
-
var borderTop = el.style.borderTopWidth ? parseInt(el.style.borderTopWidth) : 0;
|
238
|
-
|
239
|
-
if (RGraph.ISIE8) e = event;
|
240
|
-
|
241
|
-
// Browser with offsetX and offsetY
|
242
|
-
if (typeof(e.offsetX) == 'number' && typeof(e.offsetY) == 'number') {
|
243
|
-
x = e.offsetX;
|
244
|
-
y = e.offsetY;
|
245
|
-
|
246
|
-
// FF and other
|
247
|
-
} else {
|
248
|
-
x = 0;
|
249
|
-
y = 0;
|
250
|
-
|
251
|
-
while (el != document.body && el) {
|
252
|
-
x += el.offsetLeft;
|
253
|
-
y += el.offsetTop;
|
254
|
-
|
255
|
-
el = el.offsetParent;
|
256
|
-
}
|
257
|
-
|
258
|
-
x = e.pageX - x;
|
259
|
-
y = e.pageY - y;
|
260
|
-
}
|
261
|
-
|
262
|
-
return [x, y];
|
263
|
-
};
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
/**
|
269
|
-
* This function attempts to "fill in" missing functions from the canvas
|
270
|
-
* context object. Only two at the moment - measureText() nd fillText().
|
271
|
-
*
|
272
|
-
* @param object context The canvas 2D context
|
273
|
-
*/
|
274
|
-
RG.oldBrowserCompat =
|
275
|
-
RG.OldBrowserCompat = function (co)
|
276
|
-
{
|
277
|
-
if (!co) {
|
278
|
-
return;
|
279
|
-
}
|
280
|
-
|
281
|
-
if (!co.measureText) {
|
282
|
-
|
283
|
-
// This emulates the measureText() function
|
284
|
-
co.measureText = function (text)
|
285
|
-
{
|
286
|
-
var textObj = document.createElement('DIV');
|
287
|
-
textObj.innerHTML = text;
|
288
|
-
textObj.style.position = 'absolute';
|
289
|
-
textObj.style.top = '-100px';
|
290
|
-
textObj.style.left = 0;
|
291
|
-
document.body.appendChild(textObj);
|
292
|
-
|
293
|
-
var width = {width: textObj.offsetWidth};
|
294
|
-
|
295
|
-
textObj.style.display = 'none';
|
296
|
-
|
297
|
-
return width;
|
298
|
-
}
|
299
|
-
}
|
300
|
-
|
301
|
-
if (!co.fillText) {
|
302
|
-
// This emulates the fillText() method
|
303
|
-
co.fillText = function (text, targetX, targetY)
|
304
|
-
{
|
305
|
-
return false;
|
306
|
-
}
|
307
|
-
}
|
308
|
-
|
309
|
-
// If IE8, add addEventListener()
|
310
|
-
if (!co.canvas.addEventListener) {
|
311
|
-
window.addEventListener = function (ev, func, bubble)
|
312
|
-
{
|
313
|
-
return this.attachEvent('on' + ev, func);
|
314
|
-
}
|
315
|
-
|
316
|
-
co.canvas.addEventListener = function (ev, func, bubble)
|
317
|
-
{
|
318
|
-
return this.attachEvent('on' + ev, func);
|
319
|
-
}
|
320
|
-
}
|
321
|
-
};
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
/**
|
327
|
-
* Similar to the jQuery each() function - this lets you iterate easily over an array. The 'this' variable is set]
|
328
|
-
* to the array in the callback function.
|
329
|
-
*
|
330
|
-
* @param array arr The array
|
331
|
-
* @param function func The function to call
|
332
|
-
* @param object Optionally you can specify the object that the "this" variable is set to
|
333
|
-
*/
|
334
|
-
RG.each = function (arr, func)
|
335
|
-
{
|
336
|
-
for(var i=0, len=arr.length; i<len; i+=1) {
|
337
|
-
|
338
|
-
if (typeof arguments[2] !== 'undefined') {
|
339
|
-
var ret = func.call(arguments[2], i, arr[i]);
|
340
|
-
} else {
|
341
|
-
var ret = func.call(arr, i, arr[i]);
|
342
|
-
}
|
343
|
-
|
344
|
-
if (ret === false) {
|
345
|
-
return;
|
346
|
-
}
|
347
|
-
}
|
348
|
-
};
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
/**
|
354
|
-
* An old function the was used before all 4 gutters were added
|
355
|
-
*
|
356
|
-
* DEPRECATED
|
357
|
-
*
|
358
|
-
* @param object obj The chart object
|
359
|
-
*/
|
360
|
-
RG.getHeight =
|
361
|
-
RG.GetHeight = function (obj)
|
362
|
-
{
|
363
|
-
return obj.canvas.height;
|
364
|
-
};
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
/**
|
370
|
-
* An old function the was used before all 4 gutters were added
|
371
|
-
*
|
372
|
-
* DEPRECATED
|
373
|
-
*
|
374
|
-
* @param object obj The chart object
|
375
|
-
*/
|
376
|
-
RG.getWidth =
|
377
|
-
RG.GetWidth = function (obj)
|
378
|
-
{
|
379
|
-
return obj.canvas.width;
|
380
|
-
};
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
/**
|
386
|
-
* A timer function for measuring... time!
|
387
|
-
*
|
388
|
-
* @param string label A string to associate with this 'checkpoint'
|
389
|
-
*/
|
390
|
-
RG.timer =
|
391
|
-
RG.Timer = function (label)
|
392
|
-
{
|
393
|
-
if(typeof RG.TIMER_LAST_CHECKPOINT == 'undefined') {
|
394
|
-
|
395
|
-
RG.TIMER_LAST_CHECKPOINT = Date.now();
|
396
|
-
}
|
397
|
-
|
398
|
-
var now = Date.now();
|
399
|
-
|
400
|
-
console.log(label+': ' + (now - RG.TIMER_LAST_CHECKPOINT).toString());
|
401
|
-
|
402
|
-
RG.TIMER_LAST_CHECKPOINT = now;
|
403
|
-
};
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
/**
|
409
|
-
* If you prefer, you can use the SetConfig() method to set the configuration information
|
410
|
-
* for your chart. You may find that setting the configuration this way eases reuse.
|
411
|
-
*
|
412
|
-
* @param object obj The graph object
|
413
|
-
* @param object config The graph configuration information
|
414
|
-
*/
|
415
|
-
RG.setConfig =
|
416
|
-
RG.SetConfig = function (obj, config)
|
417
|
-
{
|
418
|
-
for (i in config) {
|
419
|
-
if (typeof i === 'string') {
|
420
|
-
obj.Set(i, config[i]);
|
421
|
-
}
|
422
|
-
}
|
423
|
-
|
424
|
-
return obj;
|
425
|
-
};
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
// End module pattern
|
431
|
-
})(window, document);
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
/**
|
437
|
-
* Checks whether strings or numbers are empty or not. It also
|
438
|
-
* handles null or variables set to undefined. If a variable really
|
439
|
-
* is undefined - ie it hasn't been declared at all - you need to use
|
440
|
-
* "typeof variable" and check the return value - which will be undefined.
|
441
|
-
*
|
442
|
-
* @param mixed value The variable to check
|
443
|
-
*/
|
444
|
-
window.$empty = function (value)
|
445
|
-
{
|
446
|
-
if (!value || value.length <= 0) {
|
447
|
-
return true;
|
448
|
-
}
|
449
|
-
|
450
|
-
return false;
|
451
|
-
};
|
2
|
+
RGraph=window.RGraph||{isRGraph:true};(function(win,doc,undefined)
|
3
|
+
{var RG=RGraph,ua=navigator.userAgent,ma=Math;RG.text=RG.Text=function(context,font,size,x,y,text)
|
4
|
+
{var args=arguments;if((typeof(text)!='string'&&typeof(text)!='number')||text=='undefined'){return;}
|
5
|
+
if(typeof(text)=='string'&&text.match(/\r\n/)){var dimensions=RGraph.MeasureText('M',args[11],font,size);var arr=text.split('\r\n');if(args[6]&&args[6]=='center')y=(y-(dimensions[1]*((arr.length-1)/2)));for(var i=1;i<arr.length;++i){RGraph.Text(context,font,size,args[9]==-90?(x+(size*1.5)):x,y+(dimensions[1]*i),arr[i],args[6]?args[6]:null,args[7],args[8],args[9],args[10],args[11],args[12]);}
|
6
|
+
text=arr[0];}
|
7
|
+
if(document.all&&RGraph.ISOLD){y+=2;}
|
8
|
+
context.font=(args[11]?'Bold ':'')+size+'pt '+font;var i;var origX=x;var origY=y;var originalFillStyle=context.fillStyle;var originalLineWidth=context.lineWidth;if(typeof(args[6])=='undefined')args[6]='bottom';if(typeof(args[7])=='undefined')args[7]='left';if(typeof(args[8])=='undefined')args[8]=null;if(typeof(args[9])=='undefined')args[9]=0;if(navigator.userAgent.indexOf('Opera')!=-1){context.canvas.__rgraph_valign__=args[6];context.canvas.__rgraph_halign__=args[7];}
|
9
|
+
context.save();context.canvas.__rgraph_originalx__=x;context.canvas.__rgraph_originaly__=y;context.translate(x,y);x=0;y=0;if(args[9]){context.rotate(args[9]/(180/RGraph.PI));}
|
10
|
+
if(args[6]){var vAlign=args[6];if(vAlign=='center'){context.textBaseline='middle';}else if(vAlign=='top'){context.textBaseline='top';}}
|
11
|
+
if(args[7]){var hAlign=args[7];var width=context.measureText(text).width;if(hAlign){if(hAlign=='center'){context.textAlign='center';}else if(hAlign=='right'){context.textAlign='right';}}}
|
12
|
+
context.fillStyle=originalFillStyle;context.save();context.fillText(text,0,0);context.lineWidth=1;var width=context.measureText(text).width;var width_offset=(hAlign=='center'?(width/2):(hAlign=='right'?width:0));var height=size*1.5;var height_offset=(vAlign=='center'?(height/2):(vAlign=='top'?height:0));var ieOffset=RGraph.ISOLD?2:0;if(args[8]){context.strokeRect(-3-width_offset,0-3-height-ieOffset+height_offset,width+6,height+6);if(args[10]){context.fillStyle=args[10];context.fillRect(-3-width_offset,0-3-height-ieOffset+height_offset,width+6,height+6);}
|
13
|
+
context.fillStyle=originalFillStyle;context.fillText(text,0,0);}
|
14
|
+
context.restore();context.lineWidth=originalLineWidth;context.restore();};RG.getMouseXY=function(e)
|
15
|
+
{var el=(RGraph.ISOLD?event.srcElement:e.target);var x;var y;var paddingLeft=el.style.paddingLeft?parseInt(el.style.paddingLeft):0;var paddingTop=el.style.paddingTop?parseInt(el.style.paddingTop):0;var borderLeft=el.style.borderLeftWidth?parseInt(el.style.borderLeftWidth):0;var borderTop=el.style.borderTopWidth?parseInt(el.style.borderTopWidth):0;if(RGraph.ISIE8)e=event;if(typeof(e.offsetX)=='number'&&typeof(e.offsetY)=='number'){x=e.offsetX;y=e.offsetY;}else{x=0;y=0;while(el!=document.body&&el){x+=el.offsetLeft;y+=el.offsetTop;el=el.offsetParent;}
|
16
|
+
x=e.pageX-x;y=e.pageY-y;}
|
17
|
+
return[x,y];};RG.oldBrowserCompat=RG.OldBrowserCompat=function(co)
|
18
|
+
{if(!co){return;}
|
19
|
+
if(!co.measureText){co.measureText=function(text)
|
20
|
+
{var textObj=document.createElement('DIV');textObj.innerHTML=text;textObj.style.position='absolute';textObj.style.top='-100px';textObj.style.left=0;document.body.appendChild(textObj);var width={width:textObj.offsetWidth};textObj.style.display='none';return width;}}
|
21
|
+
if(!co.fillText){co.fillText=function(text,targetX,targetY)
|
22
|
+
{return false;}}
|
23
|
+
if(!co.canvas.addEventListener){window.addEventListener=function(ev,func,bubble)
|
24
|
+
{return this.attachEvent('on'+ev,func);}
|
25
|
+
co.canvas.addEventListener=function(ev,func,bubble)
|
26
|
+
{return this.attachEvent('on'+ev,func);}}};RG.each=function(arr,func)
|
27
|
+
{for(var i=0,len=arr.length;i<len;i+=1){if(typeof arguments[2]!=='undefined'){var ret=func.call(arguments[2],i,arr[i]);}else{var ret=func.call(arr,i,arr[i]);}
|
28
|
+
if(ret===false){return;}}};RG.getHeight=RG.GetHeight=function(obj)
|
29
|
+
{return obj.canvas.height;};RG.getWidth=RG.GetWidth=function(obj)
|
30
|
+
{return obj.canvas.width;};RG.timer=RG.Timer=function(label)
|
31
|
+
{if(typeof RG.TIMER_LAST_CHECKPOINT=='undefined'){RG.TIMER_LAST_CHECKPOINT=Date.now();}
|
32
|
+
var now=Date.now();console.log(label+': '+(now-RG.TIMER_LAST_CHECKPOINT).toString());RG.TIMER_LAST_CHECKPOINT=now;};RG.setConfig=RG.SetConfig=function(obj,config)
|
33
|
+
{for(i in config){if(typeof i==='string'){obj.Set(i,config[i]);}}
|
34
|
+
return obj;};})(window,document);window.$empty=function(value)
|
35
|
+
{if(!value||value.length<=0){return true;}
|
36
|
+
return false;};
|