blob: 9b3225c21b54684fb8bb5a97b0f9e5aef5af464c [file] [log] [blame]
/*
Copyright (c) 2004-2005, The Dojo Foundation
All Rights Reserved.
Licensed under the Academic Free License version 2.1 or above OR the
modified BSD license. For more information on Dojo licensing, see:
http://dojotoolkit.org/community/licensing.shtml
*/
dojo.provide("dojo.widget.Chart");
dojo.provide("dojo.widget.Chart.DataSeries");
dojo.require("dojo.widget.*");
dojo.require("dojo.widget.Widget");
dojo.require("dojo.graphics.color");
dojo.widget.tags.addParseTreeHandler("dojo:chart");
dojo.requireAfterIf(dojo.render.svg.support.builtin, "dojo.widget.svg.Chart");
dojo.widget.Chart=function(){
dojo.widget.Widget.call(this);
this.widgetType="Chart";
this.isContainer=false;
this.series=[];
this.assignColors=function(){
var hue=30, sat=120, lum=120;
var steps = Math.round(330/this.series.length);
for (var i=0; i<this.series.length; i++){
var c=dojo.graphics.color.hsl2rgb(hue,sat,lum);
if (!this.series[i].color)
this.series[i].color=dojo.graphics.color.rgb2hex(c[0],c[1],c[2]);
hue+=steps;
}
};
}
dojo.inherits(dojo.widget.Chart, dojo.widget.Widget);
/* Every chart has a set of data series; this is the series.
Note that each member of value is an object and in the
minimum has 2 properties: .x and .value.
*/
dojo.widget.Chart.DataSeries=function(key, label, plotType, color){
this.id="DataSeries"+dojo.widget.Chart.DataSeries.count++;
this.key=key;
this.label=label||this.id;
this.plotType=plotType||0;
this.color=color;
this.values=[];
};
dojo.widget.Chart.DataSeries.prototype={
add:function(v){
if(v.x==null||v.value==null){
dojo.raise("dojo.widget.Chart.DataSeries.add: v must have both an 'x' and 'value' property.");
}
this.values.push(v);
},
clear:function(){
this.values=[];
},
createRange:function(len){
var idx=this.values.length-1;
var length=len||this.values.length;
return {index:idx, length:length, start:Math.max(idx-length,0)};
},
// trend values
getMean:function(len){
var range=this.createRange(len);
if (range.index<0) return 0;
var t=0, c=0;
for (var i=range.index; i>=range.start; i--){
var n=parseFloat(this.values[i].value);
if (!isNaN(n)){
t+=n; c++;
}
}
t/=Math.max(c,1);
return t;
},
getMovingAverage:function(len){
var range=this.createRange(len);
if (range.index<0) return 0;
var t=0, c=0;
for (var i=range.index; i>=range.start; i--){
var n=parseFloat(this.values[i].value);
if (!isNaN(n)){
t+=n; c++;
}
}
t/=Math.max(c,1);
return t;
},
getVariance:function(len){
var range=this.createRange(len);
if (range.index < 0) return 0;
var t=0, s=0, c=0;
for (var i=range.index; i>=range.start; i--){
var n=parseFloat(this.values[i].value);
if (!isNaN(n)){
t+=n;
s+=Math.pow(n,2);
c++;
}
}
return (s/c)-Math.pow(t/c,2);
},
getStandardDeviation:function(len){
return Math.sqrt(this.getVariance(len));
},
getMax:function(len){
var range=this.createRange(len);
if (range.index < 0) return 0;
var t=0;
for (var i=range.index; i>=range.start; i--){
var n=parseFloat(this.values[i].value);
if (!isNaN(n)){
t=Math.max(n,t);
}
}
return t;
},
getMin:function(len){
var range=this.createRange(len);
if (range.index < 0) return 0;
var t=0;
for (var i=range.index; i>=range.start; i--){
var n=parseFloat(this.values[i].value);
if (!isNaN(n)){
t=Math.min(n,t);
}
}
return t;
},
getMedian:function(len){
var range=this.createRange(len);
if (range.index<0) return 0;
var a=[];
for (var i=range.index; i>=range.start; i--){
var n=parseFloat(this.values[i].value);
if (!isNaN(n)){
var b=false;
for(var j=0; j<a.length&&!b; j++){
if (n==a[j]) b=true;
}
if(!b) a.push(n);
}
}
a.sort();
if(a.length>0) return a[Math.ceil(a.length/2)];
return 0;
},
getMode:function(len){
var range=this.createRange(len);
if (range.index<0) return 0;
var o={}, ret=0, m=0;
for (var i=range.index; i>=range.start; i--){
var n=parseFloat(this.values[i].value);
if (!isNaN(n)){
if (!o[this.values[i].value]) o[this.values[i].value] = 1;
else o[this.values[i].value]++;
}
}
for (var p in o){
if(m<o[p]){
m=o[p]; ret=p;
}
}
return parseFloat(ret);
}
};