Bluff={VERSION:"0.3.4",array:function(C){if(C.length===undefined){return[C]}var B=[],A=C.length;while(A--){B[A]=C[A]}return B},each:function(C,D,B){for(var A=0,E=C.length;A<E;A++){D.call(B||null,C[A],A)}},reverse_each:function(C,D,B){var A=C.length;while(A--){D.call(B||null,C[A],A)}},sum:function(C){var B=0,A=C.length;while(A--){B+=C[A]}return B},Mini:{}};Bluff.Base=new JS.Class({extend:{DEBUG:false,DATA_LABEL_INDEX:0,DATA_VALUES_INDEX:1,DATA_COLOR_INDEX:2,LEGEND_MARGIN:10,TITLE_MARGIN:10,LABEL_MARGIN:10,DEFAULT_TARGET_WIDTH:800},top_margin:null,bottom_margin:null,right_margin:null,left_margin:null,labels:null,center_labels_over_point:null,has_left_labels:null,x_axis_label:null,y_axis_label:null,y_axis_increment:null,colors:null,title:null,font:null,font_color:null,hide_line_markers:null,hide_legend:null,hide_title:null,hide_line_numbers:null,no_data_message:null,title_font_size:null,legend_font_size:null,marker_font_size:null,marker_color:null,marker_count:null,minimum_value:null,maximum_value:null,sort:null,additional_line_values:null,stacked:null,legend_box_size:null,initialize:function(B,A){this._d=new Bluff.Renderer(B);A=A||this.klass.DEFAULT_TARGET_WIDTH;this.top_margin=this.bottom_margin=this.left_margin=this.right_margin=20;var C;if(typeof A!="number"){C=A.split("x");this._columns=parseFloat(C[0]);this._rows=parseFloat(C[1])}else{this._columns=parseFloat(A);this._rows=this._columns*0.75}this.initialize_ivars();this._reset_themes();this.theme_keynote()},initialize_ivars:function(){this._raw_columns=800;this._raw_rows=800*(this._rows/this._columns);this._column_count=0;this.marker_count=null;this.maximum_value=this.minimum_value=null;this._has_data=false;this._data=[];this.labels={};this._labels_seen={};this.sort=true;this.title=null;this._scale=this._columns/this._raw_columns;this.marker_font_size=21;this.legend_font_size=20;this.title_font_size=36;this.legend_box_size=20;this.no_data_message="No Data";this.hide_line_markers=this.hide_legend=this.hide_title=this.hide_line_numbers=false;this.center_labels_over_point=true;this.has_left_labels=false;this.additional_line_values=[];this._additional_line_colors=[];this._theme_options={};this.x_axis_label=this.y_axis_label=null;this.y_axis_increment=null;this.stacked=null;this._norm_data=null},set_margins:function(A){this.top_margin=this.left_margin=this.right_margin=this.bottom_margin=A},set_font:function(A){this.font=A;this._d.font=this.font},add_color:function(A){this.colors.push(A)},replace_colors:function(A){this.colors=A||[]},set_theme:function(A){this._reset_themes();this._theme_options={colors:["black","white"],additional_line_colors:[],marker_color:"white",font_color:"black",background_colors:null,background_image:null};for(var B in A){this._theme_options[B]=A[B]}this.colors=this._theme_options.colors;this.marker_color=this._theme_options.marker_color;this.font_color=this._theme_options.font_color||this.marker_color;this._additional_line_colors=this._theme_options.additional_line_colors;this._render_background()},theme_keynote:function(){this._blue="#6886B4";this._yellow="#FDD84E";this._green="#72AE6E";this._red="#D1695E";this._purple="#8A6EAF";this._orange="#EFAA43";this._white="white";this.colors=[this._yellow,this._blue,this._green,this._red,this._purple,this._orange,this._white];this.set_theme({colors:this.colors,marker_color:"white",font_color:"white",background_colors:["black","#4a465a"]})},theme_37signals:function(){this._green="#339933";this._purple="#cc99cc";this._blue="#336699";this._yellow="#FFF804";this._red="#ff0000";this._orange="#cf5910";this._black="black";this.colors=[this._yellow,this._blue,this._green,this._red,this._purple,this._orange,this._black];this.set_theme({colors:this.colors,marker_color:"black",font_color:"black",background_colors:["#d1edf5","white"]})},theme_rails_keynote:function(){this._green="#00ff00";this._grey="#333333";this._orange="#ff5d00";this._red="#f61100";this._white="white";this._light_grey="#999999";this._black="black";this.colors=[this._green,this._grey,this._orange,this._red,this._white,this._light_grey,this._black];this.set_theme({colors:this.colors,marker_color:"white",font_color:"white",background_colors:["#0083a3","#0083a3"]})},theme_odeo:function(){this._grey="#202020";this._white="white";this._dark_pink="#a21764";this._green="#8ab438";this._light_grey="#999999";this._dark_blue="#3a5b87";this._black="black";this.colors=[this._grey,this._white,this._dark_blue,this._dark_pink,this._green,this._light_grey,this._black];this.set_theme({colors:this.colors,marker_color:"white",font_color:"white",background_colors:["#ff47a4","#ff1f81"]})},theme_pastel:function(){this.colors=["#a9dada","#aedaa9","#daaea9","#dadaa9","#a9a9da","#daaeda","#dadada"];this.set_theme({colors:this.colors,marker_color:"#aea9a9",font_color:"black",background_colors:"white"})},theme_greyscale:function(){this.colors=["#282828","#383838","#686868","#989898","#c8c8c8","#e8e8e8"];this.set_theme({colors:this.colors,marker_color:"#aea9a9",font_color:"black",background_colors:"white"})},data:function(B,C,A){C=C||[];A=A||null;C=Bluff.array(C);this._data.push([B,C,(A||this._increment_color())]);this._column_count=(C.length>this._column_count)?C.length:this._column_count;Bluff.each(C,function(E,D){if(!E){return }if(this.maximum_value===null&&this.minimum_value===null){this.maximum_value=this.minimum_value=E}this.maximum_value=this._larger_than_max(E)?E:this.maximum_value;if(this.maximum_value>0){this._has_data=true}this.minimum_value=this._less_than_min(E)?E:this.minimum_value;if(this.minimum_value<0){this._has_data=true}},this)},draw:function(){if(this.stacked){this._make_stacked()}this._setup_drawing();this._debug(function(){this._d.rectangle(this.left_margin,this.top_margin,this._raw_columns-this.right_margin,this._raw_rows-this.bottom_margin);this._d.rectangle(this._graph_left,this._graph_top,this._graph_right,this._graph_bottom)})},clear:function(){this._render_background()},_setup_drawing:function(){if(!this._has_data){return this._draw_no_data()}this._normalize();this._setup_graph_measurements();if(this.sort){this._sort_norm_data()}this._draw_legend();this._draw_line_markers();this._draw_axis_labels();this._draw_title()},_normalize:function(A){if(this._norm_data===null||A===true){this._norm_data=[];if(!this._has_data){return }this._calculate_spread();Bluff.each(this._data,function(C){var B=[];Bluff.each(C[this.klass.DATA_VALUES_INDEX],function(D){if(D===null||D===undefined){B.push(null)}else{B.push((D-this.minimum_value)/this._spread)}},this);this._norm_data.push([C[this.klass.DATA_LABEL_INDEX],B,C[this.klass.DATA_COLOR_INDEX]])},this)}},_calculate_spread:function(){this._spread=this.maximum_value-this.minimum_value;this._spread=this._spread>0?this._spread:1},_setup_graph_measurements:function(){this._marker_caps_height=this.hide_line_markers?0:this._calculate_caps_height(this.marker_font_size);this._title_caps_height=this.hide_title?0:this._calculate_caps_height(this.title_font_size);this._legend_caps_height=this.hide_legend?0:this._calculate_caps_height(this.legend_font_size);var A,C,B,G,F,E,D;if(this.hide_line_markers){this._graph_left=this.left_margin;this._graph_right_margin=this.right_margin;this._graph_bottom_margin=this.bottom_margin}else{C=0;if(this.has_left_labels){A="";for(D in this.labels){A=A.length>this.labels[D].length?A:this.labels[D]}C=this._calculate_width(this.marker_font_size,A)*1.25}else{C=this._calculate_width(this.marker_font_size,this._label(this.maximum_value))}B=this.hide_line_numbers&&!this.has_left_labels?0:C+this.klass.LABEL_MARGIN*2;this._graph_left=this.left_margin+B+(this.y_axis_label===null?0:this._marker_caps_height+this.klass.LABEL_MARGIN*2);G=-Infinity;for(D in this.labels){G=G>Number(D)?G:Number(D)}G=Math.round(G);F=(G>=(this._column_count-1)&&this.center_labels_over_point)?this._calculate_width(this.marker_font_size,this.labels[G])/2:0;this._graph_right_margin=this.right_margin+F;this._graph_bottom_margin=this.bottom_margin+this._marker_caps_height+this.klass.LABEL_MARGIN}this._graph_right=this._raw_columns-this._graph_right_margin;this._graph_width=this._raw_columns-this._graph_left-this._graph_right_margin;this._graph_top=this.top_margin+(this.hide_title?this.klass.TITLE_MARGIN:this._title_caps_height+this.klass.TITLE_MARGIN*2)+(this.hide_legend?this.klass.LEGEND_MARGIN:this._legend_caps_height+this.klass.LEGEND_MARGIN*2);E=(this.x_axis_label===null)?0:this._marker_caps_height+this.klass.LABEL_MARGIN;this._graph_bottom=this._raw_rows-this._graph_bottom_margin-E;this._graph_height=this._graph_bottom-this._graph_top},_draw_axis_labels:function(){if(this.x_axis_label){var A=this._graph_bottom+this.klass.LABEL_MARGIN*2+this._marker_caps_height;this._d.fill=this.font_color;if(this.font){this._d.font=this.font}this._d.stroke="transparent";this._d.pointsize=this._scale_fontsize(this.marker_font_size);this._d.gravity="north";this._d.annotate_scaled(this._raw_columns,1,0,A,this.x_axis_label,this._scale);this._debug(function(){this._d.line(0,A,this._raw_columns,A)})}},_draw_line_markers:function(){if(this.hide_line_markers){return }if(this.y_axis_increment===null){if(this.marker_count===null){Bluff.each([3,4,5,6,7],function(E){if(!this.marker_count&&this._spread%E==0){this.marker_count=E}},this);this.marker_count=this.marker_count||4}this._increment=(this._spread>0)?this._significant(this._spread/this.marker_count):1}else{this.maximum_value=Math.max(Math.ceil(this.maximum_value),this.y_axis_increment);this.minimum_value=Math.floor(this.minimum_value);this._calculate_spread();this._normalize(true);this.marker_count=Math.round(this._spread/this.y_axis_increment);this._increment=this.y_axis_increment}this._increment_scaled=this._graph_height/(this._spread/this._increment);var A,D,C,B;for(A=0,D=this.marker_count;A<=D;A++){C=this._graph_top+this._graph_height-A*this._increment_scaled;this._d.stroke=this.marker_color;this._d.stroke_width=1;this._d.line(this._graph_left,C,this._graph_right,C);B=A*this._increment+this.minimum_value;if(!this.hide_line_numbers){this._d.fill=this.font_color;if(this.font){this._d.font=this.font}this._d.stroke="transparent";this._d.pointsize=this._scale_fontsize(this.marker_font_size);this._d.gravity="east";this._d.annotate_scaled(this._graph_left-this.klass.LABEL_MARGIN,1,0,C,this._label(B),this._scale)}}},_center:function(A){return(this._raw_columns-A)/2},_draw_legend:function(){if(this.hide_legend){return }this._legend_labels=[];for(var D=0,F=this._data.length;D<F;D++){this._legend_labels.push(this._data[D][this.klass.DATA_LABEL_INDEX])}var E=this.legend_box_size;if(this.font){this._d.font=this.font}this._d.pointsize=this.legend_font_size;var A=[[]];Bluff.each(this._legend_labels,function(H){var J=A.length-1;var I=this._d.get_type_metrics(H);var G=I.width+E*2.7;A[J].push(G);if(Bluff.sum(A[J])>(this._raw_columns*0.9)){A.push([A[J].pop()])}},this);var C=this._center(Bluff.sum(A[0]));var B=this.hide_title?this.top_margin+this.klass.LEGEND_MARGIN:this.top_margin+this.klass.TITLE_MARGIN+this._title_caps_height+this.klass.LEGEND_MARGIN;this._debug(function(){this._d.stroke_width=1;this._d.line(0,B,this._raw_columns,B)});Bluff.each(this._legend_labels,function(G,H){this._d.fill=this.font_color;if(this.font){this._d.font=this.font}this._d.pointsize=this._scale_fontsize(this.legend_font_size);this._d.stroke="transparent";this._d.font_weight="normal";this._d.gravity="west";this._d.annotate_scaled(this._raw_columns,1,C+(E*1.7),B,G,this._scale);this._d.stroke="transparent";this._d.fill=this._data[H][this.klass.DATA_COLOR_INDEX];this._d.rectangle(C,B-E/2,C+E,B+E/2);this._d.pointsize=this.legend_font_size;var I=this._d.get_type_metrics(G);var K=I.width+(E*2.7),J;A[0].shift();if(A[0].length==0){this._debug(function(){this._d.line(0,B,this._raw_columns,B)});A.shift();if(A.length>0){C=this._center(Bluff.sum(A[0]))}J=Math.max(this._legend_caps_height,E)+this.klass.LEGEND_MARGIN;if(A.length>0){B+=J;this._graph_top+=J;this._graph_height=this._graph_bottom-this._graph_top}}else{C+=K}},this);this._color_index=0},_draw_title:function(){if(this.hide_title||!this.title){return }this._d.fill=this.font_color;if(this.font){this._d.font=this.font}this._d.pointsize=this._scale_fontsize(this.title_font_size);this._d.font_weight="bold";this._d.gravity="north";this._d.annotate_scaled(this._raw_columns,1,0,this.top_margin,this.title,this._scale)},_draw_label:function(B,C){if(this.hide_line_markers){return }var A;if(this.labels[C]&&!this._labels_seen[C]){A=this._graph_bottom+this.klass.LABEL_MARGIN;this._d.fill=this.font_color;if(this.font){this._d.font=this.font}this._d.stroke="transparent";this._d.font_weight="normal";this._d.pointsize=this._scale_fontsize(this.marker_font_size);this._d.gravity="north";this._d.rotation=Math.PI/4;this._d.annotate_scaled(1,1,B,A,this.labels[C],this._scale);this._labels_seen[C]=true;this._debug(function(){this._d.stroke_width=1;this._d.line(0,A,this._raw_columns,A)})}},_draw_no_data:function(){this._d.fill=this.font_color;if(this.font){this._d.font=this.font}this._d.stroke="transparent";this._d.font_weight="normal";this._d.pointsize=this._scale_fontsize(80);this._d.gravity="center";this._d.annotate_scaled(this._raw_columns,this._raw_rows/2,0,10,this.no_data_message,this._scale)},_render_background:function(){var A=this._theme_options.background_colors;switch(true){case A instanceof Array:this._render_gradiated_background.apply(this,A);break;case typeof A=="string":this._render_solid_background(A);break;default:this._render_image_background(this._theme_options.background_image);break}},_render_solid_background:function(A){this._d.render_solid_background(this._columns,this._rows,A)},_render_gradiated_background:function(A,B){this._d.render_gradiated_background(this._columns,this._rows,A,B)},_render_image_background:function(A){},_reset_themes:function(){this._color_index=0;this._labels_seen={};this._theme_options={};this._d.scale(this._scale,this._scale)},_scale_value:function(A){return this._scale*A},_scale_fontsize:function(B){var A=B*this._scale;return A},_clip_value_if_greater_than:function(A,B){return(A>B)?B:A},_larger_than_max:function(B,A){return B>this.maximum_value},_less_than_min:function(B,A){return B<this.minimum_value},_max:function(B,A){return B},_min:function(B,A){return B},_significant:function(B){if(B==0){return 1}var A=1;while(B<10){B*=10;A/=10}while(B>100){B/=10;A*=10}return Math.floor(B)*A},_sort_norm_data:function(){var B=this._sums,A=this.klass.DATA_VALUES_INDEX;this._norm_data.sort(function(D,C){return B(C[A])-B(D[A])})},_sums:function(A){var B=0;Bluff.each(A,function(C){B+=C});return B},_make_stacked:function(){var A=[],B=this._column_count;while(B--){A[B]=0}Bluff.each(this._data,function(C){Bluff.each(C[this.klass.DATA_VALUES_INDEX],function(E,D){A[D]+=E},this);C[this.klass.DATA_VALUES_INDEX]=Bluff.array(A)},this)},_debug:function(A){if(this.klass.DEBUG){this._d.fill="transparent";this._d.stroke="turquoise";A.call(this)}},_increment_color:function(){if(this._color_index==0){this._color_index+=1;return this.colors[0]}else{if(this._color_index<this.colors.length){this._color_index+=1;return this.colors[this._color_index-1]}else{this._color_index=0;return this.colors[this.colors.length-1]}}},_label:function(A){if(this._spread%this.marker_count==0||this.y_axis_increment!==null){return this._format(String(Math.round(A)))}if(this._spread>10){return this._format(String(Math.floor(A)))}else{if(this._spread>=3){return String(Math.floor(A*100)/100)+"f"}else{return String(A)+"g"}}},_format:function(C){var D=C.split("").reverse();var A=[];for(var B=0;B<D.length;B++){A.push(D[B]);if((B+1)%3==0&&B+1<D.length){A.push(".")}}return A.reverse().join("")},_calculate_caps_height:function(A){return this._d.caps_height(A)},_calculate_width:function(A,B){return this._d.text_width(A,B)}});Bluff.Area=new JS.Class(Bluff.Base,{draw:function(){this.callSuper();if(!this._has_data){return }this._x_increment=this._graph_width/(this._column_count-1);this._d.stroke="transparent";Bluff.each(this._norm_data,function(D){var B=[];var A=0,C=0;Bluff.each(D[this.klass.DATA_VALUES_INDEX],function(H,E){var G=this._graph_left+(this._x_increment*E);var F=this._graph_top+(this._graph_height-H*this._graph_height);if(A>0&&C>0){B.push(G);B.push(F)}else{B.push(this._graph_left);B.push(this._graph_bottom-1);B.push(G);B.push(F)}this._draw_label(G,E);A=G;C=F},this);B.push(this._graph_right);B.push(this._graph_bottom-1);B.push(this._graph_left);B.push(this._graph_bottom-1);this._d.fill=D[this.klass.DATA_COLOR_INDEX];this._d.polyline(B)},this)}});Bluff.BarConversion=new JS.Class({mode:null,zero:null,graph_top:null,graph_height:null,minimum_value:null,spread:null,getLeftYRightYscaled:function(C,A){var B;switch(this.mode){case 1:A[0]=this.graph_top+this.graph_height*(1-C)+1;A[1]=this.graph_top+this.graph_height-1;break;case 2:A[0]=this.graph_top+1;A[1]=this.graph_top+this.graph_height*(1-C)-1;break;case 3:B=C-this.minimum_value/this.spread;if(C>=this.zero){A[0]=this.graph_top+this.graph_height*(1-(B-this.zero))+1;A[1]=this.graph_top+this.graph_height*(1-this.zero)-1}else{A[0]=this.graph_top+this.graph_height*(1-(B-this.zero))+1;A[1]=this.graph_top+this.graph_height*(1-this.zero)-1}break;default:A[0]=0;A[1]=0}}});Bluff.Bar=new JS.Class(Bluff.Base,{draw:function(){var B=0,A;for(A in this.labels){B+=1}this.center_labels_over_point=(B>this._column_count);this.callSuper();if(!this._has_data){return }this._draw_bars()},_draw_bars:function(){var A=0.9;this._bar_width=this._graph_width/(this._column_count*this._data.length);var C=(this._bar_width*(1-A))/2;this._d.stroke_opacity=0;var B=new Bluff.BarConversion();B.graph_height=this._graph_height;B.graph_top=this._graph_top;if(this.minimum_value>=0){B.mode=1}else{if(this.maximum_value<=0){B.mode=2}else{B.mode=3;B.spread=this._spread;B.minimum_value=this.minimum_value;B.zero=-this.minimum_value/this._spread}}Bluff.each(this._norm_data,function(E,D){Bluff.each(E[this.klass.DATA_VALUES_INDEX],function(K,G){var H=this._graph_left+(this._bar_width*(D+G+((this._data.length-1)*G)))+C;var J=H+this._bar_width*A;var I=[];B.getLeftYRightYscaled(K,I);this._d.fill=E[this.klass.DATA_COLOR_INDEX];this._d.stroke="transparent";this._d.rectangle(H,I[0],J,I[1]);var F=this._graph_left+(this._data.length*this._bar_width*G)+(this._data.length*this._bar_width/2)+C;this._draw_label(F-(this.center_labels_over_point?this._bar_width/2:0),G)},this)},this);if(this.center_labels_over_point){this._draw_label(this._graph_right,this._column_count)}}});Bluff.Line=new JS.Class(Bluff.Base,{baseline_value:null,baseline_color:null,hide_dots:null,hide_lines:null,initialize:function(A){if(arguments.length>3){throw"Wrong number of arguments"}if(arguments.length==1||(typeof arguments[1]!="number"&&typeof arguments[1]!="string")){this.callSuper(A,null)}else{this.callSuper()}this.hide_dots=this.hide_lines=false;this.baseline_color="red";this.baseline_value=null},draw:function(){this.callSuper();if(!this._has_data){return }this.x_increment=(this._column_count>1)?(this._graph_width/(this._column_count-1)):this._graph_width;var A;if(this._norm_baseline!==undefined){A=this._graph_top+(this._graph_height-this._norm_baseline*this._graph_height);this._d.push();this._d.stroke=this.baseline_color;this._d.stroke_width=3;this._d.line(this._graph_left,A,this._graph_left+this._graph_width,A);this._d.pop()}Bluff.each(this._norm_data,function(D){var B=null,C=null;Bluff.each(D[this.klass.DATA_VALUES_INDEX],function(I,F){var H=this._graph_left+(this.x_increment*F);if(I===undefined){return }this._draw_label(H,F);var G=this._graph_top+(this._graph_height-I*this._graph_height);this._d.stroke=D[this.klass.DATA_COLOR_INDEX];this._d.fill=D[this.klass.DATA_COLOR_INDEX];this._d.stroke_opacity=1;this._d.stroke_width=this._clip_value_if_greater_than(this._columns/(this._norm_data[0][1].length*6),3);if(!this.hide_lines&&B!==null&&C!==null){this._d.line(B,C,H,G)}var E=this._clip_value_if_greater_than(this._columns/(this._norm_data[0][1].length*2),7);if(!this.hide_dots){this._d.circle(H,G,H-E,G)}B=H;C=G},this)},this)},_normalize:function(){this.maximum_value=Math.max(this.maximum_value,this.baseline_value);this.callSuper();if(this.baseline_value!==null){this._norm_baseline=this.baseline_value/this.maximum_value}}});Bluff.Net=new JS.Class(Bluff.Base,{hide_dots:null,initialize:function(){this.callSuper();this.hide_dots=false},draw:function(){this.callSuper();if(!this._has_data){return }this._radius=this._graph_height/2;this._center_x=this._graph_left+(this._graph_width/2);this._center_y=this._graph_top+(this._graph_height/2)-10;this._x_increment=this._graph_width/(this._column_count-1);var A=this._clip_value_if_greater_than(this._columns/(this._norm_data[0][this.klass.DATA_VALUES_INDEX].length*2.5),7);this._d.stroke_opacity=1;this._d.stroke_width=this._clip_value_if_greater_than(this._columns/(this._norm_data[0][this.klass.DATA_VALUES_INDEX].length*4),3);var B;if(this._norm_baseline!==undefined){B=this._graph_top+(this._graph_height-this._norm_baseline*this._graph_height);this._d.push();this._d.stroke_color=this.baseline_color;this._d.fill_opacity=0;this._d.stroke_width=5;this._d.line(this._graph_left,B,this._graph_left+this._graph_width,B);this._d.pop()}Bluff.each(this._norm_data,function(E){var C=null,D=null;Bluff.each(E[this.klass.DATA_VALUES_INDEX],function(H,G){if(H===undefined){return }var L=G*Math.PI*2/this._column_count,K=H*this._radius,M=this._center_x+Math.sin(L)*K,I=this._center_y-Math.cos(L)*K,O=(G+1<E[this.klass.DATA_VALUES_INDEX].length)?G+1:0,F=O*Math.PI*2/this._column_count,J=E[this.klass.DATA_VALUES_INDEX][O]*this._radius,P=this._center_x+Math.sin(F)*J,N=this._center_y-Math.cos(F)*J;this._d.stroke=E[this.klass.DATA_COLOR_INDEX];this._d.fill=E[this.klass.DATA_COLOR_INDEX];this._d.line(M,I,P,N);if(!this.hide_dots){this._d.circle(M,I,M-A,I)}},this)},this)},_draw_line_markers:function(){if(this.hide_line_markers){return }this._radius=this._graph_height/2;this._center_x=this._graph_left+(this._graph_width/2);this._center_y=this._graph_top+(this._graph_height/2)-10;var A,C;for(var B=0,D=this._column_count;B<D;B++){A=B*Math.PI*2/this._column_count;this._d.stroke=this.marker_color;this._d.stroke_width=1;this._d.line(this._center_x,this._center_y,this._center_x+Math.sin(A)*this._radius,this._center_y-Math.cos(A)*this._radius);C=labels[B]?labels[B]:"000";this._draw_label(this._center_x,this._center_y,A*360/(2*Math.PI),this._radius,C)}},_draw_label:function(J,I,B,F,C){var E=1.1,D=J,A=I,K=B*Math.PI/180,H=D+(F*E*Math.sin(K)),G=A-(F*E*Math.cos(K));this._d.fill=this.marker_color;if(this.font){this._d.font=this.font}this._d.pointsize=this._scale_fontsize(20);this._d.stroke="transparent";this._d.font_weight="bold";var L=K/(2*Math.PI);switch(true){case L>=0.96||L<0.04:this._d.gravity="south";break;case L>=0.04&&L<0.21:this._d.gravity="west";break;case L>=0.21&&L<0.29:this._d.gravity="west";break;case L>=0.29&&L<0.46:this._d.gravity="west";break;case L>=0.46&&L<0.54:this._d.gravity="north";break;case L>=0.54&&L<0.71:this._d.gravity="east";break;case L>=0.71&&L<0.79:this._d.gravity="east";break;case L>=0.79&&L<0.96:this._d.gravity="east";break}this._d.annotate_scaled(0,0,H,G,C,this._scale)}});Bluff.Pie=new JS.Class(Bluff.Base,{extend:{TEXT_OFFSET_PERCENTAGE:0.15},zero_degreee:null,initialize_ivars:function(){this.callSuper();this.zero_degree=0},draw:function(){this.hide_line_markers=true;this.callSuper();if(!this._has_data){return }var F=this._graph_height,A=(Math.min(this._graph_width,this._graph_height)/2)*0.8,H=this._graph_left+(this._graph_width-F)/2,E=this._graph_left+(this._graph_width/2),C=this._graph_top+(this._graph_height/2)-10,G=this._sums_for_pie(),B=this.zero_degree,D=this.klass.DATA_VALUES_INDEX;if(this.sort){this._data.sort(function(J,I){return J[D][0]-I[D][0]})}Bluff.each(this._data,function(M,J){if(M[this.klass.DATA_VALUES_INDEX][0]>0){this._d.fill=M[this.klass.DATA_COLOR_INDEX];var I=(M[this.klass.DATA_VALUES_INDEX][0]/G)*360;this._d.circle(E,C,E+A,C,B,B+I+0.5);var K=B+((B+I)-B)/2;var L=Math.round((M[this.klass.DATA_VALUES_INDEX][0]/G)*100)+"%";this._draw_label(E,C,K,A+(A*this.klass.TEXT_OFFSET_PERCENTAGE),L);B+=I}},this)},_draw_label:function(L,K,C,H,D){var F=20,E=L,A=K,B=H+F,G=B*0.15,J=E+((B+G)*Math.cos(C*Math.PI/180)),I=A+(B*Math.sin(C*Math.PI/180));this._d.fill=this.font_color;if(this.font){this._d.font=this.font}this._d.pointsize=this._scale_fontsize(this.marker_font_size);this._d.font_weight="bold";this._d.gravity="center";this._d.annotate_scaled(0,0,J,I,D,this._scale)},_sums_for_pie:function(){var A=0;Bluff.each(this._data,function(B){A+=B[this.klass.DATA_VALUES_INDEX][0]},this);return A}});Bluff.SideBar=new JS.Class(Bluff.Base,{draw:function(){this.has_left_labels=true;this.callSuper();if(!this._has_data){return }var B=0.9;this._bars_width=this._graph_height/this._column_count;this._bar_width=this._bars_width*B/this._norm_data.length;this._d.stroke_opacity=0;var A=[],D=this._column_count;while(D--){A[D]=0}var E=[],C=this._column_count;while(C--){E[C]=this._graph_left}var F=(this._bars_width*(1-B))/2;Bluff.each(this._norm_data,function(H,G){Bluff.each(H[this.klass.DATA_VALUES_INDEX],function(P,N){var J=this._graph_left+(this._graph_width-P*this._graph_width-A[N]),I=this._graph_left+this._graph_width-A[N],K=I-J,O=E[N]-1,M=this._graph_top+(this._bars_width*N)+(this._bar_width*G)+F,R=O+K,Q=M+this._bar_width;A[N]+=(P*this._graph_width);this._d.stroke="transparent";this._d.fill=H[this.klass.DATA_COLOR_INDEX];this._d.rectangle(O,M,R,Q);var L=this._graph_top+(this._bars_width*N+this._bars_width/2)+F;this._draw_label(L,N)},this)},this)},_draw_line_markers:function(){if(this.hide_line_markers){return }this._d.stroke_width=1;var E=5;var B=this._significant(this.maximum_value/E),D,A,G,F;for(var C=0;C<=E;C++){D=(this._graph_right-this._graph_left)/E;A=this._graph_right-(D*C)-1;G=C-E;F=Math.abs(G)*B;this._d.stroke=this.marker_color;this._d.line(A,this._graph_bottom,A,this._graph_top);if(!this.hide_line_numbers){this._d.fill=this.font_color;if(this.font){this._d.font=this.font}this._d.stroke="transparent";this._d.pointsize=this._scale_fontsize(this.marker_font_size);this._d.gravity="center";this._d.annotate_scaled(0,0,A,this._graph_bottom+(this.klass.LABEL_MARGIN*2),F,this._scale)}}},_draw_label:function(A,B){if(this.labels[B]&&!this._labels_seen[B]){this._d.fill=this.font_color;if(this.font){this._d.font=this.font}this._d.stroke="transparent";this._d.font_weight="normal";this._d.pointsize=this._scale_fontsize(this.marker_font_size);this._d.gravity="east";this._d.annotate_scaled(1,1,this._graph_left-this.klass.LABEL_MARGIN*2,A,this.labels[B],this._scale);this._labels_seen[B]=true}}});Bluff.Spider=new JS.Class(Bluff.Base,{hide_text:null,hide_axes:null,transparent_background:null,initialize:function(B,C,A){this.callSuper(B,A);this._max_value=C;this.hide_legend=true},draw:function(){this.hide_line_markers=true;this.callSuper();if(!this._has_data){return }var I=this._graph_height,E=this._graph_height/2,A=this._graph_left+(this._graph_width-I)/2,H=this._graph_left+(this._graph_width/2),G=this._graph_top+(this._graph_height/2)-25;this._unit_length=E/this._max_value;var C=this._sums_for_spider(),B=0,D=(2*Math.PI)/this._data.length,F=0;if(!this.hide_axes){this._draw_axes(H,G,E,D)}this._draw_polygon(H,G,D)},_normalize_points:function(A){return A*this._unit_length},_draw_label:function(J,I,B,F,C){var E=50,D=J,A=I+0,H=D+((F+E)*Math.cos(B)),G=A+((F+E)*Math.sin(B));this._d.fill=this.marker_color;if(this.font){this._d.font=this.font}this._d.pointsize=this._scale_fontsize(this.legend_font_size);this._d.stroke="transparent";this._d.font_weight="bold";this._d.gravity="center";this._d.annotate_scaled(0,0,H,G,C,this._scale)},_draw_axes:function(C,B,A,F,E){if(this.hide_axes){return }var D=0;Bluff.each(this._data,function(I){this._d.stroke=E||I[this.klass.DATA_COLOR_INDEX];this._d.stroke_width=5;var H=A*Math.cos(D);var G=A*Math.sin(D);this._d.line(C,B,C+H,B+G);if(!this.hide_text){this._draw_label(C,B,D,A,I[this.klass.DATA_LABEL_INDEX])}D+=F},this)},_draw_polygon:function(C,B,F,A){var E=[],D=0;Bluff.each(this._data,function(G){E.push(C+this._normalize_points(G[this.klass.DATA_VALUES_INDEX][0])*Math.cos(D));E.push(B+this._normalize_points(G[this.klass.DATA_VALUES_INDEX][0])*Math.sin(D));D+=F},this);this._d.stroke_width=1;this._d.stroke=A||this.marker_color;this._d.fill=A||this.marker_color;this._d.fill_opacity=0.4;this._d.polyline(E)},_sums_for_spider:function(){var A=0;Bluff.each(this._data,function(B){A+=B[this.klass.DATA_VALUES_INDEX][0]},this);return A}});Bluff.Base.StackedMixin=new JS.Module({_get_maximum_by_stack:function(){var A={};Bluff.each(this._data,function(C){Bluff.each(C[this.klass.DATA_VALUES_INDEX],function(E,D){if(!A[D]){A[D]=0}A[D]+=E},this)},this);for(var B in A){if(A[B]>this.maximum_value){this.maximum_value=A[B]}}this.minimum_value=0}});Bluff.StackedArea=new JS.Class(Bluff.Base,{include:Bluff.Base.StackedMixin,last_series_goes_on_bottom:null,draw:function(){this._get_maximum_by_stack();this.callSuper();if(!this._has_data){return }this._x_increment=this._graph_width/(this._column_count-1);this._d.stroke="transparent";var A=[],B=this._column_count;while(B--){A.push(0)}var D=null;var C=this.last_series_goes_on_bottom?"reverse_each":"each";Bluff[C](this._norm_data,function(I){var H=D;D=[];Bluff.each(I[this.klass.DATA_VALUES_INDEX],function(M,J){var L=this._graph_left+(this._x_increment*J);var K=this._graph_top+(this._graph_height-M*this._graph_height-A[J]);A[J]+=(M*this._graph_height);D.push(L);D.push(K);this._draw_label(L,J)},this);var E,F,G;if(H){E=Bluff.array(D);for(F=H.length/2-1;F>=0;F--){E.push(H[2*F]);E.push(H[2*F+1])}E.push(D[0]);E.push(D[1])}else{E=Bluff.array(D);E.push(this._graph_right);E.push(this._graph_bottom-1);E.push(this._graph_left);E.push(this._graph_bottom-1);E.push(D[0]);E.push(D[1])}this._d.fill=I[this.klass.DATA_COLOR_INDEX];this._d.polyline(E)},this)}});Bluff.StackedBar=new JS.Class(Bluff.Base,{include:Bluff.Base.StackedMixin,draw:function(){this._get_maximum_by_stack();this.callSuper();if(!this._has_data){return }var B=0.9;this._bar_width=this._graph_width/this._column_count;var D=(this._bar_width*(1-B))/2;var A=[],C=this._column_count;while(C--){A.push(0)}Bluff.each(this._norm_data,function(F,E){Bluff.each(F[this.klass.DATA_VALUES_INDEX],function(M,H){var G=this._graph_left+(this._bar_width*H)+(this._bar_width*B/2)+D;this._draw_label(G,H);if(M==0){return }var K=this._graph_left+(this._bar_width*H)+D;var I=this._graph_top+(this._graph_height-M*this._graph_height-A[H])+1;var L=K+this._bar_width*B;var J=this._graph_top+this._graph_height-A[H]-1;A[H]+=(M*this._graph_height);this._d.fill=F[this.klass.DATA_COLOR_INDEX];this._d.rectangle(K,I,L,J)},this)},this)}});Bluff.AccumulatorBar=new JS.Class(Bluff.StackedBar,{draw:function(){if(this._data.length!=1){throw"Incorrect number of datasets exception"}var B=[];var C=0;var A=[];Bluff.each(this._data[0][this.klass.DATA_VALUES_INDEX],function(E){var D=-Infinity;Bluff.each(A,function(F){D=Math.max(D,F)});A.push((C>0)?(E+D):E);B.push(A[C]-E);C+=1},this);this.data("Accumulator",B);this.callSuper()}});Bluff.SideStackedBar=new JS.Class(Bluff.SideBar,{include:Bluff.Base.StackedMixin,draw:function(){this.has_left_labels=true;this._get_maximum_by_stack();this.callSuper();if(!this._has_data){return }var B=0.9;this._bar_width=this._graph_height/this._column_count;var A=[],D=this._column_count,E=[],C=this._column_count,F=(this._bar_width*(1-B))/2;while(D--){A.push(0)}while(C--){E.push(this._graph_left)}Bluff.each(this._norm_data,function(H,G){this._d.fill=H[this.klass.DATA_COLOR_INDEX];Bluff.each(H[this.klass.DATA_VALUES_INDEX],function(P,N){var J=this._graph_left+(this._graph_width-P*this._graph_width-A[N])+1;var I=this._graph_left+this._graph_width-A[N]-1;var K=I-J;var O=E[N],M=this._graph_top+(this._bar_width*N)+F,R=O+K,Q=M+this._bar_width*B;E[N]+=K;A[N]+=(P*this._graph_width-2);this._d.rectangle(O,M,R,Q);var L=this._graph_top+(this._bar_width*N)+(this._bar_width*B/2)+F;this._draw_label(L,N)},this)},this)},_larger_than_max:function(B,A){A=A||0;return this._max(B,A)>this.maximum_value},_max:function(C,A){var B=0;Bluff.each(this._data,function(D){B+=D[this.klass.DATA_VALUES_INDEX][A]},this);return B}});Bluff.Mini.Legend=new JS.Module({_expand_canvas_for_vertical_legend:function(){this._original_rows=this._raw_rows;this._rows+=this._data.length*this._calculate_caps_height(this._scale_fontsize(this.legend_font_size))*1.7;this._render_background()},_draw_vertical_legend:function(){this._legend_labels=[];Bluff.each(this._data,function(G){this._legend_labels.push(G[this.klass.DATA_LABEL_INDEX])},this);var F=40,C=10,D=100,E=40;if(this.font){this._d.font=this.font}this._d.pointsize=this.legend_font_size;var B=D,A=this._original_rows+E;this._debug(function(){this._d.line(0,A,this._raw_columns,A)});Bluff.each(this._legend_labels,function(G,H){this._d.fill=this.font_color;if(this.font){this._d.font=this.font}this._d.pointsize=this._scale_fontsize(this.legend_font_size);this._d.stroke="transparent";this._d.font_weight="normal";this._d.gravity="west";this._d.annotate_scaled(this._raw_columns,1,B+(F*1.7),A,this._truncate_legend_label(G),this._scale);this._d.stroke="transparent";this._d.fill=this._data[H][this.klass.DATA_COLOR_INDEX];this._d.rectangle(B,A-F/2,B+F,A+F/2);A+=this._calculate_caps_height(this.legend_font_size)*1.7},this);this._color_index=0},_truncate_legend_label:function(A){var B=String(A);while(this._calculate_width(this._scale_fontsize(this.legend_font_size),B)>(this._columns-this.legend_left_margin-this.right_margin)&&(B.length>1)){B=B.substr(0,B.length-1)}return B+(B.length<String(A).length?"…":"")}});Bluff.Mini.Bar=new JS.Class(Bluff.Bar,{include:Bluff.Mini.Legend,draw:function(){this.hide_legend=true;this.hide_title=true;this.hide_line_numbers=true;this.marker_font_size=50;this.minimum_value=0;this.legend_font_size=60;this._expand_canvas_for_vertical_legend();this.callSuper();this._draw_vertical_legend()}});Bluff.Mini.Pie=new JS.Class(Bluff.Pie,{include:Bluff.Mini.Legend,initialize_ivars:function(){this.callSuper();this.hide_legend=true;this.hide_title=true;this.hide_line_numbers=true;this.marker_font_size=60;this.legend_font_size=60},draw:function(){this._expand_canvas_for_vertical_legend();this.callSuper();this._draw_vertical_legend()}});Bluff.Mini.SideBar=new JS.Class(Bluff.SideBar,{include:Bluff.Mini.Legend,initialize_ivars:function(){this.callSuper();this.hide_legend=true;this.hide_title=true;this.hide_line_numbers=true;this.marker_font_size=50;this.legend_font_size=50},draw:function(){this._expand_canvas_for_vertical_legend();this.callSuper();this._draw_vertical_legend()}});Bluff.Renderer=new JS.Class({font:"Arial, Helvetica, Verdana, sans-serif",gravity:"north",initialize:function(A){this._canvas=document.getElementById(A);this._ctx=this._canvas.getContext("2d");this._text_nodes=[]},scale:function(B,A){this._sx=B;this._sy=A||B},caps_height:function(B){var C=this._sized_text(B,"X"),A=this._element_size(C).height;this._remove_text_node(C);return A},text_width:function(A,D){var B=this._sized_text(A,D);var C=this._element_size(B).width;this._remove_text_node(B);return C},get_type_metrics:function(C){var B=this._sized_text(this.pointsize,C);var A=this._element_size(B);this._remove_text_node(B);return A},clear:function(C,A){this._canvas.width=C;this._canvas.height=A;this._ctx.clearRect(0,0,C,A);var B=this._text_nodes.length;while(B--){this._remove_text_node(B)}},push:function(){this._ctx.save()},pop:function(){this._ctx.restore()},render_gradiated_background:function(B,A,C,D){this.clear(B,A);var E=this._ctx.createLinearGradient(0,0,0,A);E.addColorStop(0,C);E.addColorStop(1,D);this._ctx.fillStyle=E;this._ctx.fillRect(0,0,B,A)},render_solid_background:function(C,A,B){this.clear(C,A);this._ctx.fillStyle=B;this._ctx.fillRect(0,0,C,A)},annotate_scaled:function(A,I,F,D,C,B){var E=(A*B)>=1?(A*B):1;var G=(I*B)>=1?(I*B):1;var H=this._sized_text(this.pointsize,C);H.style.color=this.fill;H.style.fontWeight=this.font_weight;H.style.textAlign="center";H.style.left=(this._sx*F+this._left_adjustment(H,E))+"px";H.style.top=(this._sy*D+this._top_adjustment(H,G))+"px"},circle:function(C,A,I,G,E,D){var F=Math.sqrt(Math.pow(I-C,2)+Math.pow(G-A,2));this._ctx.fillStyle=this.fill;this._ctx.beginPath();var B=(E||0)*Math.PI/180;var H=(D||360)*Math.PI/180;if(E!==undefined&&D!==undefined){this._ctx.moveTo(this._sx*(C+F*Math.cos(H)),this._sy*(A+F*Math.sin(H)));this._ctx.lineTo(this._sx*C,this._sy*A);this._ctx.lineTo(this._sx*(C+F*Math.cos(B)),this._sy*(A+F*Math.sin(B)))}this._ctx.arc(this._sx*C,this._sy*A,this._sx*F,B,H,false);this._ctx.fill()},line:function(D,C,B,A){this._ctx.strokeStyle=this.stroke;this._ctx.lineWidth=this.stroke_width;this._ctx.beginPath();this._ctx.moveTo(this._sx*D,this._sy*C);this._ctx.lineTo(this._sx*B,this._sy*A);this._ctx.stroke()},polyline:function(B){this._ctx.fillStyle=this.fill;this._ctx.globalAlpha=this.fill_opacity||1;try{this._ctx.strokeStyle=this.stroke}catch(C){}var A=B.shift(),D=B.shift();this._ctx.beginPath();this._ctx.moveTo(this._sx*A,this._sy*D);while(B.length>0){A=B.shift();D=B.shift();this._ctx.lineTo(this._sx*A,this._sy*D)}this._ctx.fill()},rectangle:function(C,B,F,E){var A;if(C>F){A=C;C=F;F=A}if(B>E){A=B;B=E;E=A}try{this._ctx.fillStyle=this.fill;this._ctx.fillRect(this._sx*C,this._sy*B,this._sx*(F-C),this._sy*(E-B))}catch(D){}try{this._ctx.strokeStyle=this.stroke;if(this.stroke!="transparent"){this._ctx.strokeRect(this._sx*C,this._sy*B,this._sx*(F-C),this._sy*(E-B))}}catch(D){}},_left_adjustment:function(C,B){var A=this._element_size(C).width;switch(this.gravity){case"west":return 0;case"east":return B-A;case"north":case"south":case"center":return(B-A)/2}},_top_adjustment:function(C,A){var B=this._element_size(C).height;switch(this.gravity){case"north":return 0;case"south":return A-B;case"west":case"east":case"center":return(A-B)/2}},_sized_text:function(A,B){var C=this._text_node(B);C.style.fontFamily=this.font;C.style.fontSize=(typeof A=="number")?A+"px":A;return C},_text_node:function(A){var B=document.createElement("div");B.style.position="absolute";B.appendChild(document.createTextNode(A));this._canvas.parentNode.appendChild(B);this._text_nodes.push(B);return B},_remove_text_node:function(C){var A=this._text_nodes,B=C;if(typeof B!="number"){B=A.length-1;while(A[B]&&A[B]!=C){B-=1}}if(B==-1){return }A[B].parentNode.removeChild(A[B]);A.splice(B,1)},_element_size:function(A){var B=A.style.display;return(B&&B!="none")?{width:A.offsetWidth,height:A.offsetHeight}:{width:A.clientWidth,height:A.clientHeight}},_offset:function(B){var A=0,C=0;do{A+=B.offsetTop||0;C+=B.offsetLeft||0;B=B.offsetParent}while(B);return{left:C,top:A}}});Bluff.TableReader=new JS.Class({NUMBER_FORMAT:/\-?(0|[1-9]\d*)(\.\d+)?(e[\+\-]?\d+)?/i,initialize:function(B,A){this._table=(typeof B=="string")?document.getElementById(B):B;this._swap=!!A},get_data:function(){if(!this._data){this._read()}return this._data},get_labels:function(){if(!this._labels){this._read()}return this._labels},get_title:function(){return this._title},get_series:function(A){if(this._data[A]){return this._data[A]}return this._data[A]={points:[]}},_read:function(){this._row=this._col=0;this._row_offset=this._col_offset=0;this._data=[];this._labels={};this._row_headings=[];this._col_headings=[];this._walk(this._table);if((this._row_headings.length>1&&this._col_headings.length==1)||this._row_headings.length<this._col_headings.length){if(!this._swap){this._transpose()}}else{if(this._swap){this._transpose()}}Bluff.each(this._col_headings,function(B,A){this.get_series(A-this._col_offset).name=B},this);Bluff.each(this._row_headings,function(B,A){this._labels[A-this._row_offset]=B},this)},_walk:function(C){this._visit(C);var B,A=C.childNodes,D=A.length;for(B=0;B<D;B++){this._walk(A[B])}},_visit:function(C){if(!C.tagName){return }var B=this._strip_tags(C.innerHTML),A,D;switch(C.tagName.toUpperCase()){case"TR":if(!this._has_data){this._row_offset=this._row}this._row+=1;this._col=0;break;case"TD":if(!this._has_data){this._col_offset=this._col}this._col+=1;B=parseFloat(B.match(this.NUMBER_FORMAT)[0]);if(typeof B=="number"){this._has_data=true;A=this._col-this._col_offset-1;D=this._row-this._row_offset-1;this.get_series(A).points[D]=parseFloat(B)}break;case"TH":this._col+=1;if(this._col==1&&this._row==1){this._row_headings[0]=this._col_headings[0]=B}else{if(C.scope=="row"||this._col==1){this._row_headings[this._row-1]=B}else{this._col_headings[this._col-1]=B}}break;case"CAPTION":this._title=B;break}},_transpose:function(){var B=this._data,A;this._data=[];Bluff.each(B,function(D,C){Bluff.each(D.points,function(E,F){this.get_series(F).points[C]=E},this)},this);A=this._row_headings;this._row_headings=this._col_headings;this._col_headings=A;A=this._row_offset;this._row_offset=this._col_offset;this._col_offset=A},_strip_tags:function(A){return A.replace(/<\/?[^>]+>/gi,"")},extend:{Mixin:new JS.Module({data_from_table:function(D,C){var B=new Bluff.TableReader(D,C),A=B.get_data();Bluff.each(A,function(E){this.data(E.name,E.points)},this);this.labels=B.get_labels();this.title=B.get_title()||this.title}})}});Bluff.Base.include(Bluff.TableReader.Mixin);
