blob: 8a7343e65bec98da6058c7d22ea5b6c34452c550 [file] [log] [blame]
dojo.provide("dojo.widget.svg.Chart");
dojo.require("dojo.widget.HtmlWidget");
dojo.require("dojo.widget.Chart");
dojo.require("dojo.html.layout");
dojo.require("dojo.math");
dojo.require("dojo.svg");
dojo.require("dojo.gfx.color");
dojo.require("dojo.json");
dojo.widget.defineWidget("dojo.widget.svg.Chart",[dojo.widget.HtmlWidget,dojo.widget.Chart],function(){
this.templatePath=null;
this.templateCssPath=null;
this._isInitialize=false;
this.hasData=false;
this.vectorNode=null;
this.plotArea=null;
this.dataGroup=null;
this.axisGroup=null;
this.properties={height:0,width:0,defaultWidth:600,defaultHeight:400,plotType:null,padding:{top:10,bottom:2,left:60,right:30},axes:{x:{plotAt:0,label:"",unitLabel:"",unitType:Number,nUnitsToShow:10,range:{min:0,max:200}},y:{plotAt:0,label:"",unitLabel:"",unitType:Number,nUnitsToShow:10,range:{min:0,max:200}}}};
},{parseProperties:function(_1){
var _2=false;
var _3=false;
if(_1.getAttribute("width")){
this.properties.width=_1.getAttribute("width");
}
if(_1.getAttribute("height")){
this.properties.height=_1.getAttribute("height");
}
if(_1.getAttribute("plotType")){
this.properties.plotType=_1.getAttribute("plotType");
}
if(_1.getAttribute("padding")){
if(_1.getAttribute("padding").indexOf(",")>-1){
var p=_1.getAttribute("padding").split(",");
}else{
var p=_1.getAttribute("padding").split(" ");
}
if(p.length==1){
var _5=parseFloat(p[0]);
this.properties.padding.top=_5;
this.properties.padding.right=_5;
this.properties.padding.bottom=_5;
this.properties.padding.left=_5;
}else{
if(p.length==2){
var _6=parseFloat(p[0]);
var _7=parseFloat(p[1]);
this.properties.padding.top=_6;
this.properties.padding.right=_7;
this.properties.padding.bottom=_6;
this.properties.padding.left=_7;
}else{
if(p.length==4){
this.properties.padding.top=parseFloat(p[0]);
this.properties.padding.right=parseFloat(p[1]);
this.properties.padding.bottom=parseFloat(p[2]);
this.properties.padding.left=parseFloat(p[3]);
}
}
}
}
if(_1.getAttribute("rangeX")){
var p=_1.getAttribute("rangeX");
if(p.indexOf(",")>-1){
p=p.split(",");
}else{
p=p.split(" ");
}
this.properties.axes.x.range.min=parseFloat(p[0]);
this.properties.axes.x.range.max=parseFloat(p[1]);
_2=true;
}
if(_1.getAttribute("rangeY")){
var p=_1.getAttribute("rangeY");
if(p.indexOf(",")>-1){
p=p.split(",");
}else{
p=p.split(" ");
}
this.properties.axes.y.range.min=parseFloat(p[0]);
this.properties.axes.y.range.max=parseFloat(p[1]);
_3=true;
}
return {rangeX:_2,rangeY:_3};
},setAxesPlot:function(_8){
if(_8.getAttribute("axisAt")){
var p=_8.getAttribute("axisAt");
if(p.indexOf(",")>-1){
p=p.split(",");
}else{
p=p.split(" ");
}
if(!isNaN(parseFloat(p[0]))){
this.properties.axes.x.plotAt=parseFloat(p[0]);
}else{
if(p[0].toLowerCase()=="ymin"){
this.properties.axes.x.plotAt=this.properties.axes.y.range.min;
}else{
if(p[0].toLowerCase()=="ymax"){
this.properties.axes.x.plotAt=this.properties.axes.y.range.max;
}
}
}
if(!isNaN(parseFloat(p[1]))){
this.properties.axes.y.plotAt=parseFloat(p[1]);
}else{
if(p[1].toLowerCase()=="xmin"){
this.properties.axes.y.plotAt=this.properties.axes.x.range.min;
}else{
if(p[1].toLowerCase()=="xmax"){
this.properties.axes.y.plotAt=this.properties.axes.x.range.max;
}
}
}
}else{
this.properties.axes.x.plotAt=this.properties.axes.y.range.min;
this.properties.axes.y.plotAt=this.properties.axes.x.range.min;
}
},drawVectorNode:function(){
dojo.svg.g.suspend();
if(this.vectorNode){
this.destroy();
}
this.vectorNode=document.createElementNS(dojo.svg.xmlns.svg,"svg");
this.vectorNode.setAttribute("width",this.properties.width);
this.vectorNode.setAttribute("height",this.properties.height);
dojo.svg.g.resume();
},drawPlotArea:function(){
dojo.svg.g.suspend();
if(this.plotArea){
this.plotArea.parentNode.removeChild(this.plotArea);
this.plotArea=null;
}
var _a=document.createElementNS(dojo.svg.xmlns.svg,"defs");
var _b=document.createElementNS(dojo.svg.xmlns.svg,"clipPath");
_b.setAttribute("id","plotClip"+this.widgetId);
var _c=document.createElementNS(dojo.svg.xmlns.svg,"rect");
_c.setAttribute("x",this.properties.padding.left);
_c.setAttribute("y",this.properties.padding.top);
_c.setAttribute("width",this.properties.width-this.properties.padding.left-this.properties.padding.right);
_c.setAttribute("height",this.properties.height-this.properties.padding.top-this.properties.padding.bottom);
_b.appendChild(_c);
_a.appendChild(_b);
this.vectorNode.appendChild(_a);
this.plotArea=document.createElementNS(dojo.svg.xmlns.svg,"g");
this.vectorNode.appendChild(this.plotArea);
var _c=document.createElementNS(dojo.svg.xmlns.svg,"rect");
_c.setAttribute("x",this.properties.padding.left);
_c.setAttribute("y",this.properties.padding.top);
_c.setAttribute("width",this.properties.width-this.properties.padding.left-this.properties.padding.right);
_c.setAttribute("height",this.properties.height-this.properties.padding.top-this.properties.padding.bottom);
_c.setAttribute("fill","#fff");
this.plotArea.appendChild(_c);
dojo.svg.g.resume();
},drawDataGroup:function(){
dojo.svg.g.suspend();
if(this.dataGroup){
this.dataGroup.parentNode.removeChild(this.dataGroup);
this.dataGroup=null;
}
this.dataGroup=document.createElementNS(dojo.svg.xmlns.svg,"g");
this.dataGroup.setAttribute("style","clip-path:url(#plotClip"+this.widgetId+");");
this.plotArea.appendChild(this.dataGroup);
dojo.svg.g.resume();
},drawAxes:function(){
dojo.svg.g.suspend();
if(this.axisGroup){
this.axisGroup.parentNode.removeChild(this.axisGroup);
this.axisGroup=null;
}
this.axisGroup=document.createElementNS(dojo.svg.xmlns.svg,"g");
this.plotArea.appendChild(this.axisGroup);
var _d=1;
var _e=document.createElementNS(dojo.svg.xmlns.svg,"line");
var y=dojo.widget.svg.Chart.Plotter.getY(this.properties.axes.x.plotAt,this);
_e.setAttribute("y1",y);
_e.setAttribute("y2",y);
_e.setAttribute("x1",this.properties.padding.left-_d);
_e.setAttribute("x2",this.properties.width-this.properties.padding.right);
_e.setAttribute("style","stroke:#000;stroke-width:"+_d+";");
this.axisGroup.appendChild(_e);
var _10=10;
var _11=document.createElementNS(dojo.svg.xmlns.svg,"text");
_11.setAttribute("x",this.properties.padding.left);
_11.setAttribute("y",this.properties.height-this.properties.padding.bottom+_10+2);
_11.setAttribute("style","text-anchor:middle;font-size:"+_10+"px;fill:#000;");
_11.appendChild(document.createTextNode(dojo.math.round(parseFloat(this.properties.axes.x.range.min),2)));
this.axisGroup.appendChild(_11);
var _11=document.createElementNS(dojo.svg.xmlns.svg,"text");
_11.setAttribute("x",this.properties.width-this.properties.padding.right-(_10/2));
_11.setAttribute("y",this.properties.height-this.properties.padding.bottom+_10+2);
_11.setAttribute("style","text-anchor:middle;font-size:"+_10+"px;fill:#000;");
_11.appendChild(document.createTextNode(dojo.math.round(parseFloat(this.properties.axes.x.range.max),2)));
this.axisGroup.appendChild(_11);
var _e=document.createElementNS(dojo.svg.xmlns.svg,"line");
var x=dojo.widget.svg.Chart.Plotter.getX(this.properties.axes.y.plotAt,this);
_e.setAttribute("x1",x);
_e.setAttribute("x2",x);
_e.setAttribute("y1",this.properties.padding.top);
_e.setAttribute("y2",this.properties.height-this.properties.padding.bottom);
_e.setAttribute("style","stroke:#000;stroke-width:"+_d+";");
this.axisGroup.appendChild(_e);
var _11=document.createElementNS(dojo.svg.xmlns.svg,"text");
_11.setAttribute("x",this.properties.padding.left-4);
_11.setAttribute("y",this.properties.height-this.properties.padding.bottom);
_11.setAttribute("style","text-anchor:end;font-size:"+_10+"px;fill:#000;");
_11.appendChild(document.createTextNode(dojo.math.round(parseFloat(this.properties.axes.y.range.min),2)));
this.axisGroup.appendChild(_11);
var _11=document.createElementNS(dojo.svg.xmlns.svg,"text");
_11.setAttribute("x",this.properties.padding.left-4);
_11.setAttribute("y",this.properties.padding.top+(_10/2));
_11.setAttribute("style","text-anchor:end;font-size:"+_10+"px;fill:#000;");
_11.appendChild(document.createTextNode(dojo.math.round(parseFloat(this.properties.axes.y.range.max),2)));
this.axisGroup.appendChild(_11);
dojo.svg.g.resume();
},init:function(){
if(!this.properties.width||!this.properties.height){
var box=dojo.html.getContentBox(this.domNode);
if(!this.properties.width){
this.properties.width=(box.width<32)?this.properties.defaultWidth:box.width;
}
if(!this.properties.height){
this.properties.height=(box.height<32)?this.properties.defaultHeight:box.height;
}
}
this.drawVectorNode();
this.drawPlotArea();
this.drawDataGroup();
this.drawAxes();
this.domNode.appendChild(this.vectorNode);
this.assignColors();
this._isInitialized=true;
},destroy:function(){
while(this.domNode.childNodes.length>0){
this.domNode.removeChild(this.domNode.childNodes.item(0));
}
this.vectorNode=this.plotArea=this.dataGroup=this.axisGroup=null;
},render:function(){
dojo.svg.g.suspend();
if(this.dataGroup){
while(this.dataGroup.childNodes.length>0){
this.dataGroup.removeChild(this.dataGroup.childNodes.item(0));
}
}else{
this.init();
}
for(var i=0;i<this.series.length;i++){
dojo.widget.svg.Chart.Plotter.plot(this.series[i],this);
}
dojo.svg.g.resume();
},postCreate:function(){
var _15=this.domNode.getElementsByTagName("table")[0];
if(_15){
var _16=this.parseProperties(_15);
var _17=false;
var _18=false;
var _19=this.parseData(_15);
if(!_17){
this.properties.axes.x.range={min:_19.x.min,max:_19.x.max};
}
if(!_18){
this.properties.axes.y.range={min:_19.y.min,max:_19.y.max};
}
this.setAxesPlot(_15);
this.domNode.removeChild(_15);
}
if(this.series.length>0){
this.render();
}
}});
dojo.widget.svg.Chart.Plotter=new function(){
var _1a=this;
var _1b={};
var _1c=dojo.widget.Chart.PlotTypes;
this.getX=function(_1d,_1e){
var v=parseFloat(_1d);
var min=_1e.properties.axes.x.range.min;
var max=_1e.properties.axes.x.range.max;
var _22=0-min;
min+=_22;
max+=_22;
v+=_22;
var _23=_1e.properties.padding.left;
var _24=_1e.properties.width-_1e.properties.padding.right;
var x=(v*((_24-_23)/max))+_23;
return x;
};
this.getY=function(_26,_27){
var v=parseFloat(_26);
var max=_27.properties.axes.y.range.max;
var min=_27.properties.axes.y.range.min;
var _2b=0;
if(min<0){
_2b+=Math.abs(min);
}
min+=_2b;
max+=_2b;
v+=_2b;
var _2c=_27.properties.height-_27.properties.padding.bottom;
var _2d=_27.properties.padding.top;
var y=(((_2c-_2d)/(max-min))*(max-v))+_2d;
return y;
};
this.addPlotter=function(_2f,_30){
_1b[_2f]=_30;
};
this.plot=function(_31,_32){
if(_31.values.length==0){
return;
}
if(_31.plotType&&_1b[_31.plotType]){
return _1b[_31.plotType](_31,_32);
}else{
if(_32.plotType&&_1b[_32.plotType]){
return _1b[_32.plotType](_31,_32);
}
}
};
_1b["bar"]=function(_33,_34){
var _35=1;
var _36=0;
for(var i=0;i<_33.values.length;i++){
var x=_1a.getX(_33.values[i].x,_34);
var w;
if(i==_33.values.length-1){
w=_36;
}else{
w=_1a.getX(_33.values[i+1].x,_34)-x-_35;
_36=w;
}
x-=(w/2);
var yA=_1a.getY(_34.properties.axes.x.plotAt,_34);
var y=_1a.getY(_33.values[i].value,_34);
var h=Math.abs(yA-y);
if(parseFloat(_33.values[i].value)<_34.properties.axes.x.plotAt){
var oy=yA;
yA=y;
y=oy;
}
var bar=document.createElementNS(dojo.svg.xmlns.svg,"rect");
bar.setAttribute("fill",_33.color);
bar.setAttribute("title",_33.label+": "+_33.values[i].value);
bar.setAttribute("stroke-width","0");
bar.setAttribute("x",x);
bar.setAttribute("y",y);
bar.setAttribute("width",w);
bar.setAttribute("height",h);
bar.setAttribute("fill-opacity","0.9");
_34.dataGroup.appendChild(bar);
}
};
_1b["line"]=function(_3f,_40){
var _41=1.5;
var _42=document.createElementNS(dojo.svg.xmlns.svg,"path");
_42.setAttribute("fill","none");
_42.setAttribute("stroke",_3f.color);
_42.setAttribute("stroke-width","2");
_42.setAttribute("stroke-opacity","0.85");
_42.setAttribute("title",_3f.label);
_40.dataGroup.appendChild(_42);
var _43=[];
for(var i=0;i<_3f.values.length;i++){
var x=_1a.getX(_3f.values[i].x,_40);
var y=_1a.getY(_3f.values[i].value,_40);
var dx=_40.properties.padding.left+1;
var dy=_40.properties.height-_40.properties.padding.bottom;
if(i>0){
dx=x-_1a.getX(_3f.values[i-1].x,_40);
dy=_1a.getY(_3f.values[i-1].value,_40);
}
if(i==0){
_43.push("M");
}else{
_43.push("C");
var cx=x-(_41-1)*(dx/_41);
_43.push(cx+","+dy);
cx=x-(dx/_41);
_43.push(cx+","+y);
}
_43.push(x+","+y);
}
_42.setAttribute("d",_43.join(" "));
};
_1b["area"]=function(_4a,_4b){
var _4c=1.5;
var _4d=document.createElementNS(dojo.svg.xmlns.svg,"path");
_4d.setAttribute("fill",_4a.color);
_4d.setAttribute("fill-opacity","0.4");
_4d.setAttribute("stroke",_4a.color);
_4d.setAttribute("stroke-width","1");
_4d.setAttribute("stroke-opacity","0.8");
_4d.setAttribute("title",_4a.label);
_4b.dataGroup.appendChild(_4d);
var _4e=[];
for(var i=0;i<_4a.values.length;i++){
var x=_1a.getX(_4a.values[i].x,_4b);
var y=_1a.getY(_4a.values[i].value,_4b);
var dx=_4b.properties.padding.left+1;
var dy=_4b.properties.height-_4b.properties.padding.bottom;
if(i>0){
dx=x-_1a.getX(_4a.values[i-1].x,_4b);
dy=_1a.getY(_4a.values[i-1].value,_4b);
}
if(i==0){
_4e.push("M");
}else{
_4e.push("C");
var cx=x-(_4c-1)*(dx/_4c);
_4e.push(cx+","+dy);
cx=x-(dx/_4c);
_4e.push(cx+","+y);
}
_4e.push(x+","+y);
}
_4e.push("L");
_4e.push(x+","+_1a.getY(0,_4b));
_4e.push("L");
_4e.push(_1a.getX(0,_4b)+","+_1a.getY(0,_4b));
_4e.push("Z");
_4d.setAttribute("d",_4e.join(" "));
},_1b["scatter"]=function(_55,_56){
var r=7;
for(var i=0;i<_55.values.length;i++){
var x=_1a.getX(_55.values[i].x,_56);
var y=_1a.getY(_55.values[i].value,_56);
var _5b=document.createElementNS(dojo.svg.xmlns.svg,"path");
_5b.setAttribute("fill",_55.color);
_5b.setAttribute("stroke-width","0");
_5b.setAttribute("title",_55.label+": "+_55.values[i].value);
_5b.setAttribute("d","M "+x+","+(y-r)+" "+"Q "+x+","+y+" "+(x+r)+","+y+" "+"Q "+x+","+y+" "+x+","+(y+r)+" "+"Q "+x+","+y+" "+(x-r)+","+y+" "+"Q "+x+","+y+" "+x+","+(y-r)+" "+"Z");
_56.dataGroup.appendChild(_5b);
}
};
_1b["bubble"]=function(_5c,_5d){
var _5e=1;
var min=_5d.properties.axes.x.range.min;
var max=_5d.properties.axes.x.range.max;
var _61=0-min;
min+=_61;
max+=_61;
var _62=_5d.properties.padding.left;
var _63=_5d.properties.width-_5d.properties.padding.right;
var _64=(max-min)/(_63-_62)*25;
for(var i=0;i<_5c.values.length;i++){
var _66=_5c.values[i].size;
if(isNaN(parseFloat(_66))){
_66=_5e;
}
var _67=document.createElementNS(dojo.svg.xmlns.svg,"circle");
_67.setAttribute("stroke-width",0);
_67.setAttribute("fill",_5c.color);
_67.setAttribute("fill-opacity","0.8");
_67.setAttribute("r",(parseFloat(_66)*_64)/2);
_67.setAttribute("cx",_1a.getX(_5c.values[i].x,_5d));
_67.setAttribute("cy",_1a.getY(_5c.values[i].value,_5d));
_67.setAttribute("title",_5c.label+": "+_5c.values[i].value+" ("+_66+")");
_5d.dataGroup.appendChild(_67);
}
};
}();