
if(!Proto)var Proto={};Proto.Chart=Class.create({initialize:function(elem,data,options)
{options=options||{};this.graphData=[];this.options=this.merge(options,{colors:["#edc240","#00A8F0","#C0D800","#cb4b4b","#4da74d","#9440ed"],legend:{show:false,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:0.85},xaxis:{mode:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,tickDecimals:null,tickSize:null,minTickSize:null,monthNames:null,timeformat:null},yaxis:{mode:null,min:null,max:null,ticks:null,tickFormatter:null,tickDecimals:null,tickSize:null,minTickSize:null,monthNames:null,timeformat:null,autoscaleMargin:0.02},points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff"},lines:{show:false,lineWidth:2,fill:false,fillColor:null},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,showShadow:false,fillOpacity:0.4,autoScale:true},pies:{show:false,radius:50,borderWidth:1,fill:true,fillColor:null,fillOpacity:0.90,labelWidth:30,fontSize:11,autoScale:true},grid:{color:"#545454",backgroundColor:null,tickColor:"#dddddd",labelMargin:3,borderWidth:1,clickable:null,coloredAreas:null,coloredAreasColor:"#f4f4f4",drawXAxis:true,drawYAxis:true},mouse:{track:false,position:'se',fixedPosition:true,clsName:'mouseValHolder',trackFormatter:this.defaultTrackFormatter,margin:3,color:'#ff3f19',trackDecimals:1,sensibility:2,radius:5,lineColor:'#cb4b4b'},selection:{mode:null,color:"#97CBFF"},allowDataClick:true,makeRandomColor:false,shadowSize:4});this.canvas=null;this.overlay=null;this.eventHolder=null;this.context=null;this.overlayContext=null;this.domObj=$(elem);this.xaxis={};this.yaxis={};this.chartOffset={left:0,right:0,top:0,bottom:0};this.yLabelMaxWidth=0;this.yLabelMaxHeight=0;this.xLabelBoxWidth=0;this.canvasWidth=0;this.canvasHeight=0;this.chartWidth=0;this.chartHeight=0;this.hozScale=0;this.vertScale=0;this.workarounds={};this.domObj=$(elem);this.barDataRange=[];this.lastMousePos={pageX:null,pageY:null};this.selection={first:{x:-1,y:-1},second:{x:-1,y:-1}};this.prevSelection=null;this.selectionInterval=null;this.ignoreClick=false;this.prevHit=null;if(this.options.makeRandomColor)
this.options.color=this.makeRandomColor(this.options.colors);this.setData(data);this.constructCanvas();this.setupGrid();this.draw();},merge:function(src,dest)
{var result=dest||{};for(var i in src){result[i]=(typeof(src[i])=='object'&&!(src[i].constructor==Array||src[i].constructor==RegExp))?this.merge(src[i],dest[i]):result[i]=src[i];}
return result;},setData:function(data)
{this.graphData=this.parseData(data);this.setBarWidth();this.copyGraphDataOptions();this.processGraphData();},parseData:function(data)
{var res=[];data.each(function(d){var s;if(d.data){s={};for(var v in d){s[v]=d[v];}}
else{s={data:d};}
res.push(s);}.bind(this));return res;},makeRandomColor:function(colorSet)
{var randNum=Math.floor(Math.random()*colorSet.length);var randArr=[];var newArr=[];randArr.push(randNum);while(randArr.length<colorSet.length)
{var tempNum=Math.floor(Math.random()*colorSet.length);while(checkExisted(tempNum,randArr))
tempNum=Math.floor(Math.random()*colorSet.length);randArr.push(tempNum);}
randArr.each(function(ra){newArr.push(colorSet[ra]);}.bind(this));return newArr;},checkExisted:function(needle,haystack)
{var existed=false;haystack.each(function(aNeedle){if(aNeedle==needle){existed=true;throw $break;}}.bind(this));return existed;},setBarWidth:function()
{if(this.options.bars.show&&this.options.bars.autoScale)
{this.options.bars.barWidth=1/this.graphData.length/1.2;}},copyGraphDataOptions:function()
{var i,neededColors=this.graphData.length,usedColors=[],assignedColors=[];this.graphData.each(function(gd){var sc=gd.color;if(sc){--neededColors;if(Object.isNumber(sc)){assignedColors.push(sc);}
else{usedColors.push(this.parseColor(sc));}}}.bind(this));assignedColors.each(function(ac){neededColors=Math.max(neededColors,ac+1);});var colors=[];var variation=0;i=0;while(colors.length<neededColors){var c;if(this.options.colors.length==i){c=new Proto.Color(100,100,100);}
else{c=this.parseColor(this.options.colors[i]);}
var sign=variation%2==1?-1:1;var factor=1+sign*Math.ceil(variation/2)*0.2;c.scale(factor,factor,factor);colors.push(c);++i;if(i>=this.options.colors.length){i=0;++variation;}}
var colorIndex=0,s;this.graphData.each(function(gd){if(gd.color==null)
{gd.color=colors[colorIndex].toString();++colorIndex;}
else if(Object.isNumber(gd.color)){gd.color=colors[gd.color].toString();}
gd.lines=Object.extend(Object.clone(this.options.lines),gd.lines);gd.points=Object.extend(Object.clone(this.options.points),gd.points);gd.bars=Object.extend(Object.clone(this.options.bars),gd.bars);gd.mouse=Object.extend(Object.clone(this.options.mouse),gd.mouse);if(gd.shadowSize==null){gd.shadowSize=this.options.shadowSize;}}.bind(this));},processGraphData:function(){this.xaxis.datamin=this.yaxis.datamin=Number.MAX_VALUE;this.xaxis.datamax=this.yaxis.datamax=Number.MIN_VALUE;this.graphData.each(function(gd){var data=gd.data;data.each(function(d){if(d==null){return;}
var x=d[0],y=d[1];if(!x||!y||isNaN(x=+x)||isNaN(y=+y)){d=null;return;}
if(x<this.xaxis.datamin)
this.xaxis.datamin=x;if(x>this.xaxis.datamax)
this.xaxis.datamax=x;if(y<this.yaxis.datamin)
this.yaxis.datamin=y;if(y>this.yaxis.datamax)
this.yaxis.datamax=y;}.bind(this));}.bind(this));if(this.xaxis.datamin==Number.MAX_VALUE)
this.xaxis.datamin=0;if(this.yaxis.datamin==Number.MAX_VALUE)
this.yaxis.datamin=0;if(this.xaxis.datamax==Number.MIN_VALUE)
this.xaxis.datamax=1;if(this.yaxis.datamax==Number.MIN_VALUE)
this.yaxis.datamax=1;},constructCanvas:function(){this.canvasWidth=this.domObj.getWidth();this.canvasHeight=this.domObj.getHeight();this.domObj.update("");this.domObj.setStyle({"position":"relative"});if(this.canvasWidth<=0){this.canvasWdith=400;}
if(this.canvasHeight<=0){this.canvasHeight=300;}
this.canvas=(Prototype.Browser.IE)?document.createElement("canvas"):new Element("CANVAS",{'width':this.canvasWidth,'height':this.canvasHeight});Element.extend(this.canvas);this.canvas.style.width=this.canvasWidth+"px";this.canvas.style.height=this.canvasHeight+"px";this.domObj.appendChild(this.canvas);if(Prototype.Browser.IE)
{this.canvas=$(window.G_vmlCanvasManager.initElement(this.canvas));}
this.canvas=$(this.canvas);this.context=this.canvas.getContext("2d");this.overlay=(Prototype.Browser.IE)?document.createElement("canvas"):new Element("CANVAS",{'width':this.canvasWidth,'height':this.canvasHeight});Element.extend(this.overlay);this.overlay.style.width=this.canvasWidth+"px";this.overlay.style.height=this.canvasHeight+"px";this.overlay.style.position="absolute";this.overlay.style.left="0px";this.overlay.style.right="0px";this.overlay.setStyle({'position':'absolute','left':'0px','right':'0px'});this.domObj.appendChild(this.overlay);if(Prototype.Browser.IE){this.overlay=$(window.G_vmlCanvasManager.initElement(this.overlay));}
this.overlay=$(this.overlay);this.overlayContext=this.overlay.getContext("2d");if(this.options.selection.mode)
{this.overlay.observe('mousedown',this.onMouseDown.bind(this));this.overlay.observe('mousemove',this.onMouseMove.bind(this));}
if(this.options.grid.clickable){this.overlay.observe('click',this.onClick.bind(this));}
if(this.options.mouse.track)
{this.overlay.observe('mousemove',this.onMouseMove.bind(this));}},setupGrid:function()
{if(this.options.bars.show)
{this.xaxis.max+=0.5;this.xaxis.min-=0.5;}
this.extendXRangeIfNeededByBar();this.setRange(this.xaxis,this.options.xaxis);this.prepareTickGeneration(this.xaxis,this.options.xaxis);this.setTicks(this.xaxis,this.options.xaxis);this.setRange(this.yaxis,this.options.yaxis);this.prepareTickGeneration(this.yaxis,this.options.yaxis);this.setTicks(this.yaxis,this.options.yaxis);this.setSpacing();if(!this.options.pies.show)
{this.insertLabels();}
this.insertLegend();},setRange:function(axis,axisOptions){var min=axisOptions.min!=null?axisOptions.min:axis.datamin;var max=axisOptions.max!=null?axisOptions.max:axis.datamax;if(max-min==0.0){var widen;if(max==0.0)
widen=1.0;else
widen=0.01;min-=widen;max+=widen;}
else{var margin=axisOptions.autoscaleMargin;if(margin!=null){if(axisOptions.min==null){min-=(max-min)*margin;if(min<0&&axis.datamin>=0)
min=0;}
if(axisOptions.max==null){max+=(max-min)*margin;if(max>0&&axis.datamax<=0)
max=0;}}}
axis.min=min;axis.max=max;},prepareTickGeneration:function(axis,axisOptions){var noTicks;if(Object.isNumber(axisOptions.ticks)&&axisOptions.ticks>0)
noTicks=axisOptions.ticks;else if(axis==this.xaxis)
noTicks=this.canvasWidth/100;else
noTicks=this.canvasHeight/60;var delta=(axis.max-axis.min)/noTicks;var size,generator,unit,formatter,i,magn,norm;if(axisOptions.mode=="time"){function formatDate(d,fmt,monthNames){var leftPad=function(n){n=""+n;return n.length==1?"0"+n:n;};var r=[];var escape=false;if(monthNames==null)
monthNames=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];for(var i=0;i<fmt.length;++i){var c=fmt.charAt(i);if(escape){switch(c){case'h':c=""+d.getHours();break;case'H':c=leftPad(d.getHours());break;case'M':c=leftPad(d.getMinutes());break;case'S':c=leftPad(d.getSeconds());break;case'd':c=""+d.getDate();break;case'm':c=""+(d.getMonth()+1);break;case'y':c=""+d.getFullYear();break;case'b':c=""+monthNames[d.getMonth()];break;}
r.push(c);escape=false;}
else{if(c=="%")
escape=true;else
r.push(c);}}
return r.join("");}
var timeUnitSize={"second":1000,"minute":60*1000,"hour":60*60*1000,"day":24*60*60*1000,"month":30*24*60*60*1000,"year":365.2425*24*60*60*1000};var spec=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[0.25,"month"],[0.5,"month"],[1,"month"],[2,"month"],[3,"month"],[6,"month"],[1,"year"]];var minSize=0;if(axisOptions.minTickSize!=null){if(typeof axisOptions.tickSize=="number")
minSize=axisOptions.tickSize;else
minSize=axisOptions.minTickSize[0]*timeUnitSize[axisOptions.minTickSize[1]];}
for(i=0;i<spec.length-1;++i){if(delta<(spec[i][0]*timeUnitSize[spec[i][1]]+spec[i+1][0]*timeUnitSize[spec[i+1][1]])/2&&spec[i][0]*timeUnitSize[spec[i][1]]>=minSize){break;}}
size=spec[i][0];unit=spec[i][1];if(unit=="year"){magn=Math.pow(10,Math.floor(Math.log(delta/timeUnitSize.year)/Math.LN10));norm=(delta/timeUnitSize.year)/magn;if(norm<1.5)
size=1;else if(norm<3)
size=2;else if(norm<7.5)
size=5;else
size=10;size*=magn;}
if(axisOptions.tickSize){size=axisOptions.tickSize[0];unit=axisOptions.tickSize[1];}
var floorInBase=this.floorInBase;generator=function(axis){var ticks=[],tickSize=axis.tickSize[0],unit=axis.tickSize[1],d=new Date(axis.min);var step=tickSize*timeUnitSize[unit];if(unit=="second")
d.setSeconds(floorInBase(d.getSeconds(),tickSize));if(unit=="minute")
d.setMinutes(floorInBase(d.getMinutes(),tickSize));if(unit=="hour")
d.setHours(floorInBase(d.getHours(),tickSize));if(unit=="month")
d.setMonth(floorInBase(d.getMonth(),tickSize));if(unit=="year")
d.setFullYear(floorInBase(d.getFullYear(),tickSize));d.setMilliseconds(0);if(step>=timeUnitSize.minute)
d.setSeconds(0);if(step>=timeUnitSize.hour)
d.setMinutes(0);if(step>=timeUnitSize.day)
d.setHours(0);if(step>=timeUnitSize.day*4)
d.setDate(1);if(step>=timeUnitSize.year)
d.setMonth(0);var carry=0,v;do{v=d.getTime();ticks.push({v:v,label:axis.tickFormatter(v,axis)});if(unit=="month"){if(tickSize<1){d.setDate(1);var start=d.getTime();d.setMonth(d.getMonth()+1);var end=d.getTime();d.setTime(v+carry*timeUnitSize.hour+(end-start)*tickSize);carry=d.getHours();d.setHours(0);}
else
d.setMonth(d.getMonth()+tickSize);}
else if(unit=="year"){d.setFullYear(d.getFullYear()+tickSize);}
else
d.setTime(v+step);}while(v<axis.max);return ticks;};formatter=function(v,axis){var d=new Date(v);if(axisOptions.timeformat!=null)
return formatDate(d,axisOptions.timeformat,axisOptions.monthNames);var t=axis.tickSize[0]*timeUnitSize[axis.tickSize[1]];var span=axis.max-axis.min;if(t<timeUnitSize.minute)
fmt="%h:%M:%S";else if(t<timeUnitSize.day){if(span<2*timeUnitSize.day)
fmt="%h:%M";else
fmt="%b %d %h:%M";}
else if(t<timeUnitSize.month)
fmt="%b %d";else if(t<timeUnitSize.year){if(span<timeUnitSize.year)
fmt="%b";else
fmt="%b %y";}
else
fmt="%y";return formatDate(d,fmt,axisOptions.monthNames);};}
else{var maxDec=axisOptions.tickDecimals;var dec=-Math.floor(Math.log(delta)/Math.LN10);if(maxDec!=null&&dec>maxDec)
dec=maxDec;magn=Math.pow(10,-dec);norm=delta/magn;if(norm<1.5)
size=1;else if(norm<3){size=2;if(norm>2.25&&(maxDec==null||dec+1<=maxDec)){size=2.5;++dec;}}
else if(norm<7.5)
size=5;else
size=10;size*=magn;if(axisOptions.minTickSize!=null&&size<axisOptions.minTickSize)
size=axisOptions.minTickSize;if(axisOptions.tickSize!=null)
size=axisOptions.tickSize;axis.tickDecimals=Math.max(0,(maxDec!=null)?maxDec:dec);var floorInBase=this.floorInBase;generator=function(axis){var ticks=[];var start=floorInBase(axis.min,axis.tickSize);var i=0,v;do{v=start+i*axis.tickSize;ticks.push({v:v,label:axis.tickFormatter(v,axis)});++i;}while(v<axis.max);return ticks;};formatter=function(v,axis){if(v){return v.toFixed(axis.tickDecimals);}
return 0;};}
axis.tickSize=unit?[size,unit]:size;axis.tickGenerator=generator;if(Object.isFunction(axisOptions.tickFormatter))
axis.tickFormatter=function(v,axis){return""+axisOptions.tickFormatter(v,axis);};else
axis.tickFormatter=formatter;},extendXRangeIfNeededByBar:function(){if(this.options.xaxis.max==null){var newmax=this.xaxis.max;this.graphData.each(function(gd){if(gd.bars.show&&gd.bars.barWidth+this.xaxis.datamax>newmax)
{newmax=this.xaxis.datamax+gd.bars.barWidth;}}.bind(this));this.xaxis.nax=newmax;}},setTicks:function(axis,axisOptions){axis.ticks=[];if(axisOptions.ticks==null)
axis.ticks=axis.tickGenerator(axis);else if(typeof axisOptions.ticks=="number"){if(axisOptions.ticks>0)
axis.ticks=axis.tickGenerator(axis);}
else if(axisOptions.ticks){var ticks=axisOptions.ticks;if(Object.isFunction(ticks))
ticks=ticks({min:axis.min,max:axis.max});ticks.each(function(t,i){var v=null;var label=null;if(typeof t=='object'){v=t[0];if(t.length>1){label=t[1];}}
else{v=t;}
if(!label){label=axis.tickFormatter(v,axis);}
axis.ticks[i]={v:v,label:label}}.bind(this));}
if(axisOptions.autoscaleMargin!=null&&axis.ticks.length>0){if(axisOptions.min==null)
axis.min=Math.min(axis.min,axis.ticks[0].v);if(axisOptions.max==null&&axis.ticks.length>1)
axis.max=Math.min(axis.max,axis.ticks[axis.ticks.length-1].v);}},setSpacing:function(){var i,labels=[],l;for(i=0;i<this.yaxis.ticks.length;++i){l=this.yaxis.ticks[i].label;if(l)
labels.push('<div class="tickLabel">'+l+'</div>');}
if(labels.length>0){var dummyDiv=new Element('div',{'style':'position:absolute;top:-10000px;font-size:smaller'});dummyDiv.update(labels.join(""));this.domObj.insert(dummyDiv);this.yLabelMaxWidth=dummyDiv.getWidth();this.yLabelMaxHeight=dummyDiv.select('div')[0].getHeight();dummyDiv.remove();}
var maxOutset=this.options.grid.borderWidth;if(this.options.points.show)
maxOutset=Math.max(maxOutset,this.options.points.radius+this.options.points.lineWidth/2);for(i=0;i<this.graphData.length;++i){if(this.graphData[i].points.show)
maxOutset=Math.max(maxOutset,this.graphData[i].points.radius+this.graphData[i].points.lineWidth/2);}
this.chartOffset.left=this.chartOffset.right=this.chartOffset.top=this.chartOffset.bottom=maxOutset;this.chartOffset.left+=this.yLabelMaxWidth+this.options.grid.labelMargin;this.chartWidth=this.canvasWidth-this.chartOffset.left-this.chartOffset.right;this.xLabelBoxWidth=this.chartWidth/6;labels=[];for(i=0;i<this.xaxis.ticks.length;++i){l=this.xaxis.ticks[i].label;if(l){labels.push('<span class="tickLabel" width="'+this.xLabelBoxWidth+'">'+l+'</span>');}}
var xLabelMaxHeight=0;if(labels.length>0){var dummyDiv=new Element('div',{'style':'position:absolute;top:-10000px;font-size:smaller'});dummyDiv.update(labels.join(""));this.domObj.appendChild(dummyDiv);xLabelMaxHeight=dummyDiv.getHeight();dummyDiv.remove();}
this.chartOffset.bottom+=xLabelMaxHeight+this.options.grid.labelMargin;this.chartHeight=this.canvasHeight-this.chartOffset.bottom-this.chartOffset.top;this.hozScale=this.chartWidth/(this.xaxis.max-this.xaxis.min);this.vertScale=this.chartHeight/(this.yaxis.max-this.yaxis.min);},draw:function(){if(this.options.bars.show)
{this.extendXRangeIfNeededByBar();this.setSpacing();this.drawGrid();this.drawBarGraph(this.graphData,this.barDataRange);}
else if(this.options.pies.show)
{this.preparePieData(this.graphData);this.drawPieGraph(this.graphData);}
else
{this.drawGrid();for(var i=0;i<this.graphData.length;i++){this.drawGraph(this.graphData[i]);}}},translateHoz:function(x){return(x-this.xaxis.min)*this.hozScale;},translateVert:function(y){return this.chartHeight-(y-this.yaxis.min)*this.vertScale;},drawGrid:function(){var i;this.context.save();this.context.clearRect(0,0,this.canvasWidth,this.canvasHeight);this.context.translate(this.chartOffset.left,this.chartOffset.top);if(this.options.grid.backgroundColor!=null){this.context.fillStyle=this.options.grid.backgroundColor;this.context.fillRect(0,0,this.chartWidth,this.chartHeight);}
if(this.options.grid.coloredAreas){var areas=this.options.grid.coloredAreas;if(Object.isFunction(areas)){areas=areas({xmin:this.xaxis.min,xmax:this.xaxis.max,ymin:this.yaxis.min,ymax:this.yaxis.max});}
areas.each(function(a){if(a.x1==null||a.x1<this.xaxis.min)
a.x1=this.xaxis.min;if(a.x2==null||a.x2>this.xaxis.max)
a.x2=this.xaxis.max;if(a.y1==null||a.y1<this.yaxis.min)
a.y1=this.yaxis.min;if(a.y2==null||a.y2>this.yaxis.max)
a.y2=this.yaxis.max;var tmp;if(a.x1>a.x2){tmp=a.x1;a.x1=a.x2;a.x2=tmp;}
if(a.y1>a.y2){tmp=a.y1;a.y1=a.y2;a.y2=tmp;}
if(a.x1>=this.xaxis.max||a.x2<=this.xaxis.min||a.x1==a.x2||a.y1>=this.yaxis.max||a.y2<=this.yaxis.min||a.y1==a.y2)
return;this.context.fillStyle=a.color||this.options.grid.coloredAreasColor;this.context.fillRect(Math.floor(this.translateHoz(a.x1)),Math.floor(this.translateVert(a.y2)),Math.floor(this.translateHoz(a.x2)-this.translateHoz(a.x1)),Math.floor(this.translateVert(a.y1)-this.translateVert(a.y2)));}.bind(this));}
this.context.lineWidth=1;this.context.strokeStyle=this.options.grid.tickColor;this.context.beginPath();var v;if(this.options.grid.drawXAxis){this.xaxis.ticks.each(function(aTick){v=aTick.v;if(v<=this.xaxis.min||v>=this.xaxis.max){return;}
this.context.moveTo(Math.floor(this.translateHoz(v))+this.context.lineWidth/2,0);this.context.lineTo(Math.floor(this.translateHoz(v))+this.context.lineWidth/2,this.chartHeight);}.bind(this));}
if(this.options.grid.drawYAxis){this.yaxis.ticks.each(function(aTick){v=aTick.v;if(v<=this.yaxis.min||v>=this.yaxis.max){return;}
this.context.moveTo(0,Math.floor(this.translateVert(v))+this.context.lineWidth/2);this.context.lineTo(this.chartWidth,Math.floor(this.translateVert(v))+this.context.lineWidth/2);}.bind(this));}
this.context.stroke();if(this.options.grid.borderWidth){this.context.lineWidth=this.options.grid.borderWidth;this.context.strokeStyle=this.options.grid.color;this.context.lineJoin="round";this.context.strokeRect(0,0,this.chartWidth,this.chartHeight);this.context.restore();}},insertLabels:function(){this.domObj.select(".tickLabels").invoke('remove');var i,tick;var html='<div class="tickLabels" style="font-size:smaller;color:'+this.options.grid.color+'">';this.xaxis.ticks.each(function(tick){if(!tick.label||tick.v<this.xaxis.min||tick.v>this.xaxis.max)
return;html+='<div style="position:absolute;top:'+(this.chartOffset.top+this.chartHeight+this.options.grid.labelMargin)+'px;left:'+(this.chartOffset.left+this.translateHoz(tick.v)-this.xLabelBoxWidth/2)+'px;width:'+this.xLabelBoxWidth+'px;text-align:center" class="tickLabel">'+tick.label+"</div>";}.bind(this));this.yaxis.ticks.each(function(tick){if(!tick.label||tick.v<this.yaxis.min||tick.v>this.yaxis.max)
return;html+='<div id="ylabels" style="position:absolute;top:'+(this.chartOffset.top+this.translateVert(tick.v)-this.yLabelMaxHeight/2)+'px;left:0;width:'+this.yLabelMaxWidth+'px;text-align:right" class="tickLabel">'+tick.label+"</div>";}.bind(this));html+='</div>';this.domObj.insert(html);},drawGraph:function(graphData){if(graphData.lines.show||(!graphData.bars.show&&!graphData.points.show))
this.drawGraphLines(graphData);if(graphData.bars.show)
this.drawGraphBar(graphData);if(graphData.points.show)
this.drawGraphPoints(graphData);},plotLine:function(data,offset){var prev,cur=null,drawx=null,drawy=null;this.context.beginPath();for(var i=0;i<data.length;++i){prev=cur;cur=data[i];if(prev==null||cur==null)
continue;var x1=prev[0],y1=prev[1],x2=cur[0],y2=cur[1];if(y1<=y2&&y1<this.yaxis.min){if(y2<this.yaxis.min)
continue;x1=(this.yaxis.min-y1)/(y2-y1)*(x2-x1)+x1;y1=this.yaxis.min;}
else if(y2<=y1&&y2<this.yaxis.min){if(y1<this.yaxis.min)
continue;x2=(this.yaxis.min-y1)/(y2-y1)*(x2-x1)+x1;y2=this.yaxis.min;}
if(y1>=y2&&y1>this.yaxis.max){if(y2>this.yaxis.max)
continue;x1=(this.yaxis.max-y1)/(y2-y1)*(x2-x1)+x1;y1=this.yaxis.max;}
else if(y2>=y1&&y2>this.yaxis.max){if(y1>this.yaxis.max)
continue;x2=(this.yaxis.max-y1)/(y2-y1)*(x2-x1)+x1;y2=this.yaxis.max;}
if(x1<=x2&&x1<this.xaxis.min){if(x2<this.xaxis.min)
continue;y1=(this.xaxis.min-x1)/(x2-x1)*(y2-y1)+y1;x1=this.xaxis.min;}
else if(x2<=x1&&x2<this.xaxis.min){if(x1<this.xaxis.min)
continue;y2=(this.xaxis.min-x1)/(x2-x1)*(y2-y1)+y1;x2=this.xaxis.min;}
if(x1>=x2&&x1>this.xaxis.max){if(x2>this.xaxis.max)
continue;y1=(this.xaxis.max-x1)/(x2-x1)*(y2-y1)+y1;x1=this.xaxis.max;}
else if(x2>=x1&&x2>this.xaxis.max){if(x1>this.xaxis.max)
continue;y2=(this.xaxis.max-x1)/(x2-x1)*(y2-y1)+y1;x2=this.xaxis.max;}
if(drawx!=this.translateHoz(x1)||drawy!=this.translateVert(y1)+offset)
this.context.moveTo(this.translateHoz(x1),this.translateVert(y1)+offset);drawx=this.translateHoz(x2);drawy=this.translateVert(y2)+offset;this.context.lineTo(drawx,drawy);}
this.context.stroke();},plotLineArea:function(data){var prev,cur=null;var bottom=Math.min(Math.max(0,this.yaxis.min),this.yaxis.max);var top,lastX=0;var areaOpen=false;for(var i=0;i<data.length;++i){prev=cur;cur=data[i];if(areaOpen&&prev!=null&&cur==null){this.context.lineTo(this.translateHoz(lastX),this.translateVert(bottom));this.context.fill();areaOpen=false;continue;}
if(prev==null||cur==null)
continue;var x1=prev[0],y1=prev[1],x2=cur[0],y2=cur[1];if(x1<=x2&&x1<this.xaxis.min){if(x2<this.xaxis.min)
continue;y1=(this.xaxis.min-x1)/(x2-x1)*(y2-y1)+y1;x1=this.xaxis.min;}
else if(x2<=x1&&x2<this.xaxis.min){if(x1<this.xaxis.min)
continue;y2=(this.xaxis.min-x1)/(x2-x1)*(y2-y1)+y1;x2=this.xaxis.min;}
if(x1>=x2&&x1>this.xaxis.max){if(x2>this.xaxis.max)
continue;y1=(this.xaxis.max-x1)/(x2-x1)*(y2-y1)+y1;x1=this.xaxis.max;}
else if(x2>=x1&&x2>this.xaxis.max){if(x1>this.xaxis.max)
continue;y2=(this.xaxis.max-x1)/(x2-x1)*(y2-y1)+y1;x2=this.xaxis.max;}
if(!areaOpen){this.context.beginPath();this.context.moveTo(this.translateHoz(x1),this.translateVert(bottom));areaOpen=true;}
if(y1>=this.yaxis.max&&y2>=this.yaxis.max){this.context.lineTo(this.translateHoz(x1),this.translateVert(this.yaxis.max));this.context.lineTo(this.translateHoz(x2),this.translateVert(this.yaxis.max));continue;}
else if(y1<=this.yaxis.min&&y2<=this.yaxis.min){this.context.lineTo(this.translateHoz(x1),this.translateVert(this.yaxis.min));this.context.lineTo(this.translateHoz(x2),this.translateVert(this.yaxis.min));continue;}
var x1old=x1,x2old=x2;if(y1<=y2&&y1<this.yaxis.min&&y2>=this.yaxis.min){x1=(this.yaxis.min-y1)/(y2-y1)*(x2-x1)+x1;y1=this.yaxis.min;}
else if(y2<=y1&&y2<this.yaxis.min&&y1>=this.yaxis.min){x2=(this.yaxis.min-y1)/(y2-y1)*(x2-x1)+x1;y2=this.yaxis.min;}
if(y1>=y2&&y1>this.yaxis.max&&y2<=this.yaxis.max){x1=(this.yaxis.max-y1)/(y2-y1)*(x2-x1)+x1;y1=this.yaxis.max;}
else if(y2>=y1&&y2>this.yaxis.max&&y1<=this.yaxis.max){x2=(this.yaxis.max-y1)/(y2-y1)*(x2-x1)+x1;y2=this.yaxis.max;}
if(x1!=x1old){if(y1<=this.yaxis.min)
top=this.yaxis.min;else
top=this.yaxis.max;this.context.lineTo(this.translateHoz(x1old),this.translateVert(top));this.context.lineTo(this.translateHoz(x1),this.translateVert(top));}
this.context.lineTo(this.translateHoz(x1),this.translateVert(y1));this.context.lineTo(this.translateHoz(x2),this.translateVert(y2));if(x2!=x2old){if(y2<=this.yaxis.min)
top=this.yaxis.min;else
top=this.yaxis.max;this.context.lineTo(this.translateHoz(x2old),this.translateVert(top));this.context.lineTo(this.translateHoz(x2),this.translateVert(top));}
lastX=Math.max(x2,x2old);}
if(areaOpen){this.context.lineTo(this.translateHoz(lastX),this.translateVert(bottom));this.context.fill();}},drawGraphLines:function(graphData){this.context.save();this.context.translate(this.chartOffset.left,this.chartOffset.top);this.context.lineJoin="round";var lw=graphData.lines.lineWidth;var sw=graphData.shadowSize;if(sw>0){this.context.lineWidth=sw/2;this.context.strokeStyle="rgba(0,0,0,0.1)";this.plotLine(graphData.data,lw/2+sw/2+this.context.lineWidth/2);this.context.lineWidth=sw/2;this.context.strokeStyle="rgba(0,0,0,0.2)";this.plotLine(graphData.data,lw/2+this.context.lineWidth/2);}
this.context.lineWidth=lw;this.context.strokeStyle=graphData.color;if(graphData.lines.fill){this.context.fillStyle=graphData.lines.fillColor!=null?graphData.lines.fillColor:this.parseColor(graphData.color).scale(null,null,null,0.4).toString();this.plotLineArea(graphData.data,0);}
this.plotLine(graphData.data,0);this.context.restore();},plotPoints:function(data,radius,fill){for(var i=0;i<data.length;++i){if(data[i]==null)
continue;var x=data[i][0],y=data[i][1];if(x<this.xaxis.min||x>this.xaxis.max||y<this.yaxis.min||y>this.yaxis.max)
continue;this.context.beginPath();this.context.arc(this.translateHoz(x),this.translateVert(y),radius,0,2*Math.PI,true);if(fill)
this.context.fill();this.context.stroke();}},plotPointShadows:function(data,offset,radius){for(var i=0;i<data.length;++i){if(data[i]==null)
continue;var x=data[i][0],y=data[i][1];if(x<this.xaxis.min||x>this.xaxis.max||y<this.yaxis.min||y>this.yaxis.max)
continue;this.context.beginPath();this.context.arc(this.translateHoz(x),this.translateVert(y)+offset,radius,0,Math.PI,false);this.context.stroke();}},drawGraphPoints:function(graphData){this.context.save();this.context.translate(this.chartOffset.left,this.chartOffset.top);var lw=graphData.lines.lineWidth;var sw=graphData.shadowSize;if(sw>0){this.context.lineWidth=sw/2;this.context.strokeStyle="rgba(0,0,0,0.1)";this.plotPointShadows(graphData.data,sw/2+this.context.lineWidth/2,graphData.points.radius);this.context.lineWidth=sw/2;this.context.strokeStyle="rgba(0,0,0,0.2)";this.plotPointShadows(graphData.data,this.context.lineWidth/2,graphData.points.radius);}
this.context.lineWidth=graphData.points.lineWidth;this.context.strokeStyle=graphData.color;this.context.fillStyle=graphData.points.fillColor!=null?graphData.points.fillColor:graphData.color;this.plotPoints(graphData.data,graphData.points.radius,graphData.points.fill);this.context.restore();},preparePieData:function(graphData)
{for(i=0;i<graphData.length;i++)
{var data=0;for(j=0;j<graphData[i].data.length;j++){data+=parseInt(graphData[i].data[j][1]);}
graphData[i].data=data;}},drawPieShadow:function(anchorX,anchorY,radius)
{this.context.beginPath();this.context.moveTo(anchorX,anchorY);this.context.fillStyle='rgba(0,0,0,'+0.1+')';startAngle=0;endAngle=(Math.PI/180)*360;this.context.arc(anchorX+2,anchorY+2,radius+(this.options.shadowSize/2),startAngle,endAngle,false);this.context.fill();this.context.closePath();},drawPieGraph:function(graphData)
{var sumData=0;var radius=0;var centerX=this.chartWidth/2;var centerY=this.chartHeight/2;var startAngle=0;var endAngle=0;var fontSize=this.options.pies.fontSize;var labelWidth=this.options.pies.labelWidth;if(!this.options.pies.autoScale)
radius=this.options.pies.radius;else
radius=(this.chartHeight*0.85)/2;var labelRadius=radius*1.05;for(i=0;i<graphData.length;i++)
sumData+=graphData[i].data;totalPct=0;this.drawPieShadow(centerX,centerY,radius,0,0);graphData.each(function(gd,j){var pct=gd.data/sumData;startAngle=endAngle;endAngle+=pct*(2*Math.PI);var sliceMiddle=(endAngle-startAngle)/2+startAngle;var labelX=centerX+Math.cos(sliceMiddle)*labelRadius;var labelY=centerY+Math.sin(sliceMiddle)*labelRadius;var anchorX=centerX;var anchorY=centerY;var textAlign=null;var verticalAlign=null;var left=0;var top=0;this.context.beginPath();this.context.moveTo(anchorX,anchorY);this.context.arc(anchorX,anchorY,radius,startAngle,endAngle,false);this.context.closePath();this.context.fillStyle=this.parseColor(gd.color).scale(null,null,null,this.options.pies.fillOpacity).toString();if(this.options.pies.fill){this.context.fill();}
if(sliceMiddle<=0.25*(2*Math.PI))
{textAlign="left";verticalAlign="top";left=labelX;top=labelY+fontSize;labelSpan='<span style="display:block; width: 100px; position: relative; top: -18px; left: 30px; text-align: left;">'+gd.label+'</span>';}
else if(sliceMiddle>0.25*(2*Math.PI)&&sliceMiddle<=0.5*(2*Math.PI))
{textAlign="left";verticalAlign="bottom";left=labelX-labelWidth;top=labelY;labelSpan='<span style="display:block; width: 100px;position: relative; top: -18px; right: 110px; text-align: right;">'+gd.label+'</span>';}
else if(sliceMiddle>0.5*(2*Math.PI)&&sliceMiddle<=0.75*(2*Math.PI))
{textAlign="right";verticalAlign="bottom";left=labelX-labelWidth;top=labelY-fontSize;labelSpan='<span style="display:block; width: 100px;position: relative; top: -18px; right: 110px; text-align: right;">'+gd.label+'</span>';}
else
{textAlign="right";verticalAlign="bottom";left=labelX;top=labelY-fontSize;labelSpan='<span style="display:block; width: 100px;position: relative; top: -18px; left: 30px; text-align: left;">'+gd.label+'</span>';}
left=left+"px";top=top+"px";var textVal=Math.round(pct*100)+'% '+labelSpan;if(j==graphData.length-1){if(textVal+totalPct<100){textVal=textVal+1;}else if(textVal+totalPct>100){textVal=textVal-1;};}
var html="<div style=\"position: absolute; zindex:11; width:"+labelWidth+"px; font-size:"+fontSize+"px; top:"+top+";left:"+left+"; text-align: center; verticalAlign:"+verticalAlign+"\">"+textVal+"</div>";this.domObj.insert(html);totalPct=totalPct+textVal;}.bind(this));},drawBarGraph:function(graphData,barDataRange)
{graphData.each(function(gd,i){this.drawGraphBars(gd,i,graphData.size(),barDataRange);}.bind(this));},drawGraphBar:function(graphData)
{this.drawGraphBars(graphData,0,this.graphData.length,this.barDataRange);},plotBars:function(graphData,data,barWidth,offset,fill,counter,total,barDataRange){var shift=0;if(total%2==0)
{shift=(1+((counter-total/2)-1))*barWidth;}
else
{var interval=0.5;if(counter==(total/2-interval)){shift=-barWidth*interval;}
else{shift=(interval+(counter-Math.round(total/2)))*barWidth;}}
var rangeData=[];data.each(function(d){if(!d)return;var x=d[0],y=d[1];var drawLeft=true,drawTop=true,drawRight=true;var left=x+shift,right=x+barWidth+shift,bottom=0,top=y;var rangeDataPoint={};rangeDataPoint.left=left;rangeDataPoint.right=right;rangeDataPoint.value=top;rangeData.push(rangeDataPoint);if(right<this.xaxis.min||left>this.xaxis.max||top<this.yaxis.min||bottom>this.yaxis.max)
return;if(left<this.xaxis.min){left=this.xaxis.min;drawLeft=false;}
if(right>this.xaxis.max){right=this.xaxis.max;drawRight=false;}
if(bottom<this.yaxis.min)
bottom=this.yaxis.min;if(top>this.yaxis.max){top=this.yaxis.max;drawTop=false;}
if(graphData.bars.showShadow&&graphData.shadowSize>0)
this.plotShadowOutline(graphData,this.context.strokeStyle,left,bottom,top,right,drawLeft,drawRight,drawTop);if(fill){this.context.beginPath();this.context.moveTo(this.translateHoz(left),this.translateVert(bottom)+offset);this.context.lineTo(this.translateHoz(left),this.translateVert(top)+offset);this.context.lineTo(this.translateHoz(right),this.translateVert(top)+offset);this.context.lineTo(this.translateHoz(right),this.translateVert(bottom)+offset);this.context.fill();}
if(drawLeft||drawRight||drawTop){this.context.beginPath();this.context.moveTo(this.translateHoz(left),this.translateVert(bottom)+offset);if(drawLeft)
this.context.lineTo(this.translateHoz(left),this.translateVert(top)+offset);else
this.context.moveTo(this.translateHoz(left),this.translateVert(top)+offset);if(drawTop)
this.context.lineTo(this.translateHoz(right),this.translateVert(top)+offset);else
this.context.moveTo(this.translateHoz(right),this.translateVert(top)+offset);if(drawRight)
this.context.lineTo(this.translateHoz(right),this.translateVert(bottom)+offset);else
this.context.moveTo(this.translateHoz(right),this.translateVert(bottom)+offset);this.context.stroke();}}.bind(this));barDataRange.push(rangeData);},plotShadowOutline:function(graphData,orgStrokeStyle,left,bottom,top,right,drawLeft,drawRight,drawTop)
{var orgOpac=0.3;for(var n=1;n<=this.options.shadowSize/2;n++)
{var opac=orgOpac*n;this.context.beginPath();this.context.strokeStyle="rgba(0,0,0,"+opac+")";this.context.moveTo(this.translateHoz(left)+n,this.translateVert(bottom));if(drawLeft)
this.context.lineTo(this.translateHoz(left)+n,this.translateVert(top)-n);else
this.context.moveTo(this.translateHoz(left)+n,this.translateVert(top)-n);if(drawTop)
this.context.lineTo(this.translateHoz(right)+n,this.translateVert(top)-n);else
this.context.moveTo(this.translateHoz(right)+n,this.translateVert(top)-n);if(drawRight)
this.context.lineTo(this.translateHoz(right)+n,this.translateVert(bottom));else
this.context.lineTo(this.translateHoz(right)+n,this.translateVert(bottom));this.context.stroke();this.context.closePath();}
this.context.strokeStyle=orgStrokeStyle;},drawGraphBars:function(graphData,counter,total,barDataRange){this.context.save();this.context.translate(this.chartOffset.left,this.chartOffset.top);this.context.lineJoin="round";var bw=graphData.bars.barWidth;var lw=Math.min(graphData.bars.lineWidth,bw);this.context.lineWidth=lw;this.context.strokeStyle=graphData.color;if(graphData.bars.fill){this.context.fillStyle=graphData.bars.fillColor!=null?graphData.bars.fillColor:this.parseColor(graphData.color).scale(null,null,null,this.options.bars.fillOpacity).toString();}
this.plotBars(graphData,graphData.data,bw,0,graphData.bars.fill,counter,total,barDataRange);this.context.restore();},insertLegend:function(){this.domObj.select(".legend").invoke('remove');if(!this.options.legend.show)
return;var fragments=[];var rowStarted=false;this.graphData.each(function(gd,index){if(!gd.label){return;}
if(index%this.options.legend.noColumns==0){if(rowStarted){fragments.push('</tr>');}
fragments.push('<tr>');rowStarted=true;}
var label=gd.label;if(this.options.legend.labelFormatter!=null){label=this.options.legend.labelFormatter(label);}
fragments.push('<td class="legendColorBox"><div style="border:1px solid '+this.options.legend.labelBoxBorderColor+';padding:1px"><div style="width:14px;height:10px;background-color:'+gd.color+';overflow:hidden"></div></div></td>'+'<td class="legendLabel">'+label+'</td>');}.bind(this));if(rowStarted)
fragments.push('</tr>');if(fragments.length>0){var table='<table style="font-size:smaller;color:'+this.options.grid.color+'">'+fragments.join("")+'</table>';if($(this.options.legend.container)!=null){$(this.options.legend.container).insert(table);}else{var pos='';var p=this.options.legend.position,m=this.options.legend.margin;if(p.charAt(0)=='n')pos+='top:'+(m+this.chartOffset.top)+'px;';else if(p.charAt(0)=='s')pos+='bottom:'+(m+this.chartOffset.bottom)+'px;';pos+='right: -140px;';var div=this.domObj.insert('<div class="ProtoChart-legend" style="border: 1px solid '+this.options.legend.borderColor+'; position:absolute;z-index:2;'+pos+'">'+table+'</div>').getElementsBySelector('div.ProtoChart-legend').first();if(this.options.legend.backgroundOpacity!=0.0){var c=this.options.legend.backgroundColor;if(c==null){var tmp=(this.options.grid.backgroundColor!=null)?this.options.grid.backgroundColor:this.extractColor(div);c=this.parseColor(tmp).adjust(null,null,null,1).toString();}
this.domObj.insert('<div class="ProtoChart-legend-bg" style="position:absolute;width:'+div.getWidth()+'px;height:'+div.getHeight()+'px;'+pos+'background-color:'+c+';"> </div>').select('div.ProtoChart-legend-bg').first().setStyle({'opacity':this.options.legend.backgroundOpacity});}}}},onMouseMove:function(ev){var e=ev||window.event;if(e.pageX==null&&e.clientX!=null){var de=document.documentElement,b=$(document.body);this.lastMousePos.pageX=e.clientX+(de&&de.scrollLeft||b.scrollLeft||0);this.lastMousePos.pageY=e.clientY+(de&&de.scrollTop||b.scrollTop||0);}
else{this.lastMousePos.pageX=e.pageX;this.lastMousePos.pageY=e.pageY;}
var offset=this.overlay.cumulativeOffset();var pos={x:this.xaxis.min+(e.pageX-offset.left-this.chartOffset.left)/this.hozScale,y:this.yaxis.max-(e.pageY-offset.top-this.chartOffset.top)/this.vertScale};if(this.options.mouse.track&&this.selectionInterval==null){this.hit(ev,pos);}
this.domObj.fire("ProtoChart:mousemove",[pos]);},onMouseDown:function(e){if(e.which!=1)
return;document.body.focus();if(document.onselectstart!==undefined&&this.workarounds.onselectstart==null){this.workarounds.onselectstart=document.onselectstart;document.onselectstart=function(){return false;};}
if(document.ondrag!==undefined&&this.workarounds.ondrag==null){this.workarounds.ondrag=document.ondrag;document.ondrag=function(){return false;};}
this.setSelectionPos(this.selection.first,e);if(this.selectionInterval!=null)
clearInterval(this.selectionInterval);this.lastMousePos.pageX=null;this.selectionInterval=setInterval(this.updateSelectionOnMouseMove.bind(this),200);this.overlay.observe("mouseup",this.onSelectionMouseUp.bind(this));},onClick:function(e){if(this.ignoreClick){this.ignoreClick=false;return;}
var offset=this.overlay.cumulativeOffset();var pos={x:this.xaxis.min+(e.pageX-offset.left-this.chartOffset.left)/this.hozScale,y:this.yaxis.max-(e.pageY-offset.top-this.chartOffset.top)/this.vertScale};this.domObj.fire("ProtoChart:plotclick",[pos]);if(this.options.allowDataClick)
{var dataPoint={};if(this.options.points.show)
{dataPoint=this.getDataClickPoint(pos,this.options);this.domObj.fire("ProtoChart:dataclick",[dataPoint]);}
else if(this.options.lines.show&&this.options.points.show)
{dataPoint=this.getDataClickPoint(pos,this.options);this.domObj.fire("ProtoChart:dataclick",[dataPoint]);}
else if(this.options.bars.show)
{if(this.barDataRange.length>0)
{dataPoint=this.getDataClickPoint(pos,this.options,this.barDataRange);this.domObj.fire("ProtoChart:dataclick",[dataPoint]);}}}},getDataClickPoint:function(pos,options,barDataRange)
{pos.x=parseInt(pos.x);pos.y=parseInt(pos.y);var yClick=pos.y.toFixed(0);var dataVal={};dataVal.position=pos;dataVal.value='';if(options.points.show)
{this.graphData.each(function(gd){var temp=gd.data;var xClick=parseInt(pos.x.toFixed(0));if(xClick<0){xClick=0;}
if(temp[xClick]&&yClick>=temp[xClick][1]-(this.options.points.radius*10)&&yClick<=temp[xClick][1]+(this.options.points.radius*10)){dataVal.value=temp[xClick][1];throw $break;}}.bind(this));}
else if(options.bars.show)
{xClick=pos.x;this.barDataRange.each(function(barData){barData.each(function(data){var temp=data;if(xClick>temp.left&&xClick<temp.right){dataVal.value=temp.value;throw $break;}}.bind(this));}.bind(this));}
return dataVal;},triggerSelectedEvent:function(){var x1,x2,y1,y2;if(this.selection.first.x<=this.selection.second.x){x1=this.selection.first.x;x2=this.selection.second.x;}
else{x1=this.selection.second.x;x2=this.selection.first.x;}
if(this.selection.first.y>=this.selection.second.y){y1=this.selection.first.y;y2=this.selection.second.y;}
else{y1=this.selection.second.y;y2=this.selection.first.y;}
x1=this.xaxis.min+x1/this.hozScale;x2=this.xaxis.min+x2/this.hozScale;y1=this.yaxis.max-y1/this.vertScale;y2=this.yaxis.max-y2/this.vertScale;this.domObj.fire("ProtoChart:selected",[{x1:x1,y1:y1,x2:x2,y2:y2}]);},onSelectionMouseUp:function(e){if(document.onselectstart!==undefined)
document.onselectstart=this.workarounds.onselectstart;if(document.ondrag!==undefined)
document.ondrag=this.workarounds.ondrag;if(this.selectionInterval!=null){clearInterval(this.selectionInterval);this.selectionInterval=null;}
this.setSelectionPos(this.selection.second,e);this.clearSelection();if(!this.selectionIsSane()||e.which!=1)
return false;this.drawSelection();this.triggerSelectedEvent();this.ignoreClick=true;return false;},setSelectionPos:function(pos,e){var offset=$(this.overlay).cumulativeOffset();if(this.options.selection.mode=="y"){if(pos==this.selection.first)
pos.x=0;else
pos.x=this.chartWidth;}
else{pos.x=e.pageX-offset.left-this.chartOffset.left;pos.x=Math.min(Math.max(0,pos.x),this.chartWidth);}
if(this.options.selection.mode=="x"){if(pos==this.selection.first)
pos.y=0;else
pos.y=this.chartHeight;}
else{pos.y=e.pageY-offset.top-this.chartOffset.top;pos.y=Math.min(Math.max(0,pos.y),this.chartHeight);}},updateSelectionOnMouseMove:function(){if(this.lastMousePos.pageX==null)
return;this.setSelectionPos(this.selection.second,this.lastMousePos);this.clearSelection();if(this.selectionIsSane())
this.drawSelection();},clearSelection:function(){if(this.prevSelection==null)
return;var x=Math.min(this.prevSelection.first.x,this.prevSelection.second.x),y=Math.min(this.prevSelection.first.y,this.prevSelection.second.y),w=Math.abs(this.prevSelection.second.x-this.prevSelection.first.x),h=Math.abs(this.prevSelection.second.y-this.prevSelection.first.y);this.overlayContext.clearRect(x+this.chartOffset.left-this.overlayContext.lineWidth,y+this.chartOffset.top-this.overlayContext.lineWidth,w+this.overlayContext.lineWidth*2,h+this.overlayContext.lineWidth*2);this.prevSelection=null;},setSelection:function(area){this.clearSelection();if(this.options.selection.mode=="x"){this.selection.first.y=0;this.selection.second.y=this.chartHeight;}
else{this.selection.first.y=(this.yaxis.max-area.y1)*this.vertScale;this.selection.second.y=(this.yaxis.max-area.y2)*this.vertScale;}
if(this.options.selection.mode=="y"){this.selection.first.x=0;this.selection.second.x=this.chartWidth;}
else{this.selection.first.x=(area.x1-this.xaxis.min)*this.hozScale;this.selection.second.x=(area.x2-this.xaxis.min)*this.hozScale;}
this.drawSelection();this.triggerSelectedEvent();},drawSelection:function(){if(this.prevSelection!=null&&this.selection.first.x==this.prevSelection.first.x&&this.selection.first.y==this.prevSelection.first.y&&this.selection.second.x==this.prevSelection.second.x&&this.selection.second.y==this.prevSelection.second.y)
{return;}
this.overlayContext.strokeStyle=this.parseColor(this.options.selection.color).scale(null,null,null,0.8).toString();this.overlayContext.lineWidth=1;this.context.lineJoin="round";this.overlayContext.fillStyle=this.parseColor(this.options.selection.color).scale(null,null,null,0.4).toString();this.prevSelection={first:{x:this.selection.first.x,y:this.selection.first.y},second:{x:this.selection.second.x,y:this.selection.second.y}};var x=Math.min(this.selection.first.x,this.selection.second.x),y=Math.min(this.selection.first.y,this.selection.second.y),w=Math.abs(this.selection.second.x-this.selection.first.x),h=Math.abs(this.selection.second.y-this.selection.first.y);this.overlayContext.fillRect(x+this.chartOffset.left,y+this.chartOffset.top,w,h);this.overlayContext.strokeRect(x+this.chartOffset.left,y+this.chartOffset.top,w,h);},selectionIsSane:function(){var minSize=5;return Math.abs(this.selection.second.x-this.selection.first.x)>=minSize&&Math.abs(this.selection.second.y-this.selection.first.y)>=minSize;},defaultTrackFormatter:function(val)
{return'['+val.x+', '+val.y+']';},clearHit:function(){if(this.prevHit){this.overlayContext.clearRect(this.translateHoz(this.prevHit.x)+this.chartOffset.left-this.options.mouse.radius*2,this.translateVert(this.prevHit.y)+this.chartOffset.top-this.options.mouse.radius*2,this.options.mouse.radius*3+this.options.points.lineWidth*3,this.options.mouse.radius*3+this.options.points.lineWidth*3);this.prevHit=null;}},hit:function(event,mouse){var n={dist:Number.MAX_VALUE,x:null,y:null,mouse:null};for(var i=0,data,xsens,ysens;i<this.graphData.length;i++){if(!this.graphData[i].mouse.track)continue;data=this.graphData[i].data;xsens=(this.hozScale*this.graphData[i].mouse.sensibility);ysens=(this.vertScale*this.graphData[i].mouse.sensibility);for(var j=0,xabs,yabs;j<data.length;j++){xabs=this.hozScale*Math.abs(data[j][0]-mouse.x);yabs=this.vertScale*Math.abs(data[j][1]-mouse.y);if(xabs<xsens&&yabs<ysens&&(xabs+yabs)<n.dist){n.dist=(xabs+yabs);n.x=data[j][0];n.y=data[j][1];n.mouse=this.graphData[i].mouse;}}}
if(n.mouse&&n.mouse.track&&!this.prevHit||(this.prevHit&&n.x!=this.prevHit.x&&n.y!=this.prevHit.y)){var el=this.domObj.select('.'+this.options.mouse.clsName).first();if(!el){var pos='',p=this.options.mouse.position,m=this.options.mouse.margin;if(p.charAt(0)=='n')pos+='top:'+(m+this.chartOffset.top)+'px;';else if(p.charAt(0)=='s')pos+='bottom:'+(m+this.chartOffset.bottom)+'px;';if(p.charAt(1)=='e')pos+='right:'+(m+this.chartOffset.right)+'px;';else if(p.charAt(1)=='w')pos+='left:'+(m+this.chartOffset.bottom)+'px;';this.domObj.insert('<div class="'+this.options.mouse.clsName+'" style="display:none;position:absolute;'+pos+'"></div>');return;}
if(n.x!==null&&n.y!==null){el.setStyle({display:'block'});this.clearHit();if(n.mouse.lineColor!=null){this.overlayContext.save();this.overlayContext.translate(this.chartOffset.left,this.chartOffset.top);this.overlayContext.lineWidth=this.options.points.lineWidth;this.overlayContext.strokeStyle=n.mouse.lineColor;this.overlayContext.fillStyle='#ffffff';this.overlayContext.beginPath();this.overlayContext.arc(this.translateHoz(n.x),this.translateVert(n.y),this.options.mouse.radius,0,2*Math.PI,true);this.overlayContext.fill();this.overlayContext.stroke();this.overlayContext.restore();}
this.prevHit=n;var decimals=n.mouse.trackDecimals;if(decimals==null||decimals<0)decimals=0;if(!this.options.mouse.fixedPosition)
{el.setStyle({left:(this.translateHoz(n.x)+this.options.mouse.radius+10)+"px",top:(this.translateVert(n.y)+this.options.mouse.radius+10)+"px"});}
el.innerHTML=n.mouse.trackFormatter({x:n.x.toFixed(decimals),y:n.y.toFixed(decimals)});this.domObj.fire('ProtoChart:hit',[n])}else if(this.options.prevHit){el.setStyle({display:'none'});this.clearHit();}}},floorInBase:function(n,base){return base*Math.floor(n/base);},extractColor:function(element)
{var color;do
{color=$(element).getStyle('background-color').toLowerCase();if(color!=''&&color!='transparent')
{break;}
element=element.up(0);}while(element.nodeName.toLowerCase()!='body');if(color=='rgba(0, 0, 0, 0)')
return'transparent';return color;},parseColor:function(str)
{var result;if((result=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str)))
return new Proto.Color(parseInt(result[1]),parseInt(result[2]),parseInt(result[3]));if((result=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)))
return new Proto.Color(parseInt(result[1]),parseInt(result[2]),parseInt(result[3]),parseFloat(result[4]));if((result=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str)))
return new Proto.Color(parseFloat(result[1])*2.55,parseFloat(result[2])*2.55,parseFloat(result[3])*2.55);if((result=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)))
return new Proto.Color(parseFloat(result[1])*2.55,parseFloat(result[2])*2.55,parseFloat(result[3])*2.55,parseFloat(result[4]));if((result=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str)))
return new Proto.Color(parseInt(result[1],16),parseInt(result[2],16),parseInt(result[3],16));if((result=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str)))
return new Proto.Color(parseInt(result[1]+result[1],16),parseInt(result[2]+result[2],16),parseInt(result[3]+result[3],16));var name=str.strip().toLowerCase();if(name=='transparent'){return new Proto.Color(255,255,255,0);}
return new Proto.Color(100,100,100,1);}});if(!Proto)var Proto={};Proto.Color=Class.create({initialize:function(r,g,b,a){this.rgba=['r','g','b','a'];var x=4;while(-1<--x){this[this.rgba[x]]=arguments[x]||((x==3)?1.0:0);}},toString:function(){if(this.a>=1.0){return"rgb("+[this.r,this.g,this.b].join(",")+")";}
else{return"rgba("+[this.r,this.g,this.b,this.a].join(",")+")";}},scale:function(rf,gf,bf,af){x=4;while(-1<--x){if(arguments[x]!=null){this[this.rgba[x]]*=arguments[x];}}
return this.normalize();},adjust:function(rd,gd,bd,ad){x=4;while(-1<--x){if(arguments[x]!=null)
this[this.rgba[x]]+=arguments[x];}
return this.normalize();},clone:function(){return new Proto.Color(this.r,this.b,this.g,this.a);},limit:function(val,minVal,maxVal){return Math.max(Math.min(val,maxVal),minVal);},normalize:function(){this.r=this.limit(parseInt(this.r),0,255);this.g=this.limit(parseInt(this.g),0,255);this.b=this.limit(parseInt(this.b),0,255);this.a=this.limit(this.a,0,1);return this;}});