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===undefined)?[]: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===undefined){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.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 String(Math.round(a))}if(this._spread>10){return String(Math.floor(a))}else{if(this._spread>=3){return String(Math.floor(a*100)/100)}else{return String(a)}}},_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]);if(!this.startlx){this.startlx=(this._d._sx*h);this.startrx=(this._d._sx*j);this.barw=(this._d._sx*(j-h))}else{if(!this.barpadding){this.barpadding=((this._d._sx*h)-this.startrx)}}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(n,k){if(n[this.klass.DATA_VALUES_INDEX][0]>0){this._d.fill=n[this.klass.DATA_COLOR_INDEX];var j=(n[this.klass.DATA_VALUES_INDEX][0]/g)*360;this._d.circle(e,c,e+a,c,b,b+j+0.5);var l=b+((b+j)-b)/2;var m=Math.round((n[this.klass.DATA_VALUES_INDEX][0]/g)*100)+"%";this._draw_label(e,c,l,a+(a*this.klass.TEXT_OFFSET_PERCENTAGE),m);b+=j}},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(j){var h=d;d=[];Bluff.each(j[this.klass.DATA_VALUES_INDEX],function(m,i){var l=this._graph_left+(this._x_increment*i);var k=this._graph_top+(this._graph_height-m*this._graph_height-a[i]);a[i]+=(m*this._graph_height);d.push(l);d.push(k);this._draw_label(l,i)},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=j[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({extend:{WRAPPER_CLASS:"bluff-wrapper",TEXT_CLASS:"bluff-text"},font:"Arial, Helvetica, Verdana, sans-serif",gravity:"north",initialize:function(a){this._canvas=document.getElementById(a);this._ctx=this._canvas.getContext("2d")},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(d,a){this._canvas.width=d;this._canvas.height=a;this._ctx.clearRect(0,0,d,a);var e=this._text_container(),c=e.childNodes,b=c.length;e.style.width=d+"px";e.style.height=a+"px";while(b--){if(c[b]&&c[b].className==this.klass.TEXT_CLASS){this._remove_text_node(c[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(c,b,a,h,g,f){var e=(c*f)>=1?(c*f):1;var d=(b*f)>=1?(b*f):1;var g=this._sized_text(this.pointsize,g);g.style.color=this.fill;g.style.fontWeight=this.font_weight;g.style.textAlign="center";g.style.left=(this._sx*a+this._left_adjustment(g,e))+"px";g.style.top=(this._sy*h+this._top_adjustment(g,d))+"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,g,f){var a;if(c>g){a=c;c=g;g=a}if(b>f){a=b;b=f;f=a}try{this._ctx.fillStyle=this.fill;this._ctx.fillRect(this._sx*c,this._sy*b,this._sx*(g-c),this._sy*(f-b))}catch(d){}try{this._ctx.strokeStyle=this.stroke;if(this.stroke!="transparent"){this._ctx.strokeRect(this._sx*c,this._sy*b,this._sx*(g-c),this._sy*(f-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}},_text_container:function(){var a=this._canvas.parentNode;if(a.className==this.klass.WRAPPER_CLASS){return a}a=document.createElement("div");a.className=this.klass.WRAPPER_CLASS;a.style.position="relative";a.style.border="none";a.style.padding="0 0 0 0";this._canvas.parentNode.insertBefore(a,this._canvas);a.appendChild(this._canvas);return a},_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.className=this.klass.TEXT_CLASS;b.style.position="absolute";b.appendChild(document.createTextNode(a));this._text_container().appendChild(b);return b},_remove_text_node:function(a){a.parentNode.removeChild(a)},_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}}});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);