Subversion Repositories Applications.papyrus

Rev

Rev 1372 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1372 Rev 1422
1
/*
1
/*
2
	Copyright (c) 2004-2006, The Dojo Foundation
2
	Copyright (c) 2004-2006, The Dojo Foundation
3
	All Rights Reserved.
3
	All Rights Reserved.
4
 
4
 
5
	Licensed under the Academic Free License version 2.1 or above OR the
5
	Licensed under the Academic Free License version 2.1 or above OR the
6
	modified BSD license. For more information on Dojo licensing, see:
6
	modified BSD license. For more information on Dojo licensing, see:
7
 
7
 
8
		http://dojotoolkit.org/community/licensing.shtml
8
		http://dojotoolkit.org/community/licensing.shtml
9
*/
9
*/
-
 
10
 
-
 
11
 
10
 
12
 
11
dojo.provide("dojo.widget.Chart");
13
dojo.provide("dojo.widget.Chart");
12
dojo.require("dojo.widget.*");
14
dojo.require("dojo.widget.*");
13
dojo.require("dojo.gfx.color");
15
dojo.require("dojo.gfx.color");
14
dojo.require("dojo.gfx.color.hsl");
16
dojo.require("dojo.gfx.color.hsl");
15
dojo.declare("dojo.widget.Chart", null, function () {
17
dojo.declare("dojo.widget.Chart", null, function () {
16
	this.series = [];
18
	this.series = [];
17
}, {isContainer:false, assignColors:function () {
19
}, {isContainer:false, assignColors:function () {
18
	var hue = 30;
20
	var hue = 30;
19
	var sat = 120;
21
	var sat = 120;
20
	var lum = 120;
22
	var lum = 120;
21
	var steps = Math.round(330 / this.series.length);
23
	var steps = Math.round(330 / this.series.length);
22
	for (var i = 0; i < this.series.length; i++) {
24
	for (var i = 0; i < this.series.length; i++) {
23
		var c = dojo.gfx.color.hsl2rgb(hue, sat, lum);
25
		var c = dojo.gfx.color.hsl2rgb(hue, sat, lum);
24
		if (!this.series[i].color) {
26
		if (!this.series[i].color) {
25
			this.series[i].color = dojo.gfx.color.rgb2hex(c[0], c[1], c[2]);
27
			this.series[i].color = dojo.gfx.color.rgb2hex(c[0], c[1], c[2]);
26
		}
28
		}
27
		hue += steps;
29
		hue += steps;
28
	}
30
	}
29
}, parseData:function (table) {
31
}, parseData:function (table) {
30
	var thead = table.getElementsByTagName("thead")[0];
32
	var thead = table.getElementsByTagName("thead")[0];
31
	var tbody = table.getElementsByTagName("tbody")[0];
33
	var tbody = table.getElementsByTagName("tbody")[0];
32
	if (!(thead && tbody)) {
34
	if (!(thead && tbody)) {
33
		dojo.raise("dojo.widget.Chart: supplied table must define a head and a body.");
35
		dojo.raise("dojo.widget.Chart: supplied table must define a head and a body.");
34
	}
36
	}
35
	var columns = thead.getElementsByTagName("tr")[0].getElementsByTagName("th");
37
	var columns = thead.getElementsByTagName("tr")[0].getElementsByTagName("th");
36
	for (var i = 1; i < columns.length; i++) {
38
	for (var i = 1; i < columns.length; i++) {
37
		var key = "column" + i;
39
		var key = "column" + i;
38
		var label = columns[i].innerHTML;
40
		var label = columns[i].innerHTML;
39
		var plotType = columns[i].getAttribute("plotType") || "line";
41
		var plotType = columns[i].getAttribute("plotType") || "line";
40
		var color = columns[i].getAttribute("color");
42
		var color = columns[i].getAttribute("color");
41
		var ds = new dojo.widget.Chart.DataSeries(key, label, plotType, color);
43
		var ds = new dojo.widget.Chart.DataSeries(key, label, plotType, color);
42
		this.series.push(ds);
44
		this.series.push(ds);
43
	}
45
	}
44
	var rows = tbody.rows;
46
	var rows = tbody.rows;
45
	var xMin = Number.MAX_VALUE, xMax = Number.MIN_VALUE;
47
	var xMin = Number.MAX_VALUE, xMax = Number.MIN_VALUE;
46
	var yMin = Number.MAX_VALUE, yMax = Number.MIN_VALUE;
48
	var yMin = Number.MAX_VALUE, yMax = Number.MIN_VALUE;
47
	var ignore = ["accesskey", "align", "bgcolor", "class", "colspan", "height", "id", "nowrap", "rowspan", "style", "tabindex", "title", "valign", "width"];
49
	var ignore = ["accesskey", "align", "bgcolor", "class", "colspan", "height", "id", "nowrap", "rowspan", "style", "tabindex", "title", "valign", "width"];
48
	for (var i = 0; i < rows.length; i++) {
50
	for (var i = 0; i < rows.length; i++) {
49
		var row = rows[i];
51
		var row = rows[i];
50
		var cells = row.cells;
52
		var cells = row.cells;
51
		var x = Number.MIN_VALUE;
53
		var x = Number.MIN_VALUE;
52
		for (var j = 0; j < cells.length; j++) {
54
		for (var j = 0; j < cells.length; j++) {
53
			if (j == 0) {
55
			if (j == 0) {
54
				x = parseFloat(cells[j].innerHTML);
56
				x = parseFloat(cells[j].innerHTML);
55
				xMin = Math.min(xMin, x);
57
				xMin = Math.min(xMin, x);
56
				xMax = Math.max(xMax, x);
58
				xMax = Math.max(xMax, x);
57
			} else {
59
			} else {
58
				var ds = this.series[j - 1];
60
				var ds = this.series[j - 1];
59
				var y = parseFloat(cells[j].innerHTML);
61
				var y = parseFloat(cells[j].innerHTML);
60
				yMin = Math.min(yMin, y);
62
				yMin = Math.min(yMin, y);
61
				yMax = Math.max(yMax, y);
63
				yMax = Math.max(yMax, y);
62
				var o = {x:x, value:y};
64
				var o = {x:x, value:y};
63
				var attrs = cells[j].attributes;
65
				var attrs = cells[j].attributes;
64
				for (var k = 0; k < attrs.length; k++) {
66
				for (var k = 0; k < attrs.length; k++) {
65
					var attr = attrs.item(k);
67
					var attr = attrs.item(k);
66
					var bIgnore = false;
68
					var bIgnore = false;
67
					for (var l = 0; l < ignore.length; l++) {
69
					for (var l = 0; l < ignore.length; l++) {
68
						if (attr.nodeName.toLowerCase() == ignore[l]) {
70
						if (attr.nodeName.toLowerCase() == ignore[l]) {
69
							bIgnore = true;
71
							bIgnore = true;
70
							break;
72
							break;
71
						}
73
						}
72
					}
74
					}
73
					if (!bIgnore) {
75
					if (!bIgnore) {
74
						o[attr.nodeName] = attr.nodeValue;
76
						o[attr.nodeName] = attr.nodeValue;
75
					}
77
					}
76
				}
78
				}
77
				ds.add(o);
79
				ds.add(o);
78
			}
80
			}
79
		}
81
		}
80
	}
82
	}
81
	return {x:{min:xMin, max:xMax}, y:{min:yMin, max:yMax}};
83
	return {x:{min:xMin, max:xMax}, y:{min:yMin, max:yMax}};
82
}});
84
}});
83
dojo.declare("dojo.widget.Chart.DataSeries", null, function (key, label, plotType, color) {
85
dojo.declare("dojo.widget.Chart.DataSeries", null, function (key, label, plotType, color) {
84
	this.id = "DataSeries" + dojo.widget.Chart.DataSeries.count++;
86
	this.id = "DataSeries" + dojo.widget.Chart.DataSeries.count++;
85
	this.key = key;
87
	this.key = key;
86
	this.label = label || this.id;
88
	this.label = label || this.id;
87
	this.plotType = plotType || "line";
89
	this.plotType = plotType || "line";
88
	this.color = color;
90
	this.color = color;
89
	this.values = [];
91
	this.values = [];
90
}, {add:function (v) {
92
}, {add:function (v) {
91
	if (v.x == null || v.value == null) {
93
	if (v.x == null || v.value == null) {
92
		dojo.raise("dojo.widget.Chart.DataSeries.add: v must have both an 'x' and 'value' property.");
94
		dojo.raise("dojo.widget.Chart.DataSeries.add: v must have both an 'x' and 'value' property.");
93
	}
95
	}
94
	this.values.push(v);
96
	this.values.push(v);
95
}, clear:function () {
97
}, clear:function () {
96
	this.values = [];
98
	this.values = [];
97
}, createRange:function (len) {
99
}, createRange:function (len) {
98
	var idx = this.values.length - 1;
100
	var idx = this.values.length - 1;
99
	var length = (len || this.values.length);
101
	var length = (len || this.values.length);
100
	return {"index":idx, "length":length, "start":Math.max(idx - length, 0)};
102
	return {"index":idx, "length":length, "start":Math.max(idx - length, 0)};
101
}, getMean:function (len) {
103
}, getMean:function (len) {
102
	var range = this.createRange(len);
104
	var range = this.createRange(len);
103
	if (range.index < 0) {
105
	if (range.index < 0) {
104
		return 0;
106
		return 0;
105
	}
107
	}
106
	var t = 0;
108
	var t = 0;
107
	var c = 0;
109
	var c = 0;
108
	for (var i = range.index; i >= range.start; i--) {
110
	for (var i = range.index; i >= range.start; i--) {
109
		var n = parseFloat(this.values[i].value);
111
		var n = parseFloat(this.values[i].value);
110
		if (!isNaN(n)) {
112
		if (!isNaN(n)) {
111
			t += n;
113
			t += n;
112
			c++;
114
			c++;
113
		}
115
		}
114
	}
116
	}
115
	t /= Math.max(c, 1);
117
	t /= Math.max(c, 1);
116
	return t;
118
	return t;
117
}, getMovingAverage:function (len) {
119
}, getMovingAverage:function (len) {
118
	var range = this.createRange(len);
120
	var range = this.createRange(len);
119
	if (range.index < 0) {
121
	if (range.index < 0) {
120
		return 0;
122
		return 0;
121
	}
123
	}
122
	var t = 0;
124
	var t = 0;
123
	var c = 0;
125
	var c = 0;
124
	for (var i = range.index; i >= range.start; i--) {
126
	for (var i = range.index; i >= range.start; i--) {
125
		var n = parseFloat(this.values[i].value);
127
		var n = parseFloat(this.values[i].value);
126
		if (!isNaN(n)) {
128
		if (!isNaN(n)) {
127
			t += n;
129
			t += n;
128
			c++;
130
			c++;
129
		}
131
		}
130
	}
132
	}
131
	t /= Math.max(c, 1);
133
	t /= Math.max(c, 1);
132
	return t;
134
	return t;
133
}, getVariance:function (len) {
135
}, getVariance:function (len) {
134
	var range = this.createRange(len);
136
	var range = this.createRange(len);
135
	if (range.index < 0) {
137
	if (range.index < 0) {
136
		return 0;
138
		return 0;
137
	}
139
	}
138
	var t = 0;
140
	var t = 0;
139
	var s = 0;
141
	var s = 0;
140
	var c = 0;
142
	var c = 0;
141
	for (var i = range.index; i >= range.start; i--) {
143
	for (var i = range.index; i >= range.start; i--) {
142
		var n = parseFloat(this.values[i].value);
144
		var n = parseFloat(this.values[i].value);
143
		if (!isNaN(n)) {
145
		if (!isNaN(n)) {
144
			t += n;
146
			t += n;
145
			s += Math.pow(n, 2);
147
			s += Math.pow(n, 2);
146
			c++;
148
			c++;
147
		}
149
		}
148
	}
150
	}
149
	return (s / c) - Math.pow(t / c, 2);
151
	return (s / c) - Math.pow(t / c, 2);
150
}, getStandardDeviation:function (len) {
152
}, getStandardDeviation:function (len) {
151
	return Math.sqrt(this.getVariance(len));
153
	return Math.sqrt(this.getVariance(len));
152
}, getMax:function (len) {
154
}, getMax:function (len) {
153
	var range = this.createRange(len);
155
	var range = this.createRange(len);
154
	if (range.index < 0) {
156
	if (range.index < 0) {
155
		return 0;
157
		return 0;
156
	}
158
	}
157
	var t = 0;
159
	var t = 0;
158
	for (var i = range.index; i >= range.start; i--) {
160
	for (var i = range.index; i >= range.start; i--) {
159
		var n = parseFloat(this.values[i].value);
161
		var n = parseFloat(this.values[i].value);
160
		if (!isNaN(n)) {
162
		if (!isNaN(n)) {
161
			t = Math.max(n, t);
163
			t = Math.max(n, t);
162
		}
164
		}
163
	}
165
	}
164
	return t;
166
	return t;
165
}, getMin:function (len) {
167
}, getMin:function (len) {
166
	var range = this.createRange(len);
168
	var range = this.createRange(len);
167
	if (range.index < 0) {
169
	if (range.index < 0) {
168
		return 0;
170
		return 0;
169
	}
171
	}
170
	var t = 0;
172
	var t = 0;
171
	for (var i = range.index; i >= range.start; i--) {
173
	for (var i = range.index; i >= range.start; i--) {
172
		var n = parseFloat(this.values[i].value);
174
		var n = parseFloat(this.values[i].value);
173
		if (!isNaN(n)) {
175
		if (!isNaN(n)) {
174
			t = Math.min(n, t);
176
			t = Math.min(n, t);
175
		}
177
		}
176
	}
178
	}
177
	return t;
179
	return t;
178
}, getMedian:function (len) {
180
}, getMedian:function (len) {
179
	var range = this.createRange(len);
181
	var range = this.createRange(len);
180
	if (range.index < 0) {
182
	if (range.index < 0) {
181
		return 0;
183
		return 0;
182
	}
184
	}
183
	var a = [];
185
	var a = [];
184
	for (var i = range.index; i >= range.start; i--) {
186
	for (var i = range.index; i >= range.start; i--) {
185
		var n = parseFloat(this.values[i].value);
187
		var n = parseFloat(this.values[i].value);
186
		if (!isNaN(n)) {
188
		if (!isNaN(n)) {
187
			var b = false;
189
			var b = false;
188
			for (var j = 0; j < a.length && !b; j++) {
190
			for (var j = 0; j < a.length && !b; j++) {
189
				if (n == a[j]) {
191
				if (n == a[j]) {
190
					b = true;
192
					b = true;
191
				}
193
				}
192
			}
194
			}
193
			if (!b) {
195
			if (!b) {
194
				a.push(n);
196
				a.push(n);
195
			}
197
			}
196
		}
198
		}
197
	}
199
	}
198
	a.sort();
200
	a.sort();
199
	if (a.length > 0) {
201
	if (a.length > 0) {
200
		return a[Math.ceil(a.length / 2)];
202
		return a[Math.ceil(a.length / 2)];
201
	}
203
	}
202
	return 0;
204
	return 0;
203
}, getMode:function (len) {
205
}, getMode:function (len) {
204
	var range = this.createRange(len);
206
	var range = this.createRange(len);
205
	if (range.index < 0) {
207
	if (range.index < 0) {
206
		return 0;
208
		return 0;
207
	}
209
	}
208
	var o = {};
210
	var o = {};
209
	var ret = 0;
211
	var ret = 0;
210
	var m = 0;
212
	var m = 0;
211
	for (var i = range.index; i >= range.start; i--) {
213
	for (var i = range.index; i >= range.start; i--) {
212
		var n = parseFloat(this.values[i].value);
214
		var n = parseFloat(this.values[i].value);
213
		if (!isNaN(n)) {
215
		if (!isNaN(n)) {
214
			if (!o[this.values[i].value]) {
216
			if (!o[this.values[i].value]) {
215
				o[this.values[i].value] = 1;
217
				o[this.values[i].value] = 1;
216
			} else {
218
			} else {
217
				o[this.values[i].value]++;
219
				o[this.values[i].value]++;
218
			}
220
			}
219
		}
221
		}
220
	}
222
	}
221
	for (var p in o) {
223
	for (var p in o) {
222
		if (m < o[p]) {
224
		if (m < o[p]) {
223
			m = o[p];
225
			m = o[p];
224
			ret = p;
226
			ret = p;
225
		}
227
		}
226
	}
228
	}
227
	return parseFloat(ret);
229
	return parseFloat(ret);
228
}});
230
}});
229
dojo.requireIf(dojo.render.svg.capable, "dojo.widget.svg.Chart");
231
dojo.requireIf(dojo.render.svg.capable, "dojo.widget.svg.Chart");
230
dojo.requireIf(!dojo.render.svg.capable && dojo.render.vml.capable, "dojo.widget.vml.Chart");
232
dojo.requireIf(!dojo.render.svg.capable && dojo.render.vml.capable, "dojo.widget.vml.Chart");
231
 
233