RGraph=window.RGraph||{isRGraph:true};RGraph.Scatter=function(conf) {if(typeof conf==='object'&&typeof conf.data==='object'&&typeof conf.id==='string'){var parseConfObjectForOptions=true;this.data=new Array(conf.data.length);this.data=RGraph.arrayClone(conf.data);if(typeof conf.data==='object'&&typeof conf.data[0]==='object'&&(typeof conf.data[0][0]==='number'||typeof conf.data[0][0]==='string')){var tmp=RGraph.arrayClone(conf.data);conf.data=new Array();conf.data[0]=RGraph.arrayClone(tmp);this.data=RGraph.arrayClone(conf.data);}}else{var conf={id:conf};conf.data=arguments[1];this.data=[];if(arguments[1][0]&&arguments[1][0][0]&&typeof arguments[1][0][0]=='object'){for(var i=0;i0){if(prop['chart.xaxispos']=='center'&&prop['chart.yaxispos']=='left'){co.moveTo(this.gutterLeft,Math.round(ca.height-this.gutterBottom));co.lineTo(this.gutterLeft-3,Math.round(ca.height-this.gutterBottom));}else if(prop['chart.xaxispos']=='center'){co.moveTo(ca.width-this.gutterRight+3,Math.round(ca.height-this.gutterBottom));co.lineTo(ca.width-this.gutterRight,Math.round(ca.height-this.gutterBottom));}} if(prop['chart.xaxis']==false&&prop['chart.yaxispos']=='left'){co.moveTo(this.gutterLeft,Math.round(ca.height-this.gutterBottom));co.lineTo(this.gutterLeft-3,Math.round(ca.height-this.gutterBottom));}else if(prop['chart.xaxis']==false&&prop['chart.yaxispos']=='right'){co.moveTo(ca.width-this.gutterRight,Math.round(ca.height-this.gutterBottom));co.lineTo(ca.width-this.gutterRight+3,Math.round(ca.height-this.gutterBottom));}} if(prop['chart.numxticks']>0&&prop['chart.xaxis']){var x=0;var y=(prop['chart.xaxispos']=='center')?this.gutterTop+(this.grapharea/2):(ca.height-this.gutterBottom);this.xTickGap=(prop['chart.labels']&&prop['chart.labels'].length)?((ca.width-this.gutterLeft-this.gutterRight)/prop['chart.labels'].length):(ca.width-this.gutterLeft-this.gutterRight)/10;if(typeof(prop['chart.numxticks'])=='number'){this.xTickGap=(ca.width-this.gutterLeft-this.gutterRight)/prop['chart.numxticks'];} for(x=(this.gutterLeft+(prop['chart.yaxispos']=='left'&&prop['chart.noyaxis']==false?this.xTickGap:0));x<=(ca.width-this.gutterRight-(prop['chart.yaxispos']=='left'||prop['chart.noyaxis']==true?-1:1));x+=this.xTickGap){if(prop['chart.yaxispos']=='left'&&prop['chart.noendxtick']==true&&x==(ca.width-this.gutterRight)){continue;}else if(prop['chart.yaxispos']=='right'&&prop['chart.noendxtick']==true&&x==this.gutterLeft){continue;} co.moveTo(Math.round(x),y-(prop['chart.xaxispos']=='center'?3:0));co.lineTo(Math.round(x),y+3);}} co.stroke();co.lineWidth=1;};this.drawLabels=this.DrawLabels=function() {co.fillStyle=prop['chart.text.color'];var font=prop['chart.text.font'],xMin=prop['chart.xmin'],xMax=prop['chart.xmax'],yMax=this.scale2.max,yMin=prop['chart.ymin']?prop['chart.ymin']:0,text_size=prop['chart.text.size'],units_pre=prop['chart.units.pre'],units_post=prop['chart.units.post'],numYLabels=prop['chart.ylabels.count'],invert=prop['chart.ylabels.invert'],inside=prop['chart.ylabels.inside'],context=co,canvas=ca,boxed=false this.halfTextHeight=text_size/2;this.halfGraphHeight=(ca.height-this.gutterTop-this.gutterBottom)/2;if(prop['chart.ylabels']){var xPos=prop['chart.yaxispos']=='left'?this.gutterLeft-5:ca.width-this.gutterRight+5;var align=prop['chart.yaxispos']=='right'?'left':'right';if(inside){if(prop['chart.yaxispos']=='left'){xPos=prop['chart.gutter.left']+5;align='left';boxed=true;}else{xPos=ca.width-prop['chart.gutter.right']-5;align='right';boxed=true;}} if(prop['chart.xaxispos']=='center'){if(typeof(prop['chart.ylabels.specific'])=='object'&&prop['chart.ylabels.specific']!=null&&prop['chart.ylabels.specific'].length){var labels=prop['chart.ylabels.specific'];if(prop['chart.ymin']>0){labels=[];for(var i=0;i<(prop['chart.ylabels.specific'].length-1);++i){labels.push(prop['chart.ylabels.specific'][i]);}} for(var i=0;i0){RG.Text2(this,{'font':font,'size':text_size,'x':xPos,'y':this.gutterTop+this.halfGraphHeight,'valign':'center','halign':align,'bounding':boxed,'boundingFill':'white','text':RG.number_format(this,yMin.toFixed(prop['chart.scale.decimals']),units_pre,units_post),'tag':'scale'});} if(invert){RG.Text2(this,{'font':font,'size':text_size,'x':xPos,'y':this.gutterTop,'valign':'center','halign':align,'bounding':boxed,'boundingFill':'white','text':RG.number_format(this,yMin.toFixed(prop['chart.scale.decimals']),units_pre,units_post),'tag':'scale'});RG.Text2(this,{'font':font,'size':text_size,'x':xPos,'y':this.gutterTop+(this.halfGraphHeight*2),'valign':'center','halign':align,'bounding':boxed,'boundingFill':'white','text':'-'+RG.number_format(this,yMin.toFixed(prop['chart.scale.decimals']),units_pre,units_post),'tag':'scale'});}}}else{var xPos=prop['chart.yaxispos']=='left'?this.gutterLeft-5:ca.width-this.gutterRight+5;var align=prop['chart.yaxispos']=='right'?'left':'right';if(inside){if(prop['chart.yaxispos']=='left'){xPos=prop['chart.gutter.left']+5;align='left';boxed=true;}else{xPos=ca.width-obj.gutterRight-5;align='right';boxed=true;}} if(typeof prop['chart.ylabels.specific']=='object'&&prop['chart.ylabels.specific']){var labels=prop['chart.ylabels.specific'];if(prop['chart.ymin']>9999){labels=[];for(var i=0;i<(prop['chart.ylabels.specific'].length-1);++i){labels.push(prop['chart.ylabels.specific'][i]);}} for(var i=0,len=labels.length;i0){angle=-1*prop['chart.text.angle'];valign='center';halign='right';yPos+=10;} for(i=0;i=2){if(prop['chart.line.dash']&&typeof co.setLineDash==='function'){co.setLineDash(prop['chart.line.dash']);} co.lineCap='round';co.lineJoin='round';co.lineWidth=this.getLineWidth(i);co.strokeStyle=prop['chart.line.colors'][i];co.beginPath();var prevY=null;var currY=null;for(var j=0,len=this.coords[i].length;j0)prevY=this.coords[i][j-1][1];currY=yPos;if(j==0||RG.is_null(prevY)||RG.is_null(currY)){co.moveTo(xPos,yPos);}else{var stepped=prop['chart.line.stepped'];if((typeof stepped=='boolean'&&stepped)||(typeof stepped=='object'&&stepped[i])){co.lineTo(this.coords[i][j][0],this.coords[i][j-1][1]);} co.lineTo(xPos,yPos);}} co.stroke();if(prop['chart.line.dash']&&typeof co.setLineDash==='function'){co.setLineDash([1,0]);}} co.lineWidth=1;};this.getLineWidth=this.GetLineWidth=function(i) {var linewidth=prop['chart.line.linewidth'];if(typeof linewidth=='number'){return linewidth;}else if(typeof linewidth=='object'){if(linewidth[i]){return linewidth[i];}else{return linewidth[0];} alert('[SCATTER] Error! chart.linewidth should be a single number or an array of one or more numbers');}};this.drawVBars=this.DrawVBars=function() {var vbars=prop['chart.background.vbars'];var graphWidth=ca.width-this.gutterLeft-this.gutterRight;if(vbars){var xmax=prop['chart.xmax'];var xmin=prop['chart.xmin'];for(var i=0,len=vbars.length;i0){var i=0;for(var set=0;set=(x-offset)&&mouseY<=(y+offset)&&mouseY>=(y-offset)){var tooltip=RG.parseTooltipText(this.data[set][i][3],0);var index_adjusted=i;for(var ds=(set-1);ds>=0;--ds){index_adjusted+=this.data[ds].length;} return{0:this,1:x,2:y,3:set,4:i,5:this.data[set][i][3],'object':this,'x':x,'y':y,'dataset':set,'index':i,'tooltip':tooltip,'index_adjusted':index_adjusted};}}else if(RG.is_null(y)){}else{var mark=this.data[set][i];var width=prop['chart.boxplot.width'];if(typeof(mark[1][7])=='number'){width=mark[1][7];} if(typeof(x)=='object'&&mouseX>x[0]&&mouseXy[3]){var tooltip=RG.parseTooltipText(this.data[set][i][3],0);return{0:this,1:x[0],2:x[1]-x[0],3:y[1],4:y[3]-y[1],5:set,6:i,7:this.data[set][i][3],'object':this,'x':x[0],'y':y[1],'width':x[1]-x[0],'height':y[3]-y[1],'dataset':set,'index':i,'tooltip':tooltip};}}}}};this.drawAboveLabels=this.DrawAboveLabels=function() {var size=prop['chart.labels.above.size'];var font=prop['chart.text.font'];var units_pre=prop['chart.units.pre'];var units_post=prop['chart.units.post'];for(var set=0,len=this.coords.length;set(ca.height-this.gutterBottom)||mouseX(ca.width-this.gutterRight)){return null;} if(prop['chart.xaxispos']=='center'){var value=(((this.grapharea/2)-(mouseY-this.gutterTop))/this.grapharea)*(this.max-this.min) value*=2;if(value>=0){value+=this.min if(prop['chart.ylabels.invert']){value-=this.min;value=this.max-value;}}else{value-=this.min;if(prop['chart.ylabels.invert']){value+=this.min;value=this.max+value;value*=-1;}}}else{var value=((this.grapharea-(mouseY-this.gutterTop))/this.grapharea)*(this.max-this.min) value+=this.min;if(prop['chart.ylabels.invert']){value-=this.min;value=this.max-value;}} return value;};this.getXValue=function(arg) {if(arg.length==2){var mouseX=arg[0];var mouseY=arg[1];}else{var mouseXY=RG.getMouseXY(arg);var mouseX=mouseXY[0];var mouseY=mouseXY[1];} var obj=this;if(mouseY(ca.height-this.gutterBottom)||mouseX(ca.width-this.gutterRight)){return null;} var width=(ca.width-this.gutterLeft-this.gutterRight);var value=((mouseX-this.gutterLeft)/width)*(prop['chart.xmax']-prop['chart.xmin']) value+=prop['chart.xmin'];return value;};this.highlight=this.Highlight=function(shape) {if(shape['height']){RG.Highlight.Rect(this,shape);}else{RG.Highlight.Point(this,shape);}};this.getObjectByXY=function(e) {var mouseXY=RG.getMouseXY(e);if(mouseXY[0]>(this.gutterLeft-3)&&mouseXY[0]<(ca.width-this.gutterRight+3)&&mouseXY[1]>(this.gutterTop-3)&&mouseXY[1]<((ca.height-this.gutterBottom)+3)){return this;}};this.getXCoord=function(value) {if(typeof value!='number'&&typeof value!='string'){return null;} if(typeof value==='string'){value=RG.parseDate(value);} var xmin=prop['chart.xmin'];var xmax=prop['chart.xmax'];var x;if(valuexmax)return null;var gutterRight=this.gutterRight;var gutterLeft=this.gutterLeft;if(prop['chart.yaxispos']=='right'){x=((value-xmin)/(xmax-xmin))*(ca.width-gutterLeft-gutterRight);x=(ca.width-gutterRight-x);}else{x=((value-xmin)/(xmax-xmin))*(ca.width-gutterLeft-gutterRight);x=x+gutterLeft;} return x;};this.positionTooltip=function(obj,x,y,tooltip,idx) {var shape=RG.Registry.Get('chart.tooltip.shape');var dataset=shape['dataset'];var index=shape['index'];var coordX=obj.coords[dataset][index][0] var coordY=obj.coords[dataset][index][1] var canvasXY=RG.getCanvasXY(obj.canvas);var gutterLeft=obj.gutterLeft;var gutterTop=obj.gutterTop;var width=tooltip.offsetWidth;var height=tooltip.offsetHeight;tooltip.style.left=0;tooltip.style.top=0;var isBoxplot=typeof(coordY)=='object'?true:false;tooltip.style.overflow='';var img=new Image();img.src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAFCAYAAACjKgd3AAAARUlEQVQYV2NkQAN79+797+RkhC4M5+/bd47B2dmZEVkBCgcmgcsgbAaA9GA1BCSBbhAuA/AagmwQPgMIGgIzCD0M0AMMAEFVIAa6UQgcAAAAAElFTkSuQmCC';img.style.position='absolute';img.id='__rgraph_tooltip_pointer__';img.style.top=(tooltip.offsetHeight-2)+'px';tooltip.appendChild(img);if((canvasXY[0]+(coordX[0]||coordX)-(width/2))<10){if(isBoxplot){tooltip.style.left=canvasXY[0]+coordX[0]+((coordX[1]-coordX[0])/2)-(width*0.1)+'px';tooltip.style.top=canvasXY[1]+coordY[2]-height-5+'px';img.style.left=((width*0.1)-8.5)+'px';}else{tooltip.style.left=(canvasXY[0]+coordX-(width*0.1))+'px';tooltip.style.top=canvasXY[1]+coordY-height-9+'px';img.style.left=((width*0.1)-8.5)+'px';}}else if((canvasXY[0]+(coordX[0]||coordX)+(width/2))>doc.body.offsetWidth){if(isBoxplot){tooltip.style.left=canvasXY[0]+coordX[0]+((coordX[1]-coordX[0])/2)-(width*0.9)+'px';tooltip.style.top=canvasXY[1]+coordY[2]-height-5+'px';img.style.left=((width*0.9)-8.5)+'px';}else{tooltip.style.left=(canvasXY[0]+coordX-(width*0.9))+'px';tooltip.style.top=canvasXY[1]+coordY-height-9+'px';img.style.left=((width*0.9)-8.5)+'px';}}else{if(isBoxplot){tooltip.style.left=canvasXY[0]+coordX[0]+((coordX[1]-coordX[0])/2)-(width/2)+'px';tooltip.style.top=canvasXY[1]+coordY[2]-height-5+'px';img.style.left=((width*0.5)-8.5)+'px';}else{tooltip.style.left=(canvasXY[0]+coordX-(width*0.5))+'px';tooltip.style.top=canvasXY[1]+coordY-height-9+'px';img.style.left=((width*0.5)-8.5)+'px';}}};this.getYCoord=this.getYCoordFromValue=function(value) {if(typeof(value)!='number'){return null;} var invert=prop['chart.ylabels.invert'];var xaxispos=prop['chart.xaxispos'];var graphHeight=ca.height-this.gutterTop-this.gutterBottom;var halfGraphHeight=graphHeight/2;var ymax=this.max;var ymin=prop['chart.ymin'];var coord=0;if(value>ymax||(prop['chart.xaxispos']=='bottom'&&value0&&value(-1*ymin))))){return null;} if(xaxispos=='center'){coord=((Math.abs(value)-ymin)/(ymax-ymin))*halfGraphHeight;if(invert){coord=halfGraphHeight-coord;} if(value<0){coord+=this.gutterTop;coord+=halfGraphHeight;}else{coord=halfGraphHeight-coord;coord+=this.gutterTop;}}else{coord=((value-ymin)/(ymax-ymin))*graphHeight;if(invert){coord=graphHeight-coord;} coord=graphHeight-coord;coord=this.gutterTop+coord;} return coord;};RG.Scatter.Bubble=function(scatter,min,max,width,data) {this.scatter=scatter;this.min=min;this.max=max;this.width=width;this.data=data;this.set=this.Set=function(name,value) {this.scatter.Set(name,value);return this;};this.get=this.Get=function(name) {this.scatter.Get(name);};this.draw=this.Draw=function() {var bubble_min=this.min;var bubble_max=this.max;var bubble_data=this.data;var bubble_max_width=this.width;this.scatter.ondraw=function(obj) {for(var i=0;i