RGraph=window.RGraph||{isRGraph:true};RGraph.Waterfall=function(conf) {if(typeof conf==='object'&&typeof conf.data==='object'&&typeof conf.id==='string'){var parseConfObjectForOptions=true;}else{var conf={id:conf,data:arguments[1]};} this.id=conf.id;this.canvas=document.getElementById(this.id);this.context=this.canvas.getContext?this.canvas.getContext("2d"):null;this.canvas.__object__=this;this.type='waterfall';this.max=0;this.data=conf.data;this.isRGraph=true;this.coords=[];this.uid=RGraph.CreateUID();this.canvas.uid=this.canvas.uid?this.canvas.uid:RGraph.CreateUID();this.colorsParsed=false;this.coordsText=[];this.original_colors=[];this.firstDraw=true;this.properties={'chart.background.barcolor1':'rgba(0,0,0,0)','chart.background.barcolor2':'rgba(0,0,0,0)','chart.background.grid':true,'chart.background.grid.color':'#ddd','chart.background.grid.width':1,'chart.background.grid.hsize':20,'chart.background.grid.vsize':20,'chart.background.grid.vlines':true,'chart.background.grid.hlines':true,'chart.background.grid.border':true,'chart.background.grid.autofit':true,'chart.background.grid.autofit.align':true,'chart.background.grid.autofit.numhlines':5,'chart.background.grid.autofit.numvlines':20,'chart.background.image':null,'chart.background.hbars':null,'chart.linewidth':1,'chart.axis.linewidth':1,'chart.xaxispos':'bottom','chart.numxticks':null,'chart.numyticks':10,'chart.hmargin':5,'chart.strokestyle':'#666','chart.axis.color':'black','chart.gutter.left':25,'chart.gutter.right':25,'chart.gutter.top':25,'chart.gutter.bottom':25,'chart.labels':[],'chart.labels.bold':false,'chart.ylabels':true,'chart.text.color':'black','chart.text.size':12,'chart.text.angle':0,'chart.text.font':'Arial','chart.ymax':null,'chart.title':'','chart.title.color':'black','chart.title.background':null,'chart.title.hpos':null,'chart.title.vpos':null,'chart.title.bold':true,'chart.title.font':null,'chart.title.xaxis':'','chart.title.yaxis':'','chart.title.yaxis.bold':true,'chart.title.yaxis.size':null,'chart.title.yaxis.font':null,'chart.title.yaxis.color':null,'chart.title.xaxis.pos':null,'chart.title.yaxis.pos':null,'chart.title.yaxis.align':'left','chart.title.xaxis.bold':true,'chart.title.xaxis.size':null,'chart.title.xaxis.font':null,'chart.title.yaxis.x':null,'chart.title.yaxis.y':null,'chart.title.xaxis.x':null,'chart.title.xaxis.y':null,'chart.title.x':null,'chart.title.y':null,'chart.title.halign':null,'chart.title.valign':null,'chart.colors':['Gradient(white:green)','Gradient(white:red)','Gradient(white:blue)'],'chart.shadow':false,'chart.shadow.color':'#666','chart.shadow.offsetx':3,'chart.shadow.offsety':3,'chart.shadow.blur':3,'chart.tooltips':null,'chart.tooltips.effect':'fade','chart.tooltips.css.class':'RGraph_tooltip','chart.tooltips.event':'onclick','chart.tooltips.highlight':true,'chart.tooltips.override':null,'chart.highlight.stroke':'rgba(0,0,0,0)','chart.highlight.fill':'rgba(255,255,255,0.7)','chart.contextmenu':null,'chart.units.pre':'','chart.units.post':'','chart.scale.decimals':0,'chart.scale.point':'.','chart.scale.thousand':',','chart.crosshairs':false,'chart.crosshairs.color':'#333','chart.crosshairs.hline':true,'chart.crosshairs.vline':true,'chart.annotatable':false,'chart.annotate.color':'black','chart.zoom.factor':1.5,'chart.zoom.fade.in':true,'chart.zoom.fade.out':true,'chart.zoom.hdir':'right','chart.zoom.vdir':'down','chart.zoom.frames':25,'chart.zoom.delay':16.666,'chart.zoom.shadow':true,'chart.zoom.background':true,'chart.resizable':false,'chart.resize.handle.background':null,'chart.noaxes':false,'chart.noxaxis':false,'chart.noyaxis':false,'chart.axis.color':'black','chart.total':true,'chart.multiplier.x':1,'chart.multiplier.w':1,'chart.events.click':null,'chart.events.mousemove':null,'chart.ylabels.count':5} if(!this.canvas){alert('[WATERFALL] No canvas support');return;} for(var i=0;i<=this.data.length;++i){this['$'+i]={}} if(!this.canvas.__rgraph_aa_translated__){this.context.translate(0.5,0.5);this.canvas.__rgraph_aa_translated__=true;} var RG=RGraph,ca=this.canvas,co=ca.getContext('2d'),prop=this.properties,pa=RG.Path,pa2=RG.path2,win=window,doc=document,ma=Math if(RG.Effects&&typeof RG.Effects.decorate==='function'){RG.Effects.decorate(this);} this.set=this.Set=function(name,value) {var value=typeof arguments[1]==='undefined'?null:arguments[1];if(arguments.length===1&&typeof name==='object'){RG.parseObjectStyleConfig(this,name);return this;} if(name.substr(0,6)!='chart.'){name='chart.'+name;} name=name.replace(/([A-Z])/g,function(str) {return'.'+String(RegExp.$1).toLowerCase()});if(name=='chart.total'&&prop['chart.numxticks']==null){prop['chart.numxticks']=this.data.length;} prop[name.toLowerCase()]=value;return this;};this.get=this.Get=function(name) {if(name.substr(0,6)!='chart.'){name='chart.'+name;} name=name.replace(/([A-Z])/g,function(str) {return'.'+String(RegExp.$1).toLowerCase()});return prop[name.toLowerCase()];};this.draw=this.Draw=function() {RGraph.FireCustomEvent(this,'onbeforedraw');if(!this.colorsParsed){this.parseColors();this.colorsParsed=true;} RGraph.DrawBackgroundImage(this);this.gutterLeft=prop['chart.gutter.left'];this.gutterRight=prop['chart.gutter.right'];this.gutterTop=prop['chart.gutter.top'];this.gutterBottom=prop['chart.gutter.bottom'];this.coords=[];this.coordsText=[];this.centery=((ca.height-this.gutterTop-this.gutterBottom)/2)+this.gutterTop;this.max=0;this.grapharea=ca.height-this.gutterTop-this.gutterBottom;this.graphwidth=ca.width-this.gutterLeft-this.gutterRight;this.halfTextHeight=prop['chart.text.size']/2;this.max=this.getMax(this.data);var decimals=prop['chart.scale.decimals'];this.scale2=RGraph.getScale2(this,{'max':typeof(prop['chart.ymax'])=='number'?prop['chart.ymax']:this.max,'min':prop['chart.xmin'],'strict':typeof(prop['chart.ymax'])=='number'?true:false,'scale.decimals':Number(decimals),'scale.point':prop['chart.scale.point'],'scale.thousand':prop['chart.scale.thousand'],'scale.round':prop['chart.scale.round'],'units.pre':prop['chart.units.pre'],'units.post':prop['chart.units.post'],'ylabels.count':prop['chart.ylabels.count']});this.max=this.scale2.max;RGraph.DrawBars(this) RG.background.Draw(this);this.DrawAxes();this.Drawbars();this.DrawLabels();if(prop['chart.xaxispos']=='bottom'&&prop['chart.noaxes']==false&&prop['chart.noxaxis']==false){co.strokeStyle=prop['chart.axis.color'];co.strokeRect(prop['chart.gutter.left'],ca.height-prop['chart.gutter.bottom'],ca.width-this.gutterLeft-this.gutterRight,0);} if(prop['chart.contextmenu']){RG.ShowContext(this);} if(prop['chart.resizable']){RG.AllowResizing(this);} RG.InstallEventListeners(this);if(this.firstDraw){RG.fireCustomEvent(this,'onfirstdraw');this.firstDraw=false;this.firstDrawFunc();} RG.FireCustomEvent(this,'ondraw');return this;};this.drawAxes=this.DrawAxes=function() {if(prop['chart.noaxes']){return;} co.beginPath();co.strokeStyle=prop['chart.axis.color'];co.lineWidth=prop['chart.axis.linewidth']+0.001;if(prop['chart.noyaxis']==false){co.moveTo(Math.round(this.gutterLeft),this.gutterTop);co.lineTo(Math.round(this.gutterLeft),ca.height-this.gutterBottom);} if(prop['chart.noxaxis']==false){if(prop['chart.xaxispos']=='center'){co.moveTo(this.gutterLeft,Math.round(((ca.height-this.gutterTop-this.gutterBottom)/2)+this.gutterTop));co.lineTo(ca.width-this.gutterRight,Math.round(((ca.height-this.gutterTop-this.gutterBottom)/2)+this.gutterTop));}else{co.moveTo(this.gutterLeft,Math.round(ca.height-this.gutterBottom));co.lineTo(ca.width-this.gutterRight,Math.round(ca.height-this.gutterBottom));}} var numYTicks=prop['chart.numyticks'];if(prop['chart.noyaxis']==false&&prop['chart.numyticks']>0){var yTickGap=(ca.height-this.gutterTop-this.gutterBottom)/numYTicks;for(y=this.gutterTop;y<(ca.height-this.gutterBottom);y+=yTickGap){if(prop['chart.xaxispos']=='bottom'||(y!=((ca.height-this.gutterTop-this.gutterBottom)/2)+this.gutterTop)){co.moveTo(this.gutterLeft,Math.round(y));co.lineTo(this.gutterLeft-3,Math.round(y));}} if(prop['chart.noxaxis']||prop['chart.xaxispos']=='center'){co.moveTo(this.gutterLeft-3,Math.round(ca.height-this.gutterBottom));co.lineTo(this.gutterLeft,Math.round(ca.height-this.gutterBottom));}} if(prop['chart.numxticks']==null){prop['chart.numxticks']=this.data.length+(prop['chart.total']?1:0)} if(prop['chart.noxaxis']==false&&prop['chart.numxticks']>0){xTickGap=(ca.width-this.gutterLeft-this.gutterRight)/prop['chart.numxticks'];if(prop['chart.xaxispos']=='center'){yStart=((ca.height-this.gutterBottom-this.gutterTop)/2)+this.gutterTop-3;yEnd=((ca.height-this.gutterBottom-this.gutterTop)/2)+this.gutterTop+3;}else{yStart=ca.height-this.gutterBottom;yEnd=(ca.height-this.gutterBottom)+3;} for(x=this.gutterLeft+xTickGap;x<=ca.width-this.gutterRight+1;x+=xTickGap){co.moveTo(Math.round(x),yStart);co.lineTo(Math.round(x),yEnd);} if(prop['chart.noyaxis']){co.moveTo(Math.round(this.gutterLeft),yStart);co.lineTo(Math.round(this.gutterLeft),yEnd);}} if(prop['chart.noyaxis']&&prop['chart.noxaxis']==false){co.moveTo(Math.round(this.gutterLeft),ca.height-this.gutterBottom);co.lineTo(Math.round(this.gutterLeft),ca.height-this.gutterBottom+3);} co.stroke();};this.drawLabels=this.DrawLabels=function() {var context=co;var numYLabels=5;var interval=this.grapharea/numYLabels;var font=prop['chart.text.font'];var size=prop['chart.text.size'];var color=prop['chart.text.color'];var units_pre=prop['chart.units.pre'];var units_post=prop['chart.units.post'];co.beginPath();co.fillStyle=color;if(prop['chart.ylabels']){if(prop['chart.xaxispos']=='center'){var halfInterval=interval/2;var halfWay=((ca.height-this.gutterTop-this.gutterBottom)/2)+this.gutterTop;for(var i=0,len=this.scale2.labels.length;i0){interval=(ca.width-this.gutterLeft-this.gutterRight)/prop['chart.labels'].length;var halign='center';var angle=prop['chart.text.angle'];if(angle){halign='right';angle*=-1;} var labels=prop['chart.labels'],labelsColor=prop['chart.labels.color'],bold=prop['chart.labels.bold'] for(var i=0,len=labels.length;i0?((runningTotal+this.data[i])/this.max)*this.grapharea:(runningTotal/this.max)*this.grapharea)));var w=((ca.width-this.gutterLeft-this.gutterRight)/(this.data.length+(prop['chart.total']?1:0)))-(2*prop['chart.hmargin']);w=w*prop['chart.multiplier.w'];var h=(Math.abs(this.data[i])/this.max)*this.grapharea;if(prop['chart.xaxispos']=='center'){h/=2;y=(i==0?((this.data[0]/this.max)*this.grapharea):(this.data[i]>0?((runningTotal+this.data[i])/this.max)*this.grapharea:(runningTotal/this.max)*this.grapharea));y=this.gutterTop+(this.grapharea/2)-(y/2);} co.fillStyle=this.data[i]>=0?prop['chart.colors'][0]:prop['chart.colors'][1];if(prop['chart.shadow']){RG.SetShadow(this,prop['chart.shadow.color'],prop['chart.shadow.offsetx'],prop['chart.shadow.offsety'],prop['chart.shadow.blur']);}else{RG.NoShadow(this);} co.rect(x,y,w,h);this.coords.push([x,y,w,h]);runningTotal+=this.data[i];co.stroke();co.fill();} this.total=runningTotal;if(prop['chart.total']){h=(runningTotal/this.max)*(this.grapharea/(prop['chart.xaxispos']=='center'?2:1));if(prop['chart.xaxispos']=='center'){y=runningTotal>0?this.centery-h:this.centery-h;}else{y=ca.height-this.gutterBottom-h;} x=x+(prop['chart.hmargin']*2)+w;co.fillStyle=prop['chart.colors'][2];co.beginPath();co.strokeRect(x,y,w,h);co.fillRect(x,y,w,h);co.stroke();co.fill();this.coords.push([x,y-(runningTotal>0?0:Math.abs(h)),w,Math.abs(h)]);} RG.NoShadow(this);co.lineWidth=1;for(var i=1,len=this.coords.length;i0){co.moveTo(this.coords[i-1][0]+this.coords[i-1][2],Math.round(this.coords[i-1][1]));co.lineTo(this.coords[i-1][0]+this.coords[i-1][2]+(2*hmargin),Math.round(this.coords[i-1][1]));}else{co.moveTo(this.coords[i-1][0]+this.coords[i-1][2],Math.round(this.coords[i-1][1]+this.coords[i-1][3]));co.lineTo(this.coords[i-1][0]+this.coords[i-1][2]+(2*hmargin),Math.round(this.coords[i-1][1]+this.coords[i-1][3]));} co.stroke();}};this.getShape=this.getBar=function(e) {for(var i=0,len=this.coords.length;i=left&&mouseX<=(left+width)&&mouseY>=top&&mouseY<=top+height){var tooltip=RG.parseTooltipText(prop['chart.tooltips'],i);return{0:this,'object':this,1:left,'x':left,2:top,'y':top,3:width,'width':width,4:height,'height':height,5:i,'index':i,'tooltip':tooltip};}} return null;};this.getMax=function(data) {var runningTotal=0;var max=0;for(var i=0,len=data.length;ithis.gutterLeft&&mouseXY[0]<(ca.width-this.gutterRight)&&mouseXY[1]>this.gutterTop&&mouseXY[1]<(ca.height-this.gutterBottom)){return this;}};this.positionTooltip=function(obj,x,y,tooltip,idx) {var coordX=obj.coords[tooltip.__index__][0];var coordY=obj.coords[tooltip.__index__][1];var coordW=obj.coords[tooltip.__index__][2];var coordH=obj.coords[tooltip.__index__][3];var canvasXY=RG.getCanvasXY(obj.canvas);var gutterLeft=obj.gutterLeft;var gutterTop=obj.gutterTop;var width=tooltip.offsetWidth;var height=tooltip.offsetHeight;var value=obj.data[idx];if(tooltip.__index__==obj.data.length){value=obj.total;} tooltip.style.left=0;tooltip.style.top=canvasXY[1]+coordY-height-7+'px';if(value<0){tooltip.style.top=canvasXY[1]+coordY+coordH+7+'px';} tooltip.style.overflow='';var img=new Image();img.id='__rgraph_tooltip_pointer__';img.style.position='absolute';if(value>=0){img.src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAFCAYAAACjKgd3AAAARUlEQVQYV2NkQAN79+797+RkhC4M5+/bd47B2dmZEVkBCgcmgcsgbAaA9GA1BCSBbhAuA/AagmwQPgMIGgIzCD0M0AMMAEFVIAa6UQgcAAAAAElFTkSuQmCC';img.style.top=(tooltip.offsetHeight-2)+'px';}else{img.src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAFCAMAAACkeOZkAAAAK3RFWHRDcmVhdGlvbiBUaW1lAFNhdCA2IE9jdCAyMDEyIDEyOjQ5OjMyIC0wMDAw2S1RlgAAAAd0SU1FB9wKBgszM4Ed2k4AAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAEZ0FNQQAAsY8L/GEFAAAACVBMVEX/AAC9vb3//+92Pom0AAAAAXRSTlMAQObYZgAAAB1JREFUeNpjYAABRgY4YGRiRDCZYBwQE8qBMEEcAANCACqByy1sAAAAAElFTkSuQmCC';img.style.top='-5px';} tooltip.appendChild(img);if((canvasXY[0]+coordX-(width/2))<10){tooltip.style.left=(canvasXY[0]+coordX-(width*0.1))+(coordW/2)+'px';img.style.left=((width*0.1)-8.5)+'px';}else if((canvasXY[0]+coordX+(width/2))>doc.body.offsetWidth){tooltip.style.left=canvasXY[0]+coordX-(width*0.9)+(coordW/2)+'px';img.style.left=((width*0.9)-8.5)+'px';}else{tooltip.style.left=(canvasXY[0]+coordX+(coordW/2)-(width*0.5))+'px';img.style.left=((width*0.5)-8.5)+'px';}};this.getYCoord=function(value) {if(value>this.max){return null;} if(prop['chart.xaxispos']=='center'){if(value<(-1*this.max)){return null;} var coord=(value/this.max)*(this.grapharea/2);return this.gutterTop+(this.grapharea/2)-coord;}else{if(value<0){return null;} var coord=(value/this.max)*this.grapharea;coord=coord+this.gutterTop;return ca.height-coord;}};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.colors']=RG.array_clone(prop['chart.colors']);this.original_colors['chart.key.colors']=RG.array_clone(prop['chart.key.colors']);this.original_colors['chart.crosshairs.color']=RG.array_clone(prop['chart.crosshairs.color']);this.original_colors['chart.highlight.stroke']=RG.array_clone(prop['chart.highlight.stroke']);this.original_colors['chart.highlight.fill']=RG.array_clone(prop['chart.highlight.fill']);this.original_colors['chart.background.barcolor1']=RG.array_clone(prop['chart.background.barcolor1']);this.original_colors['chart.background.barcolor2']=RG.array_clone(prop['chart.background.barcolor2']);this.original_colors['chart.background.grid.color']=RG.array_clone(prop['chart.background.grid.color']);this.original_colors['chart.strokestyle']=RG.array_clone(prop['chart.strokestyle']);this.original_colors['chart.axis.color']=RG.array_clone(prop['chart.axis.color']);} var colors=prop['chart.colors'];if(colors){for(var i=0,len=colors.length;i