var Grafico={Version:"0.9.1",Base:{},BaseGraph:{},Normaliser:{},LineGraph:{},AreaGraph:{},StackGraph:{},StreamGraph:{},BarGraph:{},StackedBarGraph:{},HorizontalBarGraph:{},SparkLine:{},SparkBar:{}};
Grafico.Base=Class.create({normaliseData:function(a){return $A(a).collect(function(a){return this.normalise(a)}.bind(this))},deepCopy:function(a){var b,c,d;if(Object.prototype.toString.call(a)==="[object Array]"){b=[];d=a.length;for(c=0;c<d;c++)b[c]=arguments.callee(a[c]);return b}if(typeof a==="object"){b={};for(c in a)b[c]=arguments.callee(a[c]);return b}return a}});
Grafico.Normaliser=Class.create({initialize:function(a,b){this.options={start_value:void 0,number_of_tickmarks:10};Object.extend(this.options,b||{});this.min=a.min();this.max=a.max();this.step=this.range=this.zero_value=this.start_value=void 0;if(this.options.start_value!==void 0)this.zero_value=this.start_value=this.options.start_value;this.min==0&&this.min==this.max?(this.zero_value=this.start_value=0,this.step=this.range=1):this.looseLabels(this.start_value!==void 0&&this.min>=0?this.start_value:
this.min,this.max)},looseLabels:function(a,b){var c=this.niceNumber((a==b?this.niceNumber(Math.abs(b),!1):this.niceNumber(b-a,!1))/(this.options.number_of_tickmarks-1),!0),d=[-Math.floor(Math.LOG10E*Math.log(c)),0].max(),e=this.floorToPrecision(a/c,d)*c,f=this.ceilToPrecision(b/c,d)*c,g=this.roundToPrecision(this.niceNumber(0.5*c,!0),d);this.step=this.roundToPrecision(c,d);this.max<=0?f=[f+g,0].min():f+=g;this.min<0?e-=g:e=[e-g,0].max();a!==b&&(e=this.roundToOrigin(e,1));this.range=this.roundToPrecision(Math.abs(this.ceilToPrecision(f,
d)-this.floorToPrecision(e,d)),d);this.start_value=this.floorToPrecision(e,d);this.zero_value=this.roundToPrecision(Math.abs(e)/this.step,d)},roundToPrecision:function(a,b){var c=Math.pow(10,b);return Math.round(a*c)/c},floorToPrecision:function(a,b){var c=Math.pow(10,b);return Math.floor(a*c)/c},ceilToPrecision:function(a,b){var c=Math.pow(10,b);return Math.ceil(a*c)/c},niceNumber:function(a,b){var c=Math.floor(Math.LOG10E*Math.log(a)),d;c=c<0?parseFloat(Math.pow(10,c).toFixed(Math.abs(c))):Math.pow(10,
c);d=a/c;return(b?d<1.5?1:d<3?2:d<7?5:10:d<=1?1:d<=2?2:d<=5?5:10)*c},roundToOrigin:function(a,b){var c=a;c=Math.pow(10,-(b||1));c=Math.round(a*c)/c;return c>this.min?this.roundToOrigin(a-this.step):c}});
Grafico.BaseGraph=Class.create(Grafico.Base,{initialize:function(a,b,c){this.options={width:parseInt(a.getStyle("width"),10),height:parseInt(a.getStyle("height"),10),grid:!0,show_vertical_grid:!0,show_horizontal_grid:!0,plot_padding:10,font_size:10,show_horizontal_labels:!0,show_vertical_labels:!0,show_ticks:!0,vertical_label_unit:"",background_color:"#fff",label_color:"#000",grid_color:"#ccc",hover_text_color:"#fff",markers:!1,marker_size:5,meanline:!1,padding_top:20,draw_axis:!0,datalabels:"",hover_color:"",
hover_radius:15,watermark:!1,watermark_location:!1,hide_empty_label_grid:!1,left_padding:!1,right_padding:!1,label_rotation:0,label_max_size:!1,focus_hint:!0,min:0,max:null,normaliser:Grafico.Normaliser};Object.extend(this.options,this.chartDefaults()||{});Object.extend(this.options,c||{});this.element=a;this.data_sets=Object.isArray(b)?new Hash({one:b}):$H(b);if(this.chartDefaults().stacked===!0)this.real_data=this.deepCopy(this.data_sets),this.data_sets=this.stackData(this.data_sets);this.flat_data=
this.data_sets.collect(function(a){return a[1]}).flatten();if(this.hasBaseLine())this.flat_data.push(this.base_line),this.flat_data=this.flat_data.flatten();this.normaliser=new this.options.normaliser(this.flat_data,this.normaliserOptions());this.label_step=this.normaliser.step;this.range=this.normaliser.range;this.start_value=this.normaliser.start_value;this.zero_value=this.normaliser.zero_value;this.data_size=this.longestDataSetLength();if(c&&c.color)c.colors={},this.data_sets.keys().each(function(a){c.colors[a]=
c.color});this.options.colors=this.makeRandomColors();this.options.labels=$A($R(1,this.data_size));Object.extend(this.options,this.chartDefaults()||{});Object.extend(this.options,c||{});this.x_padding_left=10+this.paddingLeftOffset();this.x_padding_left+=this.options.vertical_label_unit?6:0;this.x_padding_left=this.options.left_padding?this.options.left_padding:this.x_padding_left;this.x_padding_right=this.options.right_padding||this.paddingRightOffset();this.x_padding=this.x_padding_left+this.x_padding_right;
this.y_padding_top=this.options.padding_top;this.y_padding_bottom=20+this.paddingBottomOffset();this.y_padding=this.y_padding_top+this.y_padding_bottom;this.graph_width=this.options.width-this.x_padding;this.graph_height=this.options.height-this.y_padding;this.step=this.calculateStep();this.y_label_count=(this.range/this.label_step).round();if(isNaN(this.y_label_count))this.y_label_count=1,this.options.show_vertical_labels=!1;this.normaliser.min+this.y_label_count*this.normaliser.step<this.normaliser.max&&
(this.y_label_count+=1);this.value_labels=this.makeValueLabels(this.y_label_count);this.top_value=this.value_labels.last();this.grid_start_offset=-1;this.paper=new Raphael(this.element,this.options.width,this.options.height);this.background=this.paper.rect(this.x_padding_left,this.y_padding_top,this.graph_width,this.graph_height);this.background.attr({fill:this.options.background_color,stroke:"none"});this.options.meanline=this.options.meanline===!0?{"stroke-width":"2px",stroke:"#BBBBBB"}:this.options.meanline;
this.globalMarkerSet=this.paper.set();this.globalHoverSet=this.paper.set();this.globalBlockSet=this.paper.set();this.globalAreaLineSet=this.paper.set();this.setChartSpecificOptions();this.draw();this.globalAreaLineSet.toFront();this.globalMarkerSet.toFront();this.globalHoverSet.toFront();this.globalBlockSet.toFront()},normaliserOptions:function(){return{graph_height:parseInt(this.element.getStyle("height"),10)}},hasBaseLine:function(){return!1},getNormalizedBaseLine:function(){if(this.normalized_base_line==
void 0)this.normalized_base_line=this.normaliseData(this.base_line);return this.normalized_base_line},getNormalizedRealData:function(){if(this.normalized_real_data==void 0)this.normalized_real_data=this.real_data.collect(function(a){return this.normaliseData(a[1])}.bind(this));return this.normalized_real_data},chartDefaults:function(){},drawPlot:function(){},calculateStep:function(){},getMousePos:function(a){var b=0,c=0;if(!a)a=window.event;if(a.pageX||a.pageY)b=a.pageX,c=a.pageY;else if(a.clientX||
a.clientY)b=a.clientX+document.body.scrollLeft-document.documentElement.scrollLeft,c=a.clientY+document.body.scrollTop-document.documentElement.scrollTop;return{x:b,y:c}},makeRandomColors:function(){var a={},b=1/this.data_sets.size(),c=Math.random();this.data_sets.each(function(d){a[d[0]]=Raphael.hsb2rgb(c,0.85,0.75).hex;c=(c+b)%1});return a},longestDataSetLength:function(){var a=0;this.data_sets.each(function(b){a=b[1].length>a?b[1].length:a});return a},roundValue:function(a,b){var c=Math.pow(10,
b);a*=c;return a=Math.round(a)/c},roundValues:function(a,b){return $A(a).collect(function(a){return this.roundValue(a,b)}.bind(this))},paddingLeftOffset:function(){var a=0;if(this.options.show_vertical_labels)a=this.flat_data,a=this.roundValues(a,2),a=$A(a).max(function(a){return a.toString().length}),a=(a>2?a-1:a)*this.options.font_size;return a},paddingRightOffset:function(){return 20},paddingBottomOffset:function(){return this.options.font_size},normalise:function(a){var b=this.start_value===0?
this.top_value:this.range;b===0&&(b=1);return a/b*this.graph_height},draw:function(){this.options.grid&&this.drawGrid();this.options.watermark&&this.drawWatermark();this.options.show_vertical_labels&&this.drawVerticalLabels();this.options.show_horizontal_labels&&this.drawHorizontalLabels();this.options.watermark||this.drawLinesInit(this);this.options.draw_axis&&this.drawAxis();this.start_value!==0&&this.options.focus_hint&&this.drawFocusHint();this.options.meanline&&this.drawMeanLine(this.normaliseData(this.flat_data))},
drawLinesInit:function(a){a.data_sets.each(function(b,c){a.drawLines(b[0],a.options.colors[b[0]],a.normaliseData(b[1]),a.options.datalabels[b[0]],a.element,c)}.bind(a))},drawWatermark:function(){var a=this.options.watermark,b=new Image,c=this;b.onload=function(){var a,e;c.options.watermark_location==="middle"?(a=(c.graph_width-b.width)/2+c.x_padding_left,e=(c.graph_height-b.height)/2+c.y_padding_top):(a=c.graph_width-b.width+c.x_padding_left-2,e=c.graph_height-b.height+c.y_padding_top-2);a=c.paper.image(b.src,
a,e,b.width,b.height).attr({opacity:"0.4"});c.drawLinesInit(c,c.data);(c.options.stacked_fill||c.options.area)&&a.toFront()};b.src=a.src||a},drawGrid:function(){var a=this.paper.path().attr({stroke:this.options.grid_color}),b,c,d;if(this.options.show_horizontal_grid){b=this.graph_height+this.y_padding_top;for(d=0;d<this.y_label_count+1;d++)a.moveTo(this.x_padding_left-0.5,parseInt(b,10)+0.5),a.lineTo(this.x_padding_left+this.graph_width-0.5,parseInt(b,10)+0.5),b-=this.graph_height/this.y_label_count}if(this.options.show_vertical_grid){b=
this.x_padding_left+this.options.plot_padding+this.grid_start_offset;c=this.options.labels.length;for(d=0;d<c;d++){if(this.options.hide_empty_label_grid===!0&&this.options.labels[d]!==""||this.options.hide_empty_label_grid===!1)a.moveTo(parseInt(b,10),this.y_padding_top),a.lineTo(parseInt(b,10),this.y_padding_top+this.graph_height);b+=this.step}}},drawLines:function(a,b,c,d,e,f){var g=this.calculateCoords(c),h=this.graph_height+this.y_padding_top,i,j,k;if(this.options.start_at_zero===!1)k=0,$A(g).each(function(a){if(a[1]===
h)k++;else throw $break;}),this.options.odd_horizontal_offset=k,this.options.odd_horizontal_offset>1&&g.splice(0,this.options.odd_horizontal_offset);this.options.stacked_fill||this.options.area?(this.options.area?(a=this.options.area_opacity?this.options.area_opacity:1.5/this.data_sets.collect(function(a){return a.length}).length,i=this.paper.path().attr({stroke:b,fill:b,"stroke-width":"0",opacity:a,"stroke-opacity":0})):i=this.paper.path().attr({stroke:b,fill:b,"stroke-width":"0"}),this.hasBaseLine()||
(g.unshift([g[0][0],h]),g.push([g[g.length-1][0],h]))):i=this.paper.path().attr({stroke:b,"stroke-width":this.options.stroke_width+"px"});$A(g).each(function(a,c){var h=a[0],j=a[1];b instanceof Array?this.drawPlot(c,i,h,j,b[c%b.length],g,d,e,f):this.drawPlot(c,i,h,j,b,g,d,e,f)}.bind(this));this.options.area&&this.options.stroke_width>0&&(j=this.paper.path().attr({stroke:b,"stroke-width":this.options.stroke_width+"px"}),g.remove(0),g.remove(-1),$A(g).each(function(a,c){this.drawPlot(c,j,a[0],a[1],
b,g,d,e,f,!0)}.bind(this)),this.globalAreaLineSet.push(j));this.options.datalabels&&this.options.draw_hovers&&(this.drawHover(i,d,e,b),this.globalHoverSet.toFront())},calculateCoords:function(a){var b=this.x_padding_left+this.options.plot_padding-this.step,c=this.graph_height+this.y_padding_top+this.normalise(this.start_value);a=$A(a).collect(function(a){b+=this.step;return[b,c-a]}.bind(this));if(!this.hasBaseLine())return a;b+=this.step;for(var d=this.getNormalizedBaseLine(),e=d.length-1;e>=0;e--)b-=
this.step,a.push([b,c-d[e]]);return a},drawFocusHint:function(){var a=this.x_padding_left+2.5-1,b=this.options.height-this.y_padding_bottom,c=this.paper.path().attr({stroke:this.options.label_color,"stroke-width":2});c.moveTo(a,b);c.lineTo(a-5,b-5);c.moveTo(a,b-5);c.lineTo(a-5,b-10)},drawMeanLine:function(a){var b=this.paper.path().attr(this.options.meanline);a=$A(a).inject(0,function(a,b){return b+a})/a.length-0.5;a=this.options.bar?a+this.zero_value*(this.graph_height/this.y_label_count):a;b.moveTo(this.x_padding_left-
1,this.options.height-this.y_padding_bottom-a).lineTo(this.graph_width+this.x_padding_left,this.options.height-this.y_padding_bottom-a)},drawAxis:function(){var a=this.paper.path().attr({stroke:this.options.label_color});a.moveTo(parseInt(this.x_padding_left,10)-0.5,this.options.height-parseInt(this.y_padding_bottom,10)+0.5);a.lineTo(parseInt(this.graph_width+this.x_padding_left,10)-0.5,this.options.height-parseInt(this.y_padding_bottom,10)+0.5);a.moveTo(parseInt(this.x_padding_left,10)-0.5,parseInt(this.options.height-
this.y_padding_bottom,10)+0.5);a.lineTo(parseInt(this.x_padding_left,10)-0.5,parseInt(this.y_padding_top,10))},makeValueLabels:function(a){for(var b=this.label_step,c=this.start_value,d=[],e=0;e<a;e++)c=this.roundValue(c+b,3),d.push(c);return d},drawMarkers:function(a,b,c,d,e,f){var g=parseInt(this.x_padding_left,10)-0.5+d*b[0],h=this.options.height-this.y_padding_bottom+d*b[1],i=this.paper.path().attr({stroke:this.options.label_color}),j={font:this.options.font_size+'px "Arial"',stroke:"none",fill:this.options.label_color};
Object.extend(j,f||{});a.each(function(a){if(this.options.draw_axis&&(this.options.hide_empty_label_grid===!0&&a!==""||this.options.hide_empty_label_grid===!1)&&this.options.show_ticks)i.moveTo(parseInt(g,10),parseInt(h,10)+0.5),i.lineTo(parseInt(g,10)+5*b[1],parseInt(h,10)+0.5+5*b[0]);a!==""&&this.paper.text(g+e[0],h-2-e[1],a.toString()).attr(j);g+=c*b[0];h+=c*b[1]}.bind(this))},drawVerticalLabels:function(){for(var a=this.graph_height/this.y_label_count,b=this.options.vertical_label_unit?" "+this.options.vertical_label_unit:
"",c=0;c<this.value_labels.length;c++)this.value_labels[c]+=b;this.drawMarkers(this.value_labels,[0,-1],a,a,[-8,-2],{"text-anchor":"end"})},drawHorizontalLabels:function(){var a=this.options.label_rotation?{rotation:this.options.label_rotation,translation:-this.options.font_size+" 0"}:{},b=this.options.labels;if(this.options.label_max_size)for(var c=0;c<b.length;c++)b[c]=b[c].truncate(this.options.label_max_size+1,"\u2026");this.drawMarkers(b,[1,0],this.step,this.options.plot_padding,[0,(this.options.font_size+
7)*-1],a)},drawHover:function(a,b,c,d){var e=this,f=this.options.stacked_fill||this.options.area?"fill":"stroke",g=this.options.hover_color||d,h=this.paper.set();b=this.paper.text(a.attrs.x,a.attrs.y-this.options.font_size*1.5-4,b).attr({"font-size":this.options.font_size,fill:this.options.hover_text_color,opacity:1});var i=b.getBBox(),j=this.drawRoundRect(b,i,4);h.push(j,b).attr({opacity:0});this.checkHoverPos({rect:j,set:h});this.globalHoverSet.push(h);a.hover(function(b){f==="fill"?a.animate({fill:g,
stroke:g},200):a.animate({stroke:g},200);b=e.getMousePos(b);h[0].attr({x:b.x-i.width/2-4-c.offsetLeft,y:b.y-i.height/2-e.options.font_size*1.5-4-c.offsetTop,opacity:1});h[1].attr({x:b.x-c.offsetLeft,y:b.y-e.options.font_size*1.5-c.offsetTop,opacity:1});a.mousemove(function(a){a=e.getMousePos(a);h[0].attr({x:a.x-i.width/2-4-c.offsetLeft,y:a.y-i.height/2-e.options.font_size*1.5-4-c.offsetTop,opacity:1});h[1].attr({x:a.x-c.offsetLeft,y:a.y-e.options.font_size*1.5-c.offsetTop,opacity:1});e.checkHoverPos(j,
h)})},function(){f==="fill"?a.animate({fill:d,stroke:d},200):a.animate({stroke:d},200);h.attr({opacity:0})})},checkHoverPos:function(a){var b,c,d,e,f,g;if(a.rect)c=a.rect,d=c.getBBox();if(a.set)e=a.set;if(a.marker)f=a.marker;if(a.nib)g=a.nib;if(a.textpadding)b=a.textpadding;if(c&&e){if(c.attrs.y<0)g&&f?(a=e.getBBox(),e.translate(0,a.height+b*2),f.translate(0,-a.height-b*2),g.translate(0,-d.height-b+1.5).scale(1,-1)):(b=c.attrs.y,e.translate(0,1-b));c.attrs.y+d.height>this.options.height&&(b=c.attrs.y+
d.height-this.options.height,e.translate(0,-b-1),f&&f.translate(0,b+1));if(c.attrs.x<0)b=c.attrs.x,e.translate(-b+1,0),g&&g.translate(b-1,0),f&&f.translate(b-1,0);c.attrs.x+d.width>this.options.width&&(b=c.attrs.x+d.width-this.options.width,e.translate(-b-1,0),g&&g.translate(b+1,0),f&&f.translate(b+1,0))}},drawNib:function(a,b,c){return this.paper.path().attr({fill:this.options.label_color,opacity:1,stroke:this.options.label_color,"stroke-width":"0px"}).moveTo(a.attrs.x-c,a.attrs.y+b.height/2+c-1).lineTo(a.attrs.x,
a.attrs.y+b.height/2+c*2).lineTo(a.attrs.x+c,a.attrs.y+b.height/2+c-1).andClose()},drawRoundRect:function(a,b,c){return this.paper.rect(a.attrs.x-b.width/2-c,a.attrs.y-b.height/2-c,b.width+c*2,b.height+c*2,c*1.5).attr({fill:this.options.label_color,opacity:1,stroke:this.options.label_color,"stroke-width":"0px"})}});Array.prototype.sum=function(){for(var a=0,b=0;a<this.length;b+=this[a++]);return b};
if(typeof Array.prototype.max==="undefined")Array.prototype.max=function(){return Math.max.apply({},this)};if(typeof Array.prototype.min==="undefined")Array.prototype.min=function(){return Math.min.apply({},this)};Array.prototype.mean=function(){return this.sum()/this.length};Array.prototype.variance=function(){for(var a=this.mean(),b=0,c=0;c<this.length;c++)b+=Math.pow(this[c]-a,2);return b/(this.length-1)};Array.prototype.standard_deviation=function(){return Math.sqrt(this.variance())};
Array.prototype.remove=function(a,b){var c=this.slice((b||a)+1||this.length);this.length=a<0?this.length+a:a;return this.push.apply(this,c)};Raphael.el.isAbsolute=!0;Raphael.el.absolutely=function(){this.isAbsolute=1;return this};Raphael.el.relatively=function(){this.isAbsolute=0;return this};Raphael.el.moveTo=function(a,b){this._last={x:a,y:b};return this.attr({path:this.attrs.path+["m","M"][+this.isAbsolute]+parseFloat(a)+" "+parseFloat(b)})};
Raphael.el.lineTo=function(a,b){this._last={x:a,y:b};return this.attr({path:this.attrs.path+["l","L"][+this.isAbsolute]+parseFloat(a)+" "+parseFloat(b)})};Raphael.el.cplineTo=function(a,b,c){a>this._last.x?this.attr({path:this.attrs.path+["C",this._last.x+c,this._last.y,a-c,b,a,b]}):a==this._last.x?this.lineTo(a,b):this.attr({path:this.attrs.path+["C",this._last.x-c,this._last.y,a+c,b,a,b]});this._last={x:a,y:b};return this};Raphael.el.andClose=function(){return this.attr({path:this.attrs.path+"z"})};
Grafico.LineGraph=Class.create(Grafico.BaseGraph,{chartDefaults:function(){return{line:!0,start_at_zero:!0,stroke_width:5,curve_amount:10}},setChartSpecificOptions:function(){},calculateStep:function(){return(this.graph_width-this.options.plot_padding*2)/(this.data_size-1)},startPlot:function(a,b,c){a.moveTo(b,c)},drawPlot:function(a,b,c,d,e,f,g,h,i){if(a===0)return this.startPlot(b,c-0.5,d,e);this.options.curve_amount?b.cplineTo(c,d,this.options.curve_amount):b.lineTo(c,d);this.options.markers===
"circle"?this.drawGraphMarkers(a,c,d,e,g,h):this.options.markers==="value"&&this.drawGraphValueMarkers(a,c,d,e,g,h,i)},drawGraphMarkers:function(a,b,c,d){var e=this.paper.circle(b,c,this.options.marker_size),f=this.options.marker_size,g=this.options.hover_color||d,h=parseInt(1.7*f,10);e.attr({"stroke-width":"1px",stroke:this.options.background_color,fill:d});this.globalMarkerSet.push(e);e.hover(function(){e.animate({r:h,fill:g},200)},function(){e.animate({r:f,fill:d},200)})},drawGraphValueMarkers:function(a,
b,c,d,e,f,g){a+=this.options.odd_horizontal_offset>1?this.options.odd_horizontal_offset:0;a-=this.options.stacked_fill||this.options.area?1:0;if(f=(this.options.stacked?this.real_data:this.data_sets).collect(function(b){return b[1][a]})[g])f=""+f.toString().split("."),f[1]&&(f[1]=f[1].truncate(3,""));if(this.options.line||this.options.stacked||(this.options.stacked_fill||this.options.area)&&a!=-1&&typeof f!="undefined"){g=b-this.step/2;var h=c-[this.options.stroke_width/2,this.options.hover_radius].max(),
i=this.step,j=[this.options.stroke_width,this.options.hover_radius*2].max();b=this.paper.circle(b,c,this.options.marker_size==0?[this.options.stroke_width*1.5,this.step].min():this.options.marker_size).attr({"stroke-width":"1px",stroke:this.options.background_color,fill:d,opacity:0});d=this.paper.rect(g,h,i,j).attr({fill:d,"stroke-width":0,stroke:d,opacity:0});e=this.options.datalabels?typeof e=="function"?e.call(this,a,f):e+": "+f:""+f;e+=this.options.vertical_label_unit?" "+this.options.vertical_label_unit:
"";var k=this.paper.set();e=this.paper.text(b.attrs.cx,b.attrs.cy-this.options.font_size*1.5-8,e).attr({"font-size":this.options.font_size,fill:this.options.hover_text_color,opacity:1});f=e.getBBox();c=this.drawRoundRect(e,f,4);f=this.drawNib(e,f,4);k.push(b,c,f,e).attr({opacity:0});this.checkHoverPos({rect:c,set:k,marker:b,nib:f,textpadding:4});this.globalHoverSet.push(k);this.globalBlockSet.push(d);d.hover(function(){k.animate({opacity:1},200)},function(){k.animate({opacity:0},200)})}}});
Grafico.AreaGraph=Class.create(Grafico.LineGraph,{chartDefaults:function(){return{area:!0,area_opacity:!1,stroke_width:0,curve_amount:10}},drawPlot:function(a,b,c,d,e,f,g,h,i,j){var k=this.options.area||this.options.stacked_fill;j||(k===!0?a!==0&&a!==f.length-1&&(this.options.markers==="circle"?this.drawGraphMarkers(a,c,d,e,g,h):this.options.markers==="value"&&this.drawGraphValueMarkers(a,c,d,e,g,h,i)):this.options.markers==="circle"?this.drawGraphMarkers(a,c,d,e,g,h):this.options.markers==="value"&&
this.drawGraphValueMarkers(a,c,d,e,g,h,i));c-=0.5;if(a===0)return this.startPlot(b,c,d,e);this.options.curve_amount&&a>1&&a<f.length-1?b.cplineTo(c,d,this.options.curve_amount):this.options.curve_amount&&!k?b.cplineTo(c,d,this.options.curve_amount):b.lineTo(c,d)}});
Grafico.StackGraph=Class.create(Grafico.AreaGraph,{chartDefaults:function(){return{stacked:!0,stacked_fill:!0,stroke_width:0,curve_amount:10}},setChartSpecificOptions:function(){if(!this.options.stacked_fill)this.options.stroke_width=5},stackData:function(a){for(var b=a.collect(function(a){return a[1]}),c=b.length-2;c>=0;c--)for(var d=0;d<b[0].length;d++)b[c][d]+=b[c+1][d];return a}});
Grafico.StreamGraph=Class.create(Grafico.StackGraph,{chartDefaults:function(){return{stacked:!0,stacked_fill:!0,stroke_width:5,grid:!1,draw_axis:!1,show_horizontal_labels:!1,show_vertical_labels:!1,stream:!0,stream_line_smoothing:!1,stream_smart_insertion:!1,curve_amount:4,stream_label_threshold:0}},hasBaseLine:function(){return!0},calcBaseLine:function(a){var b=a.collect(function(a){return a[1]});a=[];var c,d;for(d=0;d<b[0].length;d++){for(c=sum=0;c<b.length;c++)sum+=this.options.stream_line_smoothing==
!1?b[c][d]:(c+1)*b[c][d];a[d]=this.options.stream_line_smoothing==!1?-sum/2:-sum/(b.length+1)}b=a.min();for(c=0;c<a.length;c++)a[c]-=b;this.base_line=a},stackData:function(a){var b,c;if(this.options.stream_smart_insertion){a=$A(a);a.each(function(a){for(b=0;b<a[1].length&&a[1][b]<=1.0E-7;)b++;a[2]=b});var d=[],e=!1;a.sortBy(function(a){return a[2]}).each(function(a){e?d.push(a):d.unshift(a);e=!e});a=$H();d.each(function(b){a.set(b[0],b[1])})}this.real_data=this.deepCopy(a);this.calcBaseLine(a);var f=
a.collect(function(a){return a[1]});for(c=0;c<f[0].length;c++)f[f.length-1][c]+=this.base_line[c];for(b=f.length-2;b>=0;b--)for(c=0;c<f[0].length;c++)f[b][c]+=f[b+1][c];return a},drawPlot:function(a,b,c,d,e,f,g,h,i,j){if(this.options.datalabels&&!j){j=this.getNormalizedRealData();var k=this.bestMarkerPositions();a<f.length/2&&k[i]>=a&&k[i]<a+1&&this.drawStreamMarker(a+1,c+(k[i]-a)*this.step,d+j[i][a]/2,e,g,h)}c-=0.5;if(a===0)return this.startPlot(b,c,d,e);b.cplineTo(c,d,this.options.curve_amount)},
bestMarkerPositions:function(){if(this.best_marker_positions==void 0)this.best_marker_positions=this.real_data.collect(function(a){for(var b=-1,c=0,d=0,e=0;e<a[1].length;e++){var f=a[1][e];f>c&&f>=this.options.stream_label_threshold?(c=f,b=e,d=0):f==c&&c>0&&d++}return b+d/2}.bind(this));return this.best_marker_positions},drawStreamMarker:function(a,b,c,d,e){this.options.datalabels&&(a=this.paper.set(),b=this.paper.text(b,c-8+this.options.font_size/2,e).attr({"font-size":this.options.font_size,fill:this.options.hover_text_color,
opacity:1}),c=b.getBBox(),c=this.drawRoundRect(b,c,4),a.push(c,b),this.checkHoverPos({rect:c,set:a,textpadding:4}),this.globalHoverSet.push(a))}});
Grafico.BarGraph=Class.create(Grafico.BaseGraph,{chartDefaults:function(){return{bar:!0,plot_padding:0,bargraph_lastcolor:!1,bargraph_negativecolor:!1}},normaliserOptions:function(){return{start_value:0,bar:!0}},setChartSpecificOptions:function(){this.bar_padding=5;this.bar_width=this.calculateBarWidth();this.options.plot_padding=this.bar_width/2;this.step=this.calculateStep();this.grid_start_offset=this.bar_padding-1},calculateBarWidth:function(){return this.graph_width/this.data_size-this.bar_padding},
calculateStep:function(){this.data_size=this.data_size==1?2:this.data_size;return(this.graph_width-this.options.plot_padding*2-this.bar_padding*2)/(this.data_size-1)},longestDataSetLength:function(){var a=0;this.data_sets.each(function(b){a=b[1].length>a?b[1].length:a});return a},drawPlot:function(a,b,c,d,e,f,g){b=this.options.height-this.y_padding_bottom-this.zero_value*(this.graph_height/this.y_label_count);var h=this.options.bargraph_lastcolor,i=this.options.bargraph_negativecolor||e;c+=this.bar_padding;
d=b-d;e=h&&a===f.length-1?h:d<0?i:e;f=this.paper.rect(c-this.bar_width/2,b,this.bar_width,d).attr({fill:e,"stroke-width":this.options.stroke_width,stroke:e,"stroke-opacity":0});d<0?f.attr({height:-f.attrs.height}):f.translate(0,-d);this.options.datalabels&&this.drawGraphValueMarkers(c,a,f,g,e);this.options.count++},drawHorizontalLabels:function(){var a=this.bar_padding+this.options.plot_padding,b=this.options.label_rotation?{rotation:this.options.label_rotation,translation:-this.options.font_size+
" 0"}:{},c=this.options.labels;if(this.options.label_max_size)for(var d=0;d<c.length;d++)c[d]=c[d].truncate(this.options.label_max_size+1,"\u2026");this.drawMarkers(this.options.labels,[1,0],this.step,a,[0,(this.options.font_size+7)*-1],b)},drawGrid:function(){var a=this.paper.path().attr({stroke:this.options.grid_color,"stroke-width":1}),b=this.graph_height+this.y_padding_top,c,d;if(this.options.horizontalbar)a.moveTo(this.x_padding_left-0.5,parseInt(b,10)+0.5),a.lineTo(this.x_padding_left+this.graph_width-
0.5,parseInt(b,10)+0.5),b-=this.graph_height,a.moveTo(this.x_padding_left-0.5,parseInt(b,10)+0.5),a.lineTo(this.x_padding_left+this.graph_width-0.5,parseInt(b,10)+0.5);else if(this.options.show_horizontal_grid)for(var e=0;e<this.y_label_count+1;e++)a.moveTo(this.x_padding_left-0.5,parseInt(b,10)+0.5),a.lineTo(this.x_padding_left+this.graph_width-0.5,parseInt(b,10)+0.5),b-=this.graph_height/this.y_label_count;if(this.options.horizontalbar){b=this.x_padding_left+this.options.plot_padding+this.grid_start_offset;
c=this.y_label_count;d=this.options.horizontalbar?this.graph_width/this.y_label_count:this.step;for(e=0;e<c;e++){if(this.options.hide_empty_label_grid===!0&&this.options.labels[e]!==""||this.options.hide_empty_label_grid===!1)a.moveTo(parseInt(b,10)+0.5,this.y_padding_top),a.lineTo(parseInt(b,10)+0.5,this.y_padding_top+this.graph_height);b+=d}}a.moveTo(parseInt(this.x_padding_left,10)-0.5,this.y_padding_top);a.lineTo(parseInt(this.x_padding_left,10)-0.5,this.y_padding_top+this.graph_height);a.moveTo(parseInt(this.x_padding_left+
this.graph_width,10)-0.5,this.y_padding_top);a.lineTo(parseInt(this.x_padding_left+this.graph_width,10)-0.5,this.y_padding_top+this.graph_height)},drawGraphValueMarkers:function(a,b,c,d,e){var f=this.options.hover_color||e,g=this.paper.set();a=this.paper.rect(a-this.bar_width/2,this.y_padding_top,this.bar_width,this.options.height).attr({fill:e,"stroke-width":0,stroke:e,opacity:0});if(d=d&&d[b]?d[b].toString():""){b=this.paper.text(c.attrs.x+this.bar_width/2,c.attrs.y-this.options.font_size*1.5,d);
b.attr({"font-size":this.options.font_size,fill:this.options.hover_text_color,opacity:1});var h=b.getBBox();d=this.drawRoundRect(b,h,4);h=this.drawNib(b,h,4);g.push(d,h,b).attr({opacity:0});this.checkHoverPos({rect:d,set:g,nib:h});this.globalHoverSet.push(g);this.globalBlockSet.push(a);d.attrs.y<0&&g.translate(0,1+d.attrs.y*-1);a.hover(function(){c.animate({fill:f,stroke:f},200);g.animate({opacity:1},200)},function(){c.animate({fill:e,stroke:e},200);g.animate({opacity:0},200)})}}});
Grafico.StackedBarGraph=Class.create(Grafico.BarGraph,{chartDefaults:function(){return{opacity:100,bar:!0,plot_padding:0,stacked:!0,stacked_fill:!0}},setChartSpecificOptions:function(){this.bar_padding=5;this.bar_width=this.calculateBarWidth();this.options.plot_padding=this.bar_width/2;this.step=this.calculateStep();this.grid_start_offset=this.bar_padding-1;this.options.stroke_width=1},stackData:function(a){for(var b=a.collect(function(a){return a[1]}),c=b.length-2;c>=0;c--)for(var d=0;d<b[0].length;d++)b[c][d]+=
b[c+1][d];return a},calculateCoords:function(a){var b=this.x_padding_left+this.options.plot_padding-this.step,c=this.graph_height+this.y_padding_top+this.normalise(this.start_value);a=$A(a).collect(function(a){b+=this.step;return[b,c-a]}.bind(this));b+=this.step;for(var d=this.getNormalizedBaseLine(),e=d.length-1;e>=0;e--)b-=this.step,a.push([b,c-d[e]]);return a},drawLines:function(a,b,c,d,e,f){var g=this.calculateCoords(c),h;h=this.paper.path().attr({stroke:b,"stroke-width":0});$A(g).each(function(a,
c){this.drawPlot(c,h,a[0],a[1],b,g,d,e,f)}.bind(this));this.options.datalabels&&this.options.draw_hovers&&(this.drawHover(h,d,e,b),this.globalHoverSet.toFront())},drawPlot:function(a,b,c,d,e,f,g){b=this.options.height-this.y_padding_bottom-this.zero_value*(this.graph_height/this.y_label_count);c+=this.bar_padding;d=this.options.height-this.y_padding_bottom-d-this.zero_value*(this.graph_height/this.y_label_count);f={fill:e,"stroke-width":0,stroke:this.options.color2,opacity:this.options.opacity};b=
this.paper.rect(c-this.bar_width/2,b,this.bar_width,d).attr(f);d<0?b.attr({height:-b.attrs.height}):b.translate(0,-d);this.options.datalabels&&this.drawGraphValueMarkers(c,a,b,g,e);this.options.count++},drawGraphValueMarkers:function(a,b,c,d,e){a-=this.bar_width/2;var f=c.attrs.y,g=this.bar_width,h=c.attrs.height,i=this.options.hover_color||e,j=this.paper.set();a=this.paper.rect(a,f,g,h);d=d&&d.length>b?d[b].toString():"";b=this.paper.text(c.attrs.x+this.bar_width/2,c.attrs.y-this.options.font_size*
1.5,d);a.attr({fill:e,"stroke-width":0,stroke:e,opacity:0});b.attr({"font-size":this.options.font_size,fill:this.options.hover_text_color,opacity:1});f=b.getBBox();d=this.drawRoundRect(b,f,4);f=this.drawNib(b,f,4);j.push(d,f,b).attr({opacity:0});this.checkHoverPos({rect:d,set:j,nib:f});this.globalHoverSet.push(j);this.globalBlockSet.push(a);d.attrs.y<0&&j.translate(0,1+d.attrs.y*-1);a.hover(function(){c.animate({fill:i},200);j.animate({opacity:1},200)},function(){c.animate({fill:e},200);j.animate({opacity:0},
200)})}});
Grafico.HorizontalBarGraph=Class.create(Grafico.BarGraph,{chartDefaults:function(){return{bar:!0,horizontalbar:!0,plot_padding:0,horizontal_rounded:!1,bargraph_lastcolor:!1}},setChartSpecificOptions:function(){this.x_padding_left=20+this.longestLabel()*(this.options.font_size/2);this.bar_padding=5;this.bar_width=this.calculateBarHeight();this.step=this.calculateStep();this.graph_width=this.options.width-this.x_padding_right-this.x_padding_left},normalise:function(a){var b=this.makeValueLabels(this.y_label_count);b=
b[b.length-1];return a/b*this.graph_width},longestLabel:function(){return $A(this.options.labels).sort(function(a,b){return a.toString().length<b.toString().length}).first().toString().length},calculateBarHeight:function(){return this.graph_height/this.data_size-this.bar_padding},calculateStep:function(){return(this.graph_height-this.options.plot_padding*2)/this.data_size},drawLines:function(a,b,c,d){var e=this.y_padding_top+this.bar_padding/2-0.5,f=this.zero_value*(this.graph_width/this.y_label_count),
g=this.x_padding_left+f-0.5,h=this.options.bargraph_lastcolor,i=this.options.bargraph_negativecolor||b;this.datalabel=d;$A(c).each(function(a,d){var l,q=this.options.horizontal_rounded?this.bar_width/2:0,n;l=h&&d===c.length-1?h:a<0?i:b;a=a/this.graph_width*(this.graph_width-f);n=this.paper.rect(g,e,a,this.bar_width,q).attr({fill:l,"stroke-width":0,stroke:l,"stroke-opacity":0});a<0&&n.attr({width:-n.attrs.width}).translate(a,0);if(q){var t=this.paper.set(),m=this.paper.rect(g,e,a-this.bar_width/2,
this.bar_width).attr({fill:l,"stroke-width":0,stroke:l,"stroke-opacity":0});t.push(m,n);a<0&&m.attr({width:-m.attrs.width-this.bar_width}).translate(a+this.bar_width/2,0)}if(this.options.datalabels){var r=this.options.hover_color||l,o=this.paper.set();m=this.paper.text(f+a+this.x_padding_left/2,n.attrs.y-this.options.font_size*1.5,this.datalabel[d].toString()).attr({"font-size":this.options.font_size,fill:this.options.hover_text_color,opacity:1});var u=this.paper.rect(this.x_padding_left,e,this.graph_width,
this.bar_width).attr({fill:l,"stroke-width":0,stroke:l,opacity:0}),p=m.getBBox();a<0&&m.translate(p.width,0);var s=this.drawRoundRect(m,p,4);p=this.drawNib(m,p,4);o.push(s,p,m).attr({opacity:0});this.checkHoverPos({rect:s,set:o,nib:p});this.globalHoverSet.push(o);this.globalBlockSet.push(u);s.attrs.y<0&&o.translate(0,1-s.attrs.y);u.hover(function(){q?t.animate({fill:r,stroke:r},200):n.animate({fill:r,stroke:r},200);o.animate({opacity:1},200)},function(){q?t.animate({fill:l,stroke:l},200):n.animate({fill:l,
stroke:l},200);o.animate({opacity:0},200)})}e+=this.step}.bind(this))},drawFocusHint:function(){var a=this.x_padding_left+10,b=this.options.height-this.y_padding_bottom-2.5;this.paper.path().attr({stroke:this.options.label_color,"stroke-width":2}).moveTo(a,b).lineTo(a-5,b+5).moveTo(a-5,b).lineTo(a-10,b+5)},drawVerticalLabels:function(){var a=this.step/2,b=this.options.label_rotation?{"text-anchor":"end",rotation:this.options.label_rotation,translation:"0 "+this.options.font_size/2}:{"text-anchor":"end"},
c=this.options.labels;if(this.options.label_max_size)for(var d=0;d<c.length;d++)c[d]=c[d].truncate(this.options.label_max_size+1,"\u2026");this.drawMarkers(this.options.labels.reverse(),[0,-1],this.step,a,[-8,-(this.options.font_size/5)],b)},drawHorizontalLabels:function(){var a=this.graph_width/this.y_label_count,b=this.makeValueLabels(this.y_label_count);if(this.options.vertical_label_unit)for(var c=0;c<b.length;c++)b[c]+=this.options.vertical_label_unit;this.drawMarkers(b,[1,0],a,a,[0,(this.options.font_size+
7)*-1])},drawMeanLine:function(a){a=$A(a).inject(0,function(a,c){return c+a})/a.length;a=this.options.bar?a+this.zero_value*(this.graph_height/this.y_label_count):a;this.paper.path().attr(this.options.meanline).moveTo(this.x_padding_left-1+a,this.y_padding_top).lineTo(this.x_padding_left-1+a,this.y_padding_top+this.graph_height)}});
Grafico.SparkLine=Class.create(Grafico.Base,{initialize:function(a,b,c){this.element=a;this.data=b;this.options={highlight:!1,stroke_width:1,color:this.makeRandomcolor(),width:parseInt(a.getStyle("width"),10),height:parseInt(a.getStyle("height"),10),acceptable_range:!1,zeroline:!1};Object.extend(this.options,c||{});this.step=this.calculateStep();this.paper=new Raphael(this.element,this.options.width,this.options.height);this.drawBackground();this.draw()},drawBackground:function(){this.background=
this.options.acceptable_range?this.paper.rect(0,this.options.height-this.normalise(this.options.acceptable_range[1]),this.options.width,this.normalise(this.options.acceptable_range[1])-this.normalise(this.options.acceptable_range[0])):this.paper.rect(0,0,this.options.width,this.options.height);this.background.attr({fill:this.options.background_color,stroke:"none"})},calculateStep:function(){return this.options.width/(this.data.length-1)},makeRandomcolor:function(){return Raphael.hsb2rgb(Math.random(),
1,0.75).hex},normalise:function(a){var b=this.data.min()<0?this.data.max()-this.data.min():this.data.max();a-=this.data.min()<0?this.data.min():0;return a/b*this.options.height},draw:function(){var a=this.normaliseData(this.data),b;if(this.options.zeroline&&this.data.min()<0)this.options.zeroline=this.options.zeroline===!0?{"stroke-width":"1px",stroke:"#BBBBBB"}:this.options.zeroline,b=parseInt(this.options.height-this.normalise(0),10),this.paper.path().attr(this.options.zeroline).moveTo(0,b).lineTo(this.options.width,
b);this.drawLines(this.options.color,a);this.options.highlight&&this.showHighlight(a)},drawLines:function(a,b){var c=this.paper.path().attr({stroke:a,"stroke-width":this.options.stroke_width}).moveTo(0,this.options.height-b.first()),d=0,e=this.data.min()<0?this.options.stroke_width:0;b.slice(1).each(function(a){d+=this.step;c.lineTo(d,this.options.height-a-e)}.bind(this))},showHighlight:function(a){var b=1+this.options.stroke_width/2,c=this.options.width-b;a=a[this.options.highlight.index||a.length-
1]+(b/2).round();var d=this.options.highlight.color||"#f00";typeof this.options.highlight.index!=="undefined"&&(c=this.step*this.options.highlight.index);this.paper.circle(c,this.options.height-a+b/2,b).attr({stroke:!1,fill:d})}});
Grafico.SparkBar=Class.create(Grafico.SparkLine,{calculateStep:function(){return this.options.width/this.data.length},drawLines:function(a,b){var c=this.options.bargraph_lastcolor,d=this.step>2?this.step-1:this.step,e=d/2,f=this.normalise(0);b.each(function(g,h){var i,j;i=c&&h===b.length-1?c:a;j=this.paper.path().attr({stroke:i,"stroke-width":d});j.moveTo(e,this.options.height-g);j.lineTo(e,this.options.height-f);g<f&&j.attr({stroke:this.options.bargraph_negativecolor||i});e+=this.step}.bind(this))},
showHighlight:function(){}});
Grafico.SparkArea=Class.create(Grafico.SparkLine,{drawLines:function(a,b){var c=a,d=a,e=0.2,f=this.normalise(0);typeof a=="object"&&(c=a[1],d=a[0],e=1);var g=this.paper.path().attr({fill:c,stroke:c,"stroke-width":0,"stroke-opacity":0,opacity:e}).moveTo(0,this.options.height-f).lineTo(0,this.options.height-b.first()),h=this.paper.path().attr({stroke:d,"stroke-width":this.options.stroke_width}).moveTo(0,this.options.height-b.first()),i=0;b.slice(1).each(function(a){i+=this.step;g.lineTo(i,this.options.height-
a);h.lineTo(i,this.options.height-a)}.bind(this));g.lineTo(i,this.options.height-f)}});

