/*
	Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.charting.plot2d.Bubble"]){
dojo._hasResource["dojox.charting.plot2d.Bubble"]=true;
dojo.provide("dojox.charting.plot2d.Bubble");
dojo.require("dojox.charting.plot2d.Base");
dojo.require("dojox.lang.functional");
(function(){
var df=dojox.lang.functional,du=dojox.lang.utils,dc=dojox.charting.plot2d.common,_1=df.lambda("item.purgeGroup()");
dojo.declare("dojox.charting.plot2d.Bubble",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y",animate:null},optionalParams:{stroke:{},outline:{},shadow:{},fill:{},font:"",fontColor:""},constructor:function(_2,_3){
this.opt=dojo.clone(this.defaultParams);
du.updateWithObject(this.opt,_3);
this.series=[];
this.hAxis=this.opt.hAxis;
this.vAxis=this.opt.vAxis;
this.animate=this.opt.animate;
},render:function(_4,_5){
if(this.zoom&&!this.isDataDirty()){
return this.performZoom(_4,_5);
}
this.resetEvents();
this.dirty=this.isDirty();
if(this.dirty){
dojo.forEach(this.series,_1);
this._eventSeries={};
this.cleanGroup();
var s=this.group;
df.forEachRev(this.series,function(_6){
_6.cleanGroup(s);
});
}
var t=this.chart.theme,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_7=this.events();
for(var i=this.series.length-1;i>=0;--i){
var _8=this.series[i];
if(!this.dirty&&!_8.dirty){
t.skip();
this._reconnectEvents(_8.name);
continue;
}
_8.cleanGroup();
if(!_8.data.length){
_8.dirty=false;
t.skip();
continue;
}
if(typeof _8.data[0]=="number"){
console.warn("dojox.charting.plot2d.Bubble: the data in the following series cannot be rendered as a bubble chart; ",_8);
continue;
}
var _9=t.next("circle",[this.opt,_8]),s=_8.group,_a=dojo.map(_8.data,function(v,i){
return v?{x:ht(v.x)+_5.l,y:_4.height-_5.b-vt(v.y),radius:this._vScaler.bounds.scale*(v.size/2)}:null;
},this);
var _b=null,_c=null,_d=null;
if(_9.series.shadow){
_d=dojo.map(_a,function(_e){
if(_e!==null){
var _f=t.addMixin(_9,"circle",_e,true),_10=_f.series.shadow;
var _11=s.createCircle({cx:_e.x+_10.dx,cy:_e.y+_10.dy,r:_e.radius}).setStroke(_10).setFill(_10.color);
if(this.animate){
this._animateBubble(_11,_4.height-_5.b,_e.radius);
}
return _11;
}
return null;
},this);
if(_d.length){
_8.dyn.shadow=_d[_d.length-1].getStroke();
}
}
if(_9.series.outline){
_c=dojo.map(_a,function(_12){
if(_12!==null){
var _13=t.addMixin(_9,"circle",_12,true),_14=dc.makeStroke(_13.series.outline);
_14.width=2*_14.width+_9.series.stroke.width;
var _15=s.createCircle({cx:_12.x,cy:_12.y,r:_12.radius}).setStroke(_14);
if(this.animate){
this._animateBubble(_15,_4.height-_5.b,_12.radius);
}
return _15;
}
return null;
},this);
if(_c.length){
_8.dyn.outline=_c[_c.length-1].getStroke();
}
}
_b=dojo.map(_a,function(_16){
if(_16!==null){
var _17=t.addMixin(_9,"circle",_16,true),_18={x:_16.x-_16.radius,y:_16.y-_16.radius,width:2*_16.radius,height:2*_16.radius};
var _19=this._plotFill(_17.series.fill,_4,_5);
_19=this._shapeFill(_19,_18);
var _1a=s.createCircle({cx:_16.x,cy:_16.y,r:_16.radius}).setFill(_19).setStroke(_17.series.stroke);
if(this.animate){
this._animateBubble(_1a,_4.height-_5.b,_16.radius);
}
return _1a;
}
return null;
},this);
if(_b.length){
_8.dyn.fill=_b[_b.length-1].getFill();
_8.dyn.stroke=_b[_b.length-1].getStroke();
}
if(_7){
var _1b=new Array(_b.length);
dojo.forEach(_b,function(s,i){
if(s!==null){
var o={element:"circle",index:i,run:_8,shape:s,outline:_c&&_c[i]||null,shadow:_d&&_d[i]||null,x:_8.data[i].x,y:_8.data[i].y,r:_8.data[i].size/2,cx:_a[i].x,cy:_a[i].y,cr:_a[i].radius};
this._connectEvents(o);
_1b[i]=o;
}
},this);
this._eventSeries[_8.name]=_1b;
}else{
delete this._eventSeries[_8.name];
}
_8.dirty=false;
}
this.dirty=false;
return this;
},_animateBubble:function(_1c,_1d,_1e){
dojox.gfx.fx.animateTransform(dojo.delegate({shape:_1c,duration:1200,transform:[{name:"translate",start:[0,_1d],end:[0,0]},{name:"scale",start:[0,1/_1e],end:[1,1]},{name:"original"}]},this.animate)).play();
}});
})();
}
