flyerhzm-metric_fu 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. data/HISTORY +164 -0
  2. data/MIT-LICENSE +22 -0
  3. data/Manifest.txt +25 -0
  4. data/README.textile +27 -0
  5. data/Rakefile +18 -0
  6. data/TODO +9 -0
  7. data/lib/base/base_template.rb +145 -0
  8. data/lib/base/configuration.rb +180 -0
  9. data/lib/base/generator.rb +167 -0
  10. data/lib/base/graph.rb +39 -0
  11. data/lib/base/md5_tracker.rb +52 -0
  12. data/lib/base/report.rb +100 -0
  13. data/lib/generators/churn.rb +90 -0
  14. data/lib/generators/flay.rb +34 -0
  15. data/lib/generators/flog.rb +167 -0
  16. data/lib/generators/rails_best_practices.rb +31 -0
  17. data/lib/generators/rcov.rb +87 -0
  18. data/lib/generators/reek.rb +64 -0
  19. data/lib/generators/roodi.rb +32 -0
  20. data/lib/generators/saikuro.rb +208 -0
  21. data/lib/generators/stats.rb +43 -0
  22. data/lib/graphs/engines/bluff.rb +98 -0
  23. data/lib/graphs/engines/gchart.rb +119 -0
  24. data/lib/graphs/flay_grapher.rb +20 -0
  25. data/lib/graphs/flog_grapher.rb +40 -0
  26. data/lib/graphs/grapher.rb +11 -0
  27. data/lib/graphs/rails_best_practices_grapher.rb +20 -0
  28. data/lib/graphs/rcov_grapher.rb +20 -0
  29. data/lib/graphs/reek_grapher.rb +32 -0
  30. data/lib/graphs/roodi_grapher.rb +20 -0
  31. data/lib/metric_fu.rb +31 -0
  32. data/lib/templates/awesome/awesome_template.rb +37 -0
  33. data/lib/templates/awesome/churn.html.erb +19 -0
  34. data/lib/templates/awesome/css/buttons.css +82 -0
  35. data/lib/templates/awesome/css/default.css +75 -0
  36. data/lib/templates/awesome/css/integrity.css +335 -0
  37. data/lib/templates/awesome/css/reset.css +7 -0
  38. data/lib/templates/awesome/flay.html.erb +33 -0
  39. data/lib/templates/awesome/flog.html.erb +53 -0
  40. data/lib/templates/awesome/index.html.erb +31 -0
  41. data/lib/templates/awesome/layout.html.erb +30 -0
  42. data/lib/templates/awesome/rails_best_practices.html.erb +27 -0
  43. data/lib/templates/awesome/rcov.html.erb +42 -0
  44. data/lib/templates/awesome/reek.html.erb +40 -0
  45. data/lib/templates/awesome/roodi.html.erb +27 -0
  46. data/lib/templates/awesome/saikuro.html.erb +71 -0
  47. data/lib/templates/awesome/stats.html.erb +41 -0
  48. data/lib/templates/javascripts/bluff-min.js +1 -0
  49. data/lib/templates/javascripts/excanvas.js +19 -0
  50. data/lib/templates/javascripts/js-class.js +1 -0
  51. data/lib/templates/standard/churn.html.erb +31 -0
  52. data/lib/templates/standard/default.css +64 -0
  53. data/lib/templates/standard/flay.html.erb +34 -0
  54. data/lib/templates/standard/flog.html.erb +53 -0
  55. data/lib/templates/standard/index.html.erb +41 -0
  56. data/lib/templates/standard/rails_best_practices.html.erb +29 -0
  57. data/lib/templates/standard/rcov.html.erb +43 -0
  58. data/lib/templates/standard/reek.html.erb +42 -0
  59. data/lib/templates/standard/roodi.html.erb +29 -0
  60. data/lib/templates/standard/saikuro.html.erb +84 -0
  61. data/lib/templates/standard/standard_template.rb +26 -0
  62. data/lib/templates/standard/stats.html.erb +55 -0
  63. data/spec/base/base_template_spec.rb +161 -0
  64. data/spec/base/configuration_spec.rb +269 -0
  65. data/spec/base/generator_spec.rb +244 -0
  66. data/spec/base/graph_spec.rb +24 -0
  67. data/spec/base/md5_tracker_spec.rb +57 -0
  68. data/spec/base/report_spec.rb +139 -0
  69. data/spec/generators/churn_spec.rb +152 -0
  70. data/spec/generators/flay_spec.rb +104 -0
  71. data/spec/generators/flog_spec.rb +238 -0
  72. data/spec/generators/reek_spec.rb +126 -0
  73. data/spec/generators/saikuro_spec.rb +58 -0
  74. data/spec/generators/stats_spec.rb +74 -0
  75. data/spec/graphs/engines/bluff_spec.rb +15 -0
  76. data/spec/graphs/engines/gchart_spec.rb +15 -0
  77. data/spec/graphs/flay_grapher_spec.rb +37 -0
  78. data/spec/graphs/flog_grapher_spec.rb +45 -0
  79. data/spec/graphs/rcov_grapher_spec.rb +37 -0
  80. data/spec/graphs/reek_grapher_spec.rb +46 -0
  81. data/spec/graphs/roodi_grapher_spec.rb +37 -0
  82. data/spec/resources/saikuro/app/controllers/sessions_controller.rb_cyclo.html +10 -0
  83. data/spec/resources/saikuro/app/controllers/users_controller.rb_cyclo.html +16 -0
  84. data/spec/resources/saikuro/index_cyclo.html +155 -0
  85. data/spec/resources/saikuro_sfiles/thing.rb_cyclo.html +11 -0
  86. data/spec/resources/yml/20090630.yml +7844 -0
  87. data/spec/spec.opts +8 -0
  88. data/spec/spec_helper.rb +7 -0
  89. data/tasks/metric_fu.rake +22 -0
  90. data/vendor/_fonts/monaco.ttf +0 -0
  91. data/vendor/saikuro/saikuro.rb +1219 -0
  92. metadata +234 -0
@@ -0,0 +1,7 @@
1
+ /*
2
+ Copyright (c) 2008, Yahoo! Inc. All rights reserved.
3
+ Code licensed under the BSD License:
4
+ http://developer.yahoo.net/yui/license.txt
5
+ version: 2.5.2
6
+ */
7
+ html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym {border:0;font-variant:normal;}sup {vertical-align:text-top;}sub {vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;}input,textarea,select{*font-size:100%;}legend{color:#000;}
@@ -0,0 +1,33 @@
1
+ <h3>Flay Results</h3>
2
+
3
+ <p><a href='http://ruby.sadi.st/Flay.html'>Flay</a> analyzes ruby code for structural similarities.</p>
4
+
5
+ <% graph_name = 'flay' %>
6
+ <% if MetricFu.configuration.graph_engine == :gchart %>
7
+ <img src="<%= graph_name %>.png?<%= Time.now.to_i %>" />
8
+ <% else %>
9
+ <canvas id="graph"></canvas>
10
+ <script language="javascript" src="<%= graph_name %>.js?<%= Time.now.to_i %>" type="text/javascript"></script>
11
+ <% end %>
12
+
13
+ <h4>Total Score (lower is better): <%= @flay[:total_score] %></h4>
14
+
15
+ <table>
16
+ <tr>
17
+ <th>Files</th>
18
+ <th>Matches</th>
19
+ </tr>
20
+ <% count = 0 %>
21
+ <% @flay[:matches].each do |match| %>
22
+ <tr class='<%= cycle("light", "dark", count) %>'>
23
+ <td>
24
+ <% match[:matches].each do |file| %>
25
+ <%= link_to_filename(file[:name], file[:line]) %><br/>
26
+ <% end %>
27
+ </td>
28
+ <td><%= match[:reason] %></td>
29
+ </tr>
30
+ <% count += 1 %>
31
+ <% end %>
32
+ </table>
33
+ <p>Generated on <%= Time.now.localtime %></p>
@@ -0,0 +1,53 @@
1
+ <h3>Flog Results</h3>
2
+ <p><a href='http://ruby.sadi.st/Flog.html'>Flog</a> measures code complexity.</p>
3
+
4
+ <% graph_name = 'flog' %>
5
+ <% if MetricFu.configuration.graph_engine == :gchart %>
6
+ <img src="<%= graph_name %>.png?<%= Time.now.to_i %>" />
7
+ <% else %>
8
+ <canvas id="graph"></canvas>
9
+ <script language="javascript" src="<%= graph_name %>.js?<%= Time.now.to_i %>" type="text/javascript"></script>
10
+ <% end %>
11
+
12
+ <h2>Total Flog score for all methods: <%= @flog[:total]%></h2>
13
+ <h2>Average Flog score for all methods: <%= @flog[:average]%></h2>
14
+
15
+ <table>
16
+ <tr>
17
+ <th>File</th>
18
+ <th>Total score</th>
19
+ <th>Methods</th>
20
+ <th>Average score</th>
21
+ <th>Highest score</th>
22
+ </tr>
23
+ <% @flog[:pages].each do |page| %>
24
+ <tr>
25
+ <td><a href="#<%= page[:path].gsub(/[^a-z]+/, '_') %>"><%= page[:path] %></a></td>
26
+ <td><%= page[:score].round %></td>
27
+ <td><%= page[:scanned_methods].length %></td>
28
+ <td><%= page[:average_score].round %></td>
29
+ <td><%= page[:highest_score].round %></td>
30
+ </tr>
31
+ <% end %>
32
+ </table>
33
+
34
+ <% @flog[:pages].each do |page| %>
35
+ <h2 id="<%= page[:path].gsub(/[^a-z]+/, '_') %>"><%= link_to_filename page[:path] %></h2>
36
+ <% page[:scanned_methods].each do |sm| %>
37
+ <p><%= sm[:name] %></p>
38
+ <p>Total Score: <%=sm[:score]%></p>
39
+ <table>
40
+ <tr>
41
+ <th>Score</th>
42
+ <th>Operator</th>
43
+ </tr>
44
+ <% sm[:operators].each do |operator| %>
45
+ <tr>
46
+ <td><%= operator[:score] %></td>
47
+ <td><%= operator[:operator] %></td>
48
+ </tr>
49
+ <% end %>
50
+ </table>
51
+ <% end %>
52
+ <% end %>
53
+ <p>Generated on <%= Time.now.localtime %></p>
@@ -0,0 +1,31 @@
1
+ <h3>Metric Fu Results</h3>
2
+ <ul id='projects'>
3
+ <% if @churn %>
4
+ <li class='even failure'><a href="churn.html">Churn</a></li>
5
+ <% end %>
6
+ <% if @flay %>
7
+ <li class='even failure'><a href="flay.html">Flay</a></li>
8
+ <% end %>
9
+ <% if @flog %>
10
+ <li class='even failure'><a href="flog.html">Flog</a></li>
11
+ <% end %>
12
+ <% if @rcov %>
13
+ <li class='even failure'><a href="rcov.html">Rcov</a></li>
14
+ <% end %>
15
+ <% if @reek %>
16
+ <li class='even failure'><a href="reek.html">Reek</a></li>
17
+ <% end %>
18
+ <% if @roodi %>
19
+ <li class='even failure'><a href="roodi.html">Roodi</a></li>
20
+ <% end %>
21
+ <% if @saikuro %>
22
+ <li class='even failure'><a href="saikuro.html">Saikuro</a></li>
23
+ <% end %>
24
+ <% if @stats %>
25
+ <li class='even failure'><a href="stats.html">Stats</a></li>
26
+ <% end %>
27
+ <% if @rails_best_practices %>
28
+ <li class='even failure'><a href="rails_best_practices.html">Rails Best Practices report</a></li>
29
+ <% end %>
30
+ </ul>
31
+ <p>Generated on <%= Time.now.localtime %></p>
@@ -0,0 +1,30 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+ <html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'>
3
+ <head>
4
+ <meta content='text/html; charset=utf-8' http-equiv='Content-Type' />
5
+ <meta content='en' http-equiv='Content-Language' />
6
+ <title>metrics</title>
7
+ <style>
8
+ <%= inline_css("css/reset.css") %>
9
+ <%= inline_css("css/buttons.css") %>
10
+ <%= inline_css("css/integrity.css") %>
11
+ <%= inline_css("css/default.css") %>
12
+ </style>
13
+ <link REL="SHORTCUT ICON" HREF="/favicon.ico">
14
+ <script language="javascript" src="js-class.js" type="text/javascript"></script>
15
+ <script language="javascript" src="bluff-min.js" type="text/javascript"></script>
16
+ <script language="javascript" src="excanvas.js" type="text/javascript"></script>
17
+ </head>
18
+ <body>
19
+ <div id='header'>
20
+ <h1><a href="/">metrics</a> | <a href="index.html"><%= @name %></a></h1>
21
+ <address class='watermark'>
22
+ built with
23
+ <a href='http://metric-fu.rubyforge.org/'>metric-fu</a>
24
+ </address>
25
+ </div>
26
+ <div id='content'>
27
+ <%= @html %>
28
+ </div>
29
+ </body>
30
+ </html>
@@ -0,0 +1,27 @@
1
+ <h3>Rails Best Practices Results</h3>
2
+
3
+ <p><a href="http://github.com/flyerhzm/rails_best_practices">rails_best_practices</a> checks quality of rails app files according to ihower’s presentation from Kungfu RailsConf in Shanghai China.</p>
4
+
5
+ <% graph_name = 'rails_best_practices' %>
6
+ <% if MetricFu.configuration.graph_engine == :gchart %>
7
+ <img src="<%= graph_name %>.png?<%= Time.now.to_i %>" />
8
+ <% else %>
9
+ <canvas id="graph"></canvas>
10
+ <script language="javascript" src="<%= graph_name %>.js?<%= Time.now.to_i %>" type="text/javascript"></script>
11
+ <% end %>
12
+
13
+ <table>
14
+ <tr>
15
+ <th>File Path</th>
16
+ <th>Warning</th>
17
+ </tr>
18
+ <% count = 0 %>
19
+ <% @rails_best_practices[:problems].each do |problem| %>
20
+ <tr class='<%= cycle("light", "dark", count) %>'>
21
+ <td><%= link_to_filename(problem[:file], problem[:line]) %></td>
22
+ <td><%= problem[:problem] %></td>
23
+ </tr>
24
+ <% count += 1 %>
25
+ <% end %>
26
+ </table>
27
+ <p>Generated on <%= Time.now.localtime %></p>
@@ -0,0 +1,42 @@
1
+ <h3>Rcov Code Coverage Results</h3>
2
+
3
+ <p>C0 code coverage information.</p>
4
+
5
+ <% graph_name = 'rcov' %>
6
+ <% if MetricFu.configuration.graph_engine == :gchart %>
7
+ <img src="<%= graph_name %>.png?<%= Time.now.to_i %>" />
8
+ <% else %>
9
+ <canvas id="graph"></canvas>
10
+ <script language="javascript" src="<%= graph_name %>.js?<%= Time.now.to_i %>" type="text/javascript"></script>
11
+ <% end %>
12
+
13
+ <p>Total Coverage: <%= @rcov.delete(:global_percent_run) %>% </p>
14
+ <table>
15
+ <tr>
16
+ <th>File Path</th>
17
+ <th>Percent run</th>
18
+ </tr>
19
+ <% count = 0 %>
20
+ <% @rcov.sort_by{ |k,v| v[:percent_run] }.each do |fname, file| %>
21
+ <tr>
22
+ <td><a href="#<%= fname.gsub(/[^a-z]+/, '_') %>"><%= fname %></a></td>
23
+ <td><%= file[:percent_run] %></td>
24
+ </tr>
25
+ <% count += 1 %>
26
+ <% end %>
27
+ </table>
28
+
29
+ <% @rcov.sort_by{ |k,v| v[:percent_run] }.each do |fname, file| %>
30
+ <h2 id="<%= fname.gsub(/[^a-z]+/, '_') %>"> <%= fname %></h2>
31
+ <div class="rcov_overflow">
32
+ <table class="rcov_code">
33
+ <% file[:lines].each_with_index do |line, index| %>
34
+ <tr>
35
+ <% css_class = line[:was_run] ? "rcov_run" : "rcov_not_run" %>
36
+ <td class="<%= css_class %>"><%= link_to_filename(fname, index + 1, "<pre>#{line[:content]}</pre>") %></td>
37
+ </tr>
38
+ <% end %>
39
+ </table>
40
+ </div>
41
+ <% end %>
42
+ <p>Generated on <%= Time.now.localtime %></p>
@@ -0,0 +1,40 @@
1
+ <h3>Reek Results</h3>
2
+
3
+ <p><a href="http://reek.rubyforge.org/">Reek</a> detects common code smells in ruby code.</p>
4
+
5
+ <% graph_name = 'reek' %>
6
+ <% if MetricFu.configuration.graph_engine == :gchart %>
7
+ <img src="<%= graph_name %>.png?<%= Time.now.to_i %>" />
8
+ <% else %>
9
+ <canvas id="graph"></canvas>
10
+ <script language="javascript" src="<%= graph_name %>.js?<%= Time.now.to_i %>" type="text/javascript"></script>
11
+ <% end %>
12
+
13
+ <table>
14
+ <tr>
15
+ <th>File Path</th>
16
+ <th>Method</th>
17
+ <th>Description</th>
18
+ <th>Type</th>
19
+ </tr>
20
+ <% count = 0 %>
21
+ <% @reek[:matches].each do |match| %>
22
+ <% match[:code_smells].each do |smell| %>
23
+ <tr class='<%= cycle("light", "dark", count) %>'>
24
+ <td><%= link_to_filename(match[:file_path]) %></td>
25
+ <td>
26
+ <%= smell[:method] %>
27
+ </td>
28
+ <td>
29
+ <%= smell[:message] %>
30
+ </td>
31
+ <td>
32
+ <%= smell[:type] %>
33
+ </td>
34
+ </tr>
35
+ <% count += 1 %>
36
+ <% end %>
37
+ <% end %>
38
+
39
+ </table>
40
+ <p>Generated on <%= Time.now.localtime %></p>
@@ -0,0 +1,27 @@
1
+ <h3>Roodi Results</h3>
2
+
3
+ <p><a href="http://roodi.rubyforge.org/">Roodi</a> parses your Ruby code and warns you about design issues you have based on the checks that is has configured.</p>
4
+
5
+ <% graph_name = 'roodi' %>
6
+ <% if MetricFu.configuration.graph_engine == :gchart %>
7
+ <img src="<%= graph_name %>.png?<%= Time.now.to_i %>" />
8
+ <% else %>
9
+ <canvas id="graph"></canvas>
10
+ <script language="javascript" src="<%= graph_name %>.js?<%= Time.now.to_i %>" type="text/javascript"></script>
11
+ <% end %>
12
+
13
+ <table>
14
+ <tr>
15
+ <th>File Path</th>
16
+ <th>Warning</th>
17
+ </tr>
18
+ <% count = 0 %>
19
+ <% @roodi[:problems].each do |problem| %>
20
+ <tr class='<%= cycle("light", "dark", count) %>'>
21
+ <td><%= link_to_filename(problem[:file], problem[:line]) %></td>
22
+ <td><%= problem[:problem] %></td>
23
+ </tr>
24
+ <% count += 1 %>
25
+ <% end %>
26
+ </table>
27
+ <p>Generated on <%= Time.now.localtime %></p>
@@ -0,0 +1,71 @@
1
+ <h3>Saikuro Results</h3>
2
+ <p><a href='http://saikuro.rubyforge.org/'>Saikuro</a> analyzes ruby code for cyclomatic complexity.</p>
3
+
4
+ <h2>Analyzed Methods</h2>
5
+ <table>
6
+ <tr>
7
+ <th>Method Name</th>
8
+ <th>Complexity</th>
9
+ <th># Lines</th>
10
+ </tr>
11
+ <% @saikuro[:methods].each do |method| %>
12
+ <tr>
13
+ <td><%= method[:name] %></td>
14
+ <td><%= method[:complexity] %></td>
15
+ <td><%= method[:lines] %></td>
16
+ </tr>
17
+ <% end %>
18
+ </table>
19
+
20
+
21
+
22
+ <h2>Analyzed Classes</h2>
23
+ <table>
24
+ <tr>
25
+ <th>Class Name</th>
26
+ <th>Complexity</th>
27
+ <th># Lines</th>
28
+ </tr>
29
+ <% @saikuro[:classes].each do |klass| %>
30
+ <tr>
31
+ <td><%= klass[:name] %></td>
32
+ <td><%= klass[:complexity] %></td>
33
+ <td><%= klass[:lines] %></td>
34
+ </tr>
35
+ <% end %>
36
+ </table>
37
+
38
+
39
+ <h2>Analyzed Files</h2>
40
+ <% @saikuro[:files].each do |file| %>
41
+ <% file[:classes].each do |klass| %>
42
+ <% if !klass[:methods].empty? %>
43
+ <h3><%= file[:filename] %></h3>
44
+ <h4>Class : <%= klass[:class_name] %></h4>
45
+ <h5>Total complexity : <%= klass[:complexity] %></h5>
46
+ <h5>Total lines : <%= klass[:lines] %></h5>
47
+ <table>
48
+ <tr>
49
+ <th>Method</th>
50
+ <th>Complexity</th>
51
+ <th># Lines</th>
52
+ </tr>
53
+ <% klass[:methods].each do |method| %>
54
+ <tr>
55
+ <td>
56
+ <%= method[:name] %>
57
+ </td>
58
+ <td>
59
+ <%= method[:complexity] %>
60
+ </td>
61
+ <td>
62
+ <%= method[:lines] %>
63
+ </td>
64
+ </tr>
65
+ <% end %>
66
+ </table>
67
+ <% end %>
68
+ <% end %>
69
+ <% end %>
70
+
71
+ <p>Generated on <%= Time.now.localtime %></p>
@@ -0,0 +1,41 @@
1
+ <h3>Rake Stats Results</h3>
2
+ <p>Rails rake stats results.</p>
3
+ <table>
4
+ <tr>
5
+ <th>Lines of Code</th>
6
+ <th>Lines of Test</th>
7
+ <th>Code to test ratio</th>
8
+ </tr>
9
+ <tr>
10
+ <td><%= @stats[:codeLOC] %></td>
11
+ <td><%= @stats[:testLOC] %></td>
12
+ <td>1:<%= @stats[:code_to_test_ratio] %></td>
13
+ </tr>
14
+ </table>
15
+
16
+ <table>
17
+ <tr>
18
+ <th>Name</th>
19
+ <th>Lines</th>
20
+ <th>LOC</th>
21
+ <th>Classes</th>
22
+ <th>Methods</th>
23
+ <th>Methods per class</th>
24
+ <th>LOC per method</th>
25
+ </tr>
26
+ <% count = 0 %>
27
+ <% @stats[:lines].each do |line| %>
28
+ <tr>
29
+ <td><%= line[:name] %></td>
30
+ <td><%= line[:lines] %></td>
31
+ <td><%= line[:loc] %></td>
32
+ <td><%= line[:classes] %></td>
33
+ <td><%= line[:methods] %></td>
34
+ <td><%= line[:methods_per_class] %></td>
35
+ <td><%= line[:loc_per_method] %></td>
36
+ </tr>
37
+ <% count += 1 %>
38
+ <% end %>
39
+ </table>
40
+
41
+ <p>Generated on <%= Time.now.localtime %></p>
@@ -0,0 +1 @@
1
+ Bluff={VERSION:'0.3.4',array:function(c){if(c.length===undefined)return[c];var d=[],f=c.length;while(f--)d[f]=c[f];return d},each:function(c,d,f){for(var g=0,h=c.length;g<h;g++){d.call(f||null,c[g],g)}},reverse_each:function(c,d,f){var g=c.length;while(g--)d.call(f||null,c[g],g)},sum:function(c){var d=0,f=c.length;while(f--)d+=c[f];return d},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(c,d){this._0=new Bluff.Renderer(c);d=d||this.klass.DEFAULT_TARGET_WIDTH;this.top_margin=this.bottom_margin=this.left_margin=this.right_margin=20;var f;if(typeof d!='number'){f=d.split('x');this._j=parseFloat(f[0]);this._x=parseFloat(f[1])}else{this._j=parseFloat(d);this._x=this._j*0.75}this.initialize_ivars();this._15();this.theme_keynote()},initialize_ivars:function(){this._b=800;this._J=800*(this._x/this._j);this._5=0;this.marker_count=null;this.maximum_value=this.minimum_value=null;this._9=false;this._2=[];this.labels={};this._y={};this.sort=true;this.title=null;this._c=this._j/this._b;this.marker_font_size=21.0;this.legend_font_size=20.0;this.title_font_size=36.0;this.legend_box_size=20.0;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._1l=[];this._k={};this.x_axis_label=this.y_axis_label=null;this.y_axis_increment=null;this.stacked=null;this._a=null},set_margins:function(c){this.top_margin=this.left_margin=this.right_margin=this.bottom_margin=c},set_font:function(c){this.font=c;this._0.font=this.font},add_color:function(c){this.colors.push(c)},replace_colors:function(c){this.colors=c||[]},set_theme:function(c){this._15();this._k={colors:['black','white'],additional_line_colors:[],marker_color:'white',font_color:'black',background_colors:null,background_image:null};for(var d in c)this._k[d]=c[d];this.colors=this._k.colors;this.marker_color=this._k.marker_color;this.font_color=this._k.font_color||this.marker_color;this._1l=this._k.additional_line_colors;this._R()},theme_keynote:function(){this._S='#6886B4';this._T='#FDD84E';this._n='#72AE6E';this._z='#D1695E';this._U='#8A6EAF';this._A='#EFAA43';this._B='white';this.colors=[this._T,this._S,this._n,this._z,this._U,this._A,this._B];this.set_theme({colors:this.colors,marker_color:'white',font_color:'white',background_colors:['black','#4a465a']})},theme_37signals:function(){this._n='#339933';this._U='#cc99cc';this._S='#336699';this._T='#FFF804';this._z='#ff0000';this._A='#cf5910';this._C='black';this.colors=[this._T,this._S,this._n,this._z,this._U,this._A,this._C];this.set_theme({colors:this.colors,marker_color:'black',font_color:'black',background_colors:['#d1edf5','white']})},theme_rails_keynote:function(){this._n='#00ff00';this._V='#333333';this._A='#ff5d00';this._z='#f61100';this._B='white';this._W='#999999';this._C='black';this.colors=[this._n,this._V,this._A,this._z,this._B,this._W,this._C];this.set_theme({colors:this.colors,marker_color:'white',font_color:'white',background_colors:['#0083a3','#0083a3']})},theme_odeo:function(){this._V='#202020';this._B='white';this._1m='#a21764';this._n='#8ab438';this._W='#999999';this._1n='#3a5b87';this._C='black';this.colors=[this._V,this._B,this._1n,this._1m,this._n,this._W,this._C];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(f,g,h){g=(g===undefined)?[]:g;h=h||null;g=Bluff.array(g);this._2.push([f,g,(h||this._1o())]);this._5=(g.length>this._5)?g.length:this._5;Bluff.each(g,function(c,d){if(c===undefined)return;if(this.maximum_value===null&&this.minimum_value===null)this.maximum_value=this.minimum_value=c;this.maximum_value=this._16(c)?c:this.maximum_value;if(this.maximum_value>0)this._9=true;this.minimum_value=this._1p(c)?c:this.minimum_value;if(this.minimum_value<0)this._9=true},this)},draw:function(){if(this.stacked)this._1q();this._1r();this._s(function(){this._0.rectangle(this.left_margin,this.top_margin,this._b-this.right_margin,this._J-this.bottom_margin);this._0.rectangle(this._1,this._7,this._o,this._i)})},clear:function(){this._R()},_1r:function(){if(!this._9)return this._1s();this._X();this._1t();if(this.sort)this._1u();this._1v();this._Y();this._1w();this._1x()},_X:function(g){if(this._a===null||g===true){this._a=[];if(!this._9)return;this._17();Bluff.each(this._2,function(d){var f=[];Bluff.each(d[this.klass.DATA_VALUES_INDEX],function(c){if(c===null||c===undefined)f.push(null);else f.push((c-this.minimum_value)/this._e)},this);this._a.push([d[this.klass.DATA_LABEL_INDEX],f,d[this.klass.DATA_COLOR_INDEX]])},this)}},_17:function(){this._e=this.maximum_value-this.minimum_value;this._e=this._e>0?this._e:1},_1t:function(){this._K=this.hide_line_markers?0:this._D(this.marker_font_size);this._18=this.hide_title?0:this._D(this.title_font_size);this._19=this.hide_legend?0:this._D(this.legend_font_size);var c,d,f,g,h,i,j;if(this.hide_line_markers){this._1=this.left_margin;this._Z=this.right_margin;this._1a=this.bottom_margin}else{d=0;if(this.has_left_labels){c='';for(j in this.labels){c=c.length>this.labels[j].length?c:this.labels[j]}d=this._L(this.marker_font_size,c)*1.25}else{d=this._L(this.marker_font_size,this._1b(this.maximum_value))}f=this.hide_line_numbers&&!this.has_left_labels?0:d+this.klass.LABEL_MARGIN*2;this._1=this.left_margin+f+(this.y_axis_label===null?0.0:this._K+this.klass.LABEL_MARGIN*2);g=-Infinity;for(j in this.labels)g=g>Number(j)?g:Number(j);g=Math.round(g);h=(g>=(this._5-1)&&this.center_labels_over_point)?this._L(this.marker_font_size,this.labels[g])/2:0.0;this._Z=this.right_margin+h;this._1a=this.bottom_margin+this._K+this.klass.LABEL_MARGIN}this._o=this._b-this._Z;this._6=this._b-this._1-this._Z;this._7=this.top_margin+(this.hide_title?this.klass.TITLE_MARGIN:this._18+this.klass.TITLE_MARGIN*2)+(this.hide_legend?this.klass.LEGEND_MARGIN:this._19+this.klass.LEGEND_MARGIN*2);i=(this.x_axis_label===null)?0.0:this._K+this.klass.LABEL_MARGIN;this._i=this._J-this._1a-i;this._4=this._i-this._7},_1w:function(){if(this.x_axis_label){var c=this._i+this.klass.LABEL_MARGIN*2+this._K;this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.pointsize=this._f(this.marker_font_size);this._0.gravity='north';this._0.annotate_scaled(this._b,1.0,0.0,c,this.x_axis_label,this._c);this._s(function(){this._0.line(0.0,c,this._b,c)})}},_Y: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(c){if(!this.marker_count&&this._e%c==0)this.marker_count=c},this);this.marker_count=this.marker_count||4}this._10=(this._e>0)?this._1c(this._e/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._17();this._X(true);this.marker_count=Math.round(this._e/this.y_axis_increment);this._10=this.y_axis_increment}this._1y=this._4/(this._e/this._10);var d,f,g,h;for(d=0,f=this.marker_count;d<=f;d++){g=this._7+this._4-d*this._1y;this._0.stroke=this.marker_color;this._0.stroke_width=1;this._0.line(this._1,g,this._o,g);h=d*this._10+this.minimum_value;if(!this.hide_line_numbers){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.pointsize=this._f(this.marker_font_size);this._0.gravity='east';this._0.annotate_scaled(this._1-this.klass.LABEL_MARGIN,1.0,0.0,g,this._1b(h),this._c)}}},_1d:function(c){return(this._b-c)/2},_1v:function(){if(this.hide_legend)return;this._t=[];for(var i=0,j=this._2.length;i<j;i++)this._t.push(this._2[i][this.klass.DATA_LABEL_INDEX]);var k=this.legend_box_size;if(this.font)this._0.font=this.font;this._0.pointsize=this.legend_font_size;var l=[[]];Bluff.each(this._t,function(c){var d=l.length-1;var f=this._0.get_type_metrics(c);var g=f.width+k*2.7;l[d].push(g);if(Bluff.sum(l[d])>(this._b*0.9))l.push([l[d].pop()])},this);var o=this._1d(Bluff.sum(l[0]));var n=this.hide_title?this.top_margin+this.klass.LEGEND_MARGIN:this.top_margin+this.klass.TITLE_MARGIN+this._18+this.klass.LEGEND_MARGIN;this._s(function(){this._0.stroke_width=1;this._0.line(0,n,this._b,n)});Bluff.each(this._t,function(c,d){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._f(this.legend_font_size);this._0.stroke='transparent';this._0.font_weight='normal';this._0.gravity='west';this._0.annotate_scaled(this._b,1.0,o+(k*1.7),n,c,this._c);this._0.stroke='transparent';this._0.fill=this._2[d][this.klass.DATA_COLOR_INDEX];this._0.rectangle(o,n-k/2.0,o+k,n+k/2.0);this._0.pointsize=this.legend_font_size;var f=this._0.get_type_metrics(c);var g=f.width+(k*2.7),h;l[0].shift();if(l[0].length==0){this._s(function(){this._0.line(0.0,n,this._b,n)});l.shift();if(l.length>0)o=this._1d(Bluff.sum(l[0]));h=Math.max(this._19,k)+this.klass.LEGEND_MARGIN;if(l.length>0){n+=h;this._7+=h;this._4=this._i-this._7}}else{o+=g}},this);this._l=0},_1x:function(){if(this.hide_title||!this.title)return;this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._f(this.title_font_size);this._0.font_weight='bold';this._0.gravity='north';this._0.annotate_scaled(this._b,1.0,0,this.top_margin,this.title,this._c)},_d:function(c,d){if(this.hide_line_markers)return;var f;if(this.labels[d]&&!this._y[d]){f=this._i+this.klass.LABEL_MARGIN;this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.font_weight='normal';this._0.pointsize=this._f(this.marker_font_size);this._0.gravity='north';this._0.annotate_scaled(1.0,1.0,c,f,this.labels[d],this._c);this._y[d]=true;this._s(function(){this._0.stroke_width=1;this._0.line(0.0,f,this._b,f)})}},_1s:function(){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.font_weight='normal';this._0.pointsize=this._f(80);this._0.gravity='center';this._0.annotate_scaled(this._b,this._J/2,0,10,this.no_data_message,this._c)},_R:function(){var c=this._k.background_colors;switch(true){case c instanceof Array:this._1z.apply(this,c);break;case typeof c=='string':this._1A(c);break;default:this._1B(this._k.background_image);break}},_1A:function(c){this._0.render_solid_background(this._j,this._x,c)},_1z:function(c,d){this._0.render_gradiated_background(this._j,this._x,c,d)},_1B:function(c){},_15:function(){this._l=0;this._y={};this._k={};this._0.scale(this._c,this._c)},_1T:function(c){return this._c*c},_f:function(c){var d=c*this._c;return d},_M:function(c,d){return(c>d)?d:c},_16:function(c,d){return c>this.maximum_value},_1p:function(c,d){return c<this.minimum_value},_1e:function(c,d){return c},_1U:function(c,d){return c},_1c:function(c){if(c==0)return 1.0;var d=1.0;while(c<10){c*=10;d/=10}while(c>100){c/=10;d*=10}return Math.floor(c)*d},_1u:function(){var f=this._1C,g=this.klass.DATA_VALUES_INDEX;this._a.sort(function(c,d){return f(d[g])-f(c[g])})},_1C:function(d){var f=0;Bluff.each(d,function(c){f+=c});return f},_1q:function(){var g=[],h=this._5;while(h--)g[h]=0;Bluff.each(this._2,function(f){Bluff.each(f[this.klass.DATA_VALUES_INDEX],function(c,d){g[d]+=c},this);f[this.klass.DATA_VALUES_INDEX]=Bluff.array(g)},this)},_s:function(c){if(this.klass.DEBUG){this._0.fill='transparent';this._0.stroke='turquoise';c.call(this)}},_1o:function(){if(this._l==0){this._l+=1;return this.colors[0]}else{if(this._l<this.colors.length){this._l+=1;return this.colors[this._l-1]}else{this._l=0;return this.colors[this.colors.length-1]}}},_1b:function(c){if(this._e%this.marker_count==0||this.y_axis_increment!==null){return String(Math.round(c))}if(this._e>10)return String(Math.floor(c));else if(this._e>=3)return String(Math.floor(c*100)/100);else return String(c)},_D:function(c){return this._0.caps_height(c)},_L:function(c,d){return this._0.text_width(c,d)}});Bluff.Area=new JS.Class(Bluff.Base,{draw:function(){this.callSuper();if(!this._9)return;this._N=this._6/(this._5-1);this._0.stroke='transparent';Bluff.each(this._a,function(h){var i=[];var j=0.0,k=0.0;Bluff.each(h[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._N*d);var g=this._7+(this._4-c*this._4);if(j>0&&k>0){i.push(f);i.push(g)}else{i.push(this._1);i.push(this._i-1);i.push(f);i.push(g)}this._d(f,d);j=f;k=g},this);i.push(this._o);i.push(this._i-1);i.push(this._1);i.push(this._i-1);this._0.fill=h[this.klass.DATA_COLOR_INDEX];this._0.polyline(i)},this)}});Bluff.BarConversion=new JS.Class({mode:null,zero:null,graph_top:null,graph_height:null,minimum_value:null,spread:null,getLeftYRightYscaled:function(c,d){var f;switch(this.mode){case 1:d[0]=this.graph_top+this.graph_height*(1-c)+1;d[1]=this.graph_top+this.graph_height-1;break;case 2:d[0]=this.graph_top+1;d[1]=this.graph_top+this.graph_height*(1-c)-1;break;case 3:f=c-this.minimum_value/this.spread;if(c>=this.zero){d[0]=this.graph_top+this.graph_height*(1-(f-this.zero))+1;d[1]=this.graph_top+this.graph_height*(1-this.zero)-1}else{d[0]=this.graph_top+this.graph_height*(1-(f-this.zero))+1;d[1]=this.graph_top+this.graph_height*(1-this.zero)-1}break;default:d[0]=0.0;d[1]=0.0}}});Bluff.Bar=new JS.Class(Bluff.Base,{draw:function(){var c=0,d;for(d in this.labels)c+=1;this.center_labels_over_point=(c>this._5);this.callSuper();if(!this._9)return;this._1D()},_1D:function(){var l=0.9;this._8=this._6/(this._5*this._2.length);var o=(this._8*(1-l))/2;this._0.stroke_opacity=0.0;var n=new Bluff.BarConversion();n.graph_height=this._4;n.graph_top=this._7;if(this.minimum_value>=0){n.mode=1}else{if(this.maximum_value<=0){n.mode=2}else{n.mode=3;n.spread=this._e;n.minimum_value=this.minimum_value;n.zero=-this.minimum_value/this._e}}Bluff.each(this._a,function(j,k){Bluff.each(j[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._8*(k+d+((this._2.length-1)*d)))+o;var g=f+this._8*l;var h=[];n.getLeftYRightYscaled(c,h);this._0.fill=j[this.klass.DATA_COLOR_INDEX];this._0.stroke='transparent';this._0.rectangle(f,h[0],g,h[1]);var i=this._1+(this._2.length*this._8*d)+(this._2.length*this._8/2.0)+o;this._d(i-(this.center_labels_over_point?this._8/2.0:0.0),d)},this)},this);if(this.center_labels_over_point)this._d(this._o,this._5)}});Bluff.Line=new JS.Class(Bluff.Base,{baseline_value:null,baseline_color:null,hide_dots:null,hide_lines:null,initialize:function(c){if(arguments.length>3)throw'Wrong number of arguments';if(arguments.length==1||(typeof arguments[1]!='number'&&typeof arguments[1]!='string'))this.callSuper(c,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._9)return;this.x_increment=(this._5>1)?(this._6/(this._5-1)):this._6;var l;if(this._O!==undefined){l=this._7+(this._4-this._O*this._4);this._0.push();this._0.stroke=this.baseline_color;this._0.stroke_width=3.0;this._0.line(this._1,l,this._1+this._6,l);this._0.pop()}Bluff.each(this._a,function(i){var j=null,k=null;Bluff.each(i[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this.x_increment*d);if(c===undefined)return;this._d(f,d);var g=this._7+(this._4-c*this._4);this._0.stroke=i[this.klass.DATA_COLOR_INDEX];this._0.fill=i[this.klass.DATA_COLOR_INDEX];this._0.stroke_opacity=1.0;this._0.stroke_width=this._M(this._j/(this._a[0][1].length*6),3.0);if(!this.hide_lines&&j!==null&&k!==null)this._0.line(j,k,f,g);var h=this._M(this._j/(this._a[0][1].length*2),7.0);if(!this.hide_dots)this._0.circle(f,g,f-h,g);j=f;k=g},this)},this)},_X:function(){this.maximum_value=Math.max(this.maximum_value,this.baseline_value);this.callSuper();if(this.baseline_value!==null)this._O=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._9)return;this._u=this._4/2.0;this._v=this._1+(this._6/2.0);this._w=this._7+(this._4/2.0)-10;this._N=this._6/(this._5-1);var s=this._M(this._j/(this._a[0][this.klass.DATA_VALUES_INDEX].length*2.5),7.0);this._0.stroke_opacity=1.0;this._0.stroke_width=this._M(this._j/(this._a[0][this.klass.DATA_VALUES_INDEX].length*4),3.0);var q;if(this._O!==undefined){q=this._7+(this._4-this._O*this._4);this._0.push();this._0.stroke_color=this.baseline_color;this._0.fill_opacity=0.0;this._0.stroke_width=5;this._0.line(this._1,q,this._1+this._6,q);this._0.pop()}Bluff.each(this._a,function(m){var p=null,r=null;Bluff.each(m[this.klass.DATA_VALUES_INDEX],function(c,d){if(c===undefined)return;var f=d*Math.PI*2/this._5,g=c*this._u,h=this._v+Math.sin(f)*g,i=this._w-Math.cos(f)*g,j=(d+1<m[this.klass.DATA_VALUES_INDEX].length)?d+1:0,k=j*Math.PI*2/this._5,l=m[this.klass.DATA_VALUES_INDEX][j]*this._u,o=this._v+Math.sin(k)*l,n=this._w-Math.cos(k)*l;this._0.stroke=m[this.klass.DATA_COLOR_INDEX];this._0.fill=m[this.klass.DATA_COLOR_INDEX];this._0.line(h,i,o,n);if(!this.hide_dots)this._0.circle(h,i,h-s,i)},this)},this)},_Y:function(){if(this.hide_line_markers)return;this._u=this._4/2.0;this._v=this._1+(this._6/2.0);this._w=this._7+(this._4/2.0)-10;var c,d;for(var f=0,g=this._5;f<g;f++){c=f*Math.PI*2/this._5;this._0.stroke=this.marker_color;this._0.stroke_width=1;this._0.line(this._v,this._w,this._v+Math.sin(c)*this._u,this._w-Math.cos(c)*this._u);d=labels[f]?labels[f]:'000';this._d(this._v,this._w,c*360/(2*Math.PI),this._u,d)}},_d:function(c,d,f,g,h){var i=1.1,j=c,k=d,l=f*Math.PI/180,o=j+(g*i*Math.sin(l)),n=k-(g*i*Math.cos(l));this._0.fill=this.marker_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._f(20);this._0.stroke='transparent';this._0.font_weight='bold';var m=l/(2*Math.PI);switch(true){case m>=0.96||m<0.04:this._0.gravity='south';break;case m>=0.04&&m<0.21:this._0.gravity='west';break;case m>=0.21&&m<0.29:this._0.gravity='west';break;case m>=0.29&&m<0.46:this._0.gravity='west';break;case m>=0.46&&m<0.54:this._0.gravity='north';break;case m>=0.54&&m<0.71:this._0.gravity='east';break;case m>=0.71&&m<0.79:this._0.gravity='east';break;case m>=0.79&&m<0.96:this._0.gravity='east';break}this._0.annotate_scaled(0,0,o,n,h,this._c)}});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.0},draw:function(){this.hide_line_markers=true;this.callSuper();if(!this._9)return;var i=this._4,j=(Math.min(this._6,this._4)/2)*0.8,k=this._1+(this._6-i)/2,l=this._1+(this._6/2),o=this._7+(this._4/2)-10,n=this._1E(),m=this.zero_degree,p=this.klass.DATA_VALUES_INDEX;if(this.sort)this._2.sort(function(a,b){return a[p][0]-b[p][0]});Bluff.each(this._2,function(c,d){if(c[this.klass.DATA_VALUES_INDEX][0]>0){this._0.fill=c[this.klass.DATA_COLOR_INDEX];var f=(c[this.klass.DATA_VALUES_INDEX][0]/n)*360;this._0.circle(l,o,l+j,o,m,m+f+0.5);var g=m+((m+f)-m)/2;var h=Math.round((c[this.klass.DATA_VALUES_INDEX][0]/n)*100.0)+'%';this._d(l,o,g,j+(j*this.klass.TEXT_OFFSET_PERCENTAGE),h);m+=f}},this)},_d:function(c,d,f,g,h){var i=20.0,j=c,k=d,l=g+i,o=l*0.15,n=j+((l+o)*Math.cos(f*Math.PI/180)),m=k+(l*Math.sin(f*Math.PI/180));this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._f(this.marker_font_size);this._0.font_weight='bold';this._0.gravity='center';this._0.annotate_scaled(0,0,n,m,h,this._c)},_1E:function(){var d=0;Bluff.each(this._2,function(c){d+=c[this.klass.DATA_VALUES_INDEX][0]},this);return d}});Bluff.SideBar=new JS.Class(Bluff.Base,{draw:function(){this.has_left_labels=true;this.callSuper();if(!this._9)return;var p=0.9;this._E=this._4/this._5;this._8=this._E*p/this._a.length;this._0.stroke_opacity=0.0;var r=[],s=this._5;while(s--)r[s]=0;var q=[],u=this._5;while(u--)q[u]=this._1;var t=(this._E*(1-p))/2;Bluff.each(this._a,function(n,m){Bluff.each(n[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._6-c*this._6-r[d]),g=this._1+this._6-r[d],h=g-f,i=q[d]-1,j=this._7+(this._E*d)+(this._8*m)+t,k=i+h,l=j+this._8;r[d]+=(c*this._6);this._0.stroke='transparent';this._0.fill=n[this.klass.DATA_COLOR_INDEX];this._0.rectangle(i,j,k,l);var o=this._7+(this._E*d+this._E/2)+t;this._d(o,d)},this)},this)},_Y:function(){if(this.hide_line_markers)return;this._0.stroke_width=1;var c=5;var d=this._1c(this.maximum_value/c),f,g,h,i;for(var j=0;j<=c;j++){f=(this._o-this._1)/c;g=this._o-(f*j)-1;h=j-c;i=Math.abs(h)*d;this._0.stroke=this.marker_color;this._0.line(g,this._i,g,this._7);if(!this.hide_line_numbers){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.pointsize=this._f(this.marker_font_size);this._0.gravity='center';this._0.annotate_scaled(0,0,g,this._i+(this.klass.LABEL_MARGIN*2.0),i,this._c)}}},_d:function(c,d){if(this.labels[d]&&!this._y[d]){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.font_weight='normal';this._0.pointsize=this._f(this.marker_font_size);this._0.gravity='east';this._0.annotate_scaled(1,1,this._1-this.klass.LABEL_MARGIN*2.0,c,this.labels[d],this._c);this._y[d]=true}}});Bluff.Spider=new JS.Class(Bluff.Base,{hide_text:null,hide_axes:null,transparent_background:null,initialize:function(c,d,f){this.callSuper(c,f);this._1F=d;this.hide_legend=true},draw:function(){this.hide_line_markers=true;this.callSuper();if(!this._9)return;var c=this._4,d=this._4/2.0,f=this._1+(this._6-c)/2.0,g=this._1+(this._6/2.0),h=this._7+(this._4/2.0)-25;this._1G=d/this._1F;var i=this._1H(),j=0.0,k=(2*Math.PI)/this._2.length,l=0.0;if(!this.hide_axes)this._1I(g,h,d,k);this._1J(g,h,k)},_1f:function(c){return c*this._1G},_d:function(c,d,f,g,h){var i=50,j=c,k=d+0,l=j+((g+i)*Math.cos(f)),o=k+((g+i)*Math.sin(f));this._0.fill=this.marker_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._f(this.legend_font_size);this._0.stroke='transparent';this._0.font_weight='bold';this._0.gravity='center';this._0.annotate_scaled(0,0,l,o,h,this._c)},_1I:function(g,h,i,j,k){if(this.hide_axes)return;var l=0.0;Bluff.each(this._2,function(c){this._0.stroke=k||c[this.klass.DATA_COLOR_INDEX];this._0.stroke_width=5.0;var d=i*Math.cos(l);var f=i*Math.sin(l);this._0.line(g,h,g+d,h+f);if(!this.hide_text)this._d(g,h,l,i,c[this.klass.DATA_LABEL_INDEX]);l+=j},this)},_1J:function(d,f,g,h){var i=[],j=0.0;Bluff.each(this._2,function(c){i.push(d+this._1f(c[this.klass.DATA_VALUES_INDEX][0])*Math.cos(j));i.push(f+this._1f(c[this.klass.DATA_VALUES_INDEX][0])*Math.sin(j));j+=g},this);this._0.stroke_width=1.0;this._0.stroke=h||this.marker_color;this._0.fill=h||this.marker_color;this._0.fill_opacity=0.4;this._0.polyline(i)},_1H:function(){var d=0.0;Bluff.each(this._2,function(c){d+=c[this.klass.DATA_VALUES_INDEX][0]},this);return d}});Bluff.Base.StackedMixin=new JS.Module({_11:function(){var g={};Bluff.each(this._2,function(f){Bluff.each(f[this.klass.DATA_VALUES_INDEX],function(c,d){if(!g[d])g[d]=0.0;g[d]+=c},this)},this);for(var h in g){if(g[h]>this.maximum_value)this.maximum_value=g[h]}this.minimum_value=0}});Bluff.StackedArea=new JS.Class(Bluff.Base,{include:Bluff.Base.StackedMixin,last_series_goes_on_bottom:null,draw:function(){this._11();this.callSuper();if(!this._9)return;this._N=this._6/(this._5-1);this._0.stroke='transparent';var o=[],n=this._5;while(n--)o.push(0);var m=null;var p=this.last_series_goes_on_bottom?'reverse_each':'each';Bluff[p](this._a,function(h){var i=m;m=[];Bluff.each(h[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._N*d);var g=this._7+(this._4-c*this._4-o[d]);o[d]+=(c*this._4);m.push(f);m.push(g);this._d(f,d)},this);var j,k,l;if(i){j=Bluff.array(m);for(k=i.length/2-1;k>=0;k--){j.push(i[2*k]);j.push(i[2*k+1])}j.push(m[0]);j.push(m[1])}else{j=Bluff.array(m);j.push(this._o);j.push(this._i-1);j.push(this._1);j.push(this._i-1);j.push(m[0]);j.push(m[1])}this._0.fill=h[this.klass.DATA_COLOR_INDEX];this._0.polyline(j)},this)}});Bluff.StackedBar=new JS.Class(Bluff.Base,{include:Bluff.Base.StackedMixin,draw:function(){this._11();this.callSuper();if(!this._9)return;var o=0.9;this._8=this._6/this._5;var n=(this._8*(1-o))/2;var m=[],p=this._5;while(p--)m.push(0);Bluff.each(this._a,function(k,l){Bluff.each(k[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._8*d)+(this._8*o/2.0)+n;this._d(f,d);if(c==0)return;var g=this._1+(this._8*d)+n;var h=this._7+(this._4-c*this._4-m[d])+1;var i=g+this._8*o;var j=this._7+this._4-m[d]-1;m[d]+=(c*this._4);this._0.fill=k[this.klass.DATA_COLOR_INDEX];this._0.rectangle(g,h,i,j)},this)},this)}});Bluff.AccumulatorBar=new JS.Class(Bluff.StackedBar,{draw:function(){if(this._2.length!=1)throw'Incorrect number of datasets exception';var g=[];var h=0;var i=[];Bluff.each(this._2[0][this.klass.DATA_VALUES_INDEX],function(d){var f=-Infinity;Bluff.each(i,function(c){f=Math.max(f,c)});i.push((h>0)?(d+f):d);g.push(i[h]-d);h+=1},this);this.data("Accumulator",g);this.callSuper()}});Bluff.SideStackedBar=new JS.Class(Bluff.SideBar,{include:Bluff.Base.StackedMixin,draw:function(){this.has_left_labels=true;this._11();this.callSuper();if(!this._9)return;var p=0.9;this._8=this._4/this._5;var r=[],s=this._5,q=[],u=this._5,t=(this._8*(1-p))/2;while(s--)r.push(0);while(u--)q.push(this._1);Bluff.each(this._a,function(n,m){this._0.fill=n[this.klass.DATA_COLOR_INDEX];Bluff.each(n[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._6-c*this._6-r[d])+1;var g=this._1+this._6-r[d]-1;var h=g-f;var i=q[d],j=this._7+(this._8*d)+t,k=i+h,l=j+this._8*p;q[d]+=h;r[d]+=(c*this._6-2);this._0.rectangle(i,j,k,l);var o=this._7+(this._8*d)+(this._8*p/2.0)+t;this._d(o,d)},this)},this)},_16:function(c,d){d=d||0;return this._1e(c,d)>this.maximum_value},_1e:function(d,f){var g=0;Bluff.each(this._2,function(c){g+=c[this.klass.DATA_VALUES_INDEX][f]},this);return g}});Bluff.Mini.Legend=new JS.Module({_12:function(){this._1K=this._J;this._x+=this._2.length*this._D(this._f(this.legend_font_size))*1.7;this._R()},_13:function(){this._t=[];Bluff.each(this._2,function(c){this._t.push(c[this.klass.DATA_LABEL_INDEX])},this);var f=40.0,g=10.0,h=100.0,i=40.0;if(this.font)this._0.font=this.font;this._0.pointsize=this.legend_font_size;var j=h,k=this._1K+i;this._s(function(){this._0.line(0.0,k,this._b,k)});Bluff.each(this._t,function(c,d){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._f(this.legend_font_size);this._0.stroke='transparent';this._0.font_weight='normal';this._0.gravity='west';this._0.annotate_scaled(this._b,1.0,j+(f*1.7),k,this._1L(c),this._c);this._0.stroke='transparent';this._0.fill=this._2[d][this.klass.DATA_COLOR_INDEX];this._0.rectangle(j,k-f/2.0,j+f,k+f/2.0);k+=this._D(this.legend_font_size)*1.7},this);this._l=0},_1L:function(c){var d=String(c);while(this._L(this._f(this.legend_font_size),d)>(this._j-this.legend_left_margin-this.right_margin)&&(d.length>1))d=d.substr(0,d.length-1);return d+(d.length<String(c).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.0;this.minimum_value=0.0;this.legend_font_size=60.0;this._12();this.callSuper();this._13()}});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.0;this.legend_font_size=60.0},draw:function(){this._12();this.callSuper();this._13()}});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.0;this.legend_font_size=50.0},draw:function(){this._12();this.callSuper();this._13()}});Bluff.Renderer=new JS.Class({extend:{WRAPPER_CLASS:'bluff-wrapper',TEXT_CLASS:'bluff-text'},font:'Arial, Helvetica, Verdana, sans-serif',gravity:'north',initialize:function(c){this._p=document.getElementById(c);this._3=this._p.getContext('2d')},scale:function(c,d){this._g=c;this._h=d||c},caps_height:function(c){var d=this._P(c,'X'),f=this._F(d).height;this._Q(d);return f},text_width:function(c,d){var f=this._P(c,d);var g=this._F(f).width;this._Q(f);return g},get_type_metrics:function(c){var d=this._P(this.pointsize,c);var f=this._F(d);this._Q(d);return f},clear:function(c,d){this._p.width=c;this._p.height=d;this._3.clearRect(0,0,c,d);var f=this._1g(),g=f.childNodes,h=g.length;f.style.width=c+'px';f.style.height=d+'px';while(h--){if(g[h]&&g[h].className==this.klass.TEXT_CLASS)this._Q(g[h])}},push:function(){this._3.save()},pop:function(){this._3.restore()},render_gradiated_background:function(c,d,f,g){this.clear(c,d);var h=this._3.createLinearGradient(0,0,0,d);h.addColorStop(0,f);h.addColorStop(1,g);this._3.fillStyle=h;this._3.fillRect(0,0,c,d)},render_solid_background:function(c,d,f){this.clear(c,d);this._3.fillStyle=f;this._3.fillRect(0,0,c,d)},annotate_scaled:function(c,d,f,g,h,i){var j=(c*i)>=1?(c*i):1;var k=(d*i)>=1?(d*i):1;var h=this._P(this.pointsize,h);h.style.color=this.fill;h.style.fontWeight=this.font_weight;h.style.textAlign='center';h.style.left=(this._g*f+this._1M(h,j))+'px';h.style.top=(this._h*g+this._1N(h,k))+'px'},circle:function(c,d,f,g,h,i){var j=Math.sqrt(Math.pow(f-c,2)+Math.pow(g-d,2));this._3.fillStyle=this.fill;this._3.beginPath();var k=(h||0)*Math.PI/180;var l=(i||360)*Math.PI/180;if(h!==undefined&&i!==undefined){this._3.moveTo(this._g*(c+j*Math.cos(l)),this._h*(d+j*Math.sin(l)));this._3.lineTo(this._g*c,this._h*d);this._3.lineTo(this._g*(c+j*Math.cos(k)),this._h*(d+j*Math.sin(k)))}this._3.arc(this._g*c,this._h*d,this._g*j,k,l,false);this._3.fill()},line:function(c,d,f,g){this._3.strokeStyle=this.stroke;this._3.lineWidth=this.stroke_width;this._3.beginPath();this._3.moveTo(this._g*c,this._h*d);this._3.lineTo(this._g*f,this._h*g);this._3.stroke()},polyline:function(c){this._3.fillStyle=this.fill;this._3.globalAlpha=this.fill_opacity||1;try{this._3.strokeStyle=this.stroke}catch(e){}var d=c.shift(),f=c.shift();this._3.beginPath();this._3.moveTo(this._g*d,this._h*f);while(c.length>0){d=c.shift();f=c.shift();this._3.lineTo(this._g*d,this._h*f)}this._3.fill()},rectangle:function(c,d,f,g){var h;if(c>f){h=c;c=f;f=h}if(d>g){h=d;d=g;g=h}try{this._3.fillStyle=this.fill;this._3.fillRect(this._g*c,this._h*d,this._g*(f-c),this._h*(g-d))}catch(e){}try{this._3.strokeStyle=this.stroke;if(this.stroke!='transparent')this._3.strokeRect(this._g*c,this._h*d,this._g*(f-c),this._h*(g-d))}catch(e){}},_1M:function(c,d){var f=this._F(c).width;switch(this.gravity){case'west':return 0;case'east':return d-f;case'north':case'south':case'center':return(d-f)/2}},_1N:function(c,d){var f=this._F(c).height;switch(this.gravity){case'north':return 0;case'south':return d-f;case'west':case'east':case'center':return(d-f)/2}},_1g:function(){var c=this._p.parentNode;if(c.className==this.klass.WRAPPER_CLASS)return c;c=document.createElement('div');c.className=this.klass.WRAPPER_CLASS;c.style.position='relative';c.style.border='none';c.style.padding='0 0 0 0';this._p.parentNode.insertBefore(c,this._p);c.appendChild(this._p);return c},_P:function(c,d){var f=this._1O(d);f.style.fontFamily=this.font;f.style.fontSize=(typeof c=='number')?c+'px':c;return f},_1O:function(c){var d=document.createElement('div');d.className=this.klass.TEXT_CLASS;d.style.position='absolute';d.appendChild(document.createTextNode(c));this._1g().appendChild(d);return d},_Q:function(c){c.parentNode.removeChild(c)},_F:function(c){var d=c.style.display;return(d&&d!='none')?{width:c.offsetWidth,height:c.offsetHeight}:{width:c.clientWidth,height:c.clientHeight}}});Bluff.TableReader=new JS.Class({NUMBER_FORMAT:/\-?(0|[1-9]\d*)(\.\d+)?(e[\+\-]?\d+)?/i,initialize:function(c,d){this._1P=(typeof c=='string')?document.getElementById(c):c;this._1h=!!d},get_data:function(){if(!this._2)this._1i();return this._2},get_labels:function(){if(!this._14)this._1i();return this._14},get_title:function(){return this._1Q},get_series:function(c){if(this._2[c])return this._2[c];return this._2[c]={points:[]}},_1i:function(){this._G=this._m=0;this._H=this._I=0;this._2=[];this._14={};this._q=[];this._r=[];this._1j(this._1P);if((this._q.length>1&&this._r.length==1)||this._q.length<this._r.length){if(!this._1h)this._1k()}else{if(this._1h)this._1k()}Bluff.each(this._r,function(c,d){this.get_series(d-this._I).name=c},this);Bluff.each(this._q,function(c,d){this._14[d-this._H]=c},this)},_1j:function(c){this._1R(c);var d,f=c.childNodes,g=f.length;for(d=0;d<g;d++)this._1j(f[d])},_1R:function(c){if(!c.tagName)return;var d=this._1S(c.innerHTML),f,g;switch(c.tagName.toUpperCase()){case'TR':if(!this._9)this._H=this._G;this._G+=1;this._m=0;break;case'TD':if(!this._9)this._I=this._m;this._m+=1;d=parseFloat(d.match(this.NUMBER_FORMAT)[0]);if(typeof d=='number'){this._9=true;f=this._m-this._I-1;g=this._G-this._H-1;this.get_series(f).points[g]=parseFloat(d)}break;case'TH':this._m+=1;if(this._m==1&&this._G==1)this._q[0]=this._r[0]=d;else if(c.scope=="row"||this._m==1)this._q[this._G-1]=d;else this._r[this._m-1]=d;break;case'CAPTION':this._1Q=d;break}},_1k:function(){var h=this._2,i;this._2=[];Bluff.each(h,function(f,g){Bluff.each(f.points,function(c,d){this.get_series(d).points[g]=c},this)},this);i=this._q;this._q=this._r;this._r=i;i=this._H;this._H=this._I;this._I=i},_1S:function(c){return c.replace(/<\/?[^>]+>/gi,'')},extend:{Mixin:new JS.Module({data_from_table:function(d,f){var g=new Bluff.TableReader(d,f),h=g.get_data();Bluff.each(h,function(c){this.data(c.name,c.points)},this);this.labels=g.get_labels();this.title=g.get_title()||this.title}})}});Bluff.Base.include(Bluff.TableReader.Mixin);
@@ -0,0 +1,19 @@
1
+ if(!window.CanvasRenderingContext2D){(function(){var I=Math,i=I.round,L=I.sin,M=I.cos,m=10,A=m/2,Q={init:function(a){var b=a||document;if(/MSIE/.test(navigator.userAgent)&&!window.opera){var c=this;b.attachEvent("onreadystatechange",function(){c.r(b)})}},r:function(a){if(a.readyState=="complete"){if(!a.namespaces["s"]){a.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml")}var b=a.createStyleSheet();b.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}";
2
+ var c=a.getElementsByTagName("canvas");for(var d=0;d<c.length;d++){if(!c[d].getContext){this.initElement(c[d])}}}},q:function(a){var b=a.outerHTML,c=a.ownerDocument.createElement(b);if(b.slice(-2)!="/>"){var d="/"+a.tagName,e;while((e=a.nextSibling)&&e.tagName!=d){e.removeNode()}if(e){e.removeNode()}}a.parentNode.replaceChild(c,a);return c},initElement:function(a){a=this.q(a);a.getContext=function(){if(this.l){return this.l}return this.l=new K(this)};a.attachEvent("onpropertychange",V);a.attachEvent("onresize",
3
+ W);var b=a.attributes;if(b.width&&b.width.specified){a.style.width=b.width.nodeValue+"px"}else{a.width=a.clientWidth}if(b.height&&b.height.specified){a.style.height=b.height.nodeValue+"px"}else{a.height=a.clientHeight}return a}};function V(a){var b=a.srcElement;switch(a.propertyName){case "width":b.style.width=b.attributes.width.nodeValue+"px";b.getContext().clearRect();break;case "height":b.style.height=b.attributes.height.nodeValue+"px";b.getContext().clearRect();break}}function W(a){var b=a.srcElement;
4
+ if(b.firstChild){b.firstChild.style.width=b.clientWidth+"px";b.firstChild.style.height=b.clientHeight+"px"}}Q.init();var R=[];for(var E=0;E<16;E++){for(var F=0;F<16;F++){R[E*16+F]=E.toString(16)+F.toString(16)}}function J(){return[[1,0,0],[0,1,0],[0,0,1]]}function G(a,b){var c=J();for(var d=0;d<3;d++){for(var e=0;e<3;e++){var g=0;for(var h=0;h<3;h++){g+=a[d][h]*b[h][e]}c[d][e]=g}}return c}function N(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=
5
+ a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX=a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.d=a.d;b.e=a.e}function O(a){var b,c=1;a=String(a);if(a.substring(0,3)=="rgb"){var d=a.indexOf("(",3),e=a.indexOf(")",d+1),g=a.substring(d+1,e).split(",");b="#";for(var h=0;h<3;h++){b+=R[Number(g[h])]}if(g.length==4&&a.substr(3,1)=="a"){c=g[3]}}else{b=a}return[b,c]}function S(a){switch(a){case "butt":return"flat";case "round":return"round";
6
+ case "square":default:return"square"}}function K(a){this.a=J();this.m=[];this.k=[];this.c=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=m*1;this.globalAlpha=1;this.canvas=a;var b=a.ownerDocument.createElement("div");b.style.width=a.clientWidth+"px";b.style.height=a.clientHeight+"px";b.style.overflow="hidden";b.style.position="absolute";a.appendChild(b);this.j=b;this.d=1;this.e=1}var j=K.prototype;j.clearRect=function(){this.j.innerHTML=
7
+ "";this.c=[]};j.beginPath=function(){this.c=[]};j.moveTo=function(a,b){this.c.push({type:"moveTo",x:a,y:b});this.f=a;this.g=b};j.lineTo=function(a,b){this.c.push({type:"lineTo",x:a,y:b});this.f=a;this.g=b};j.bezierCurveTo=function(a,b,c,d,e,g){this.c.push({type:"bezierCurveTo",cp1x:a,cp1y:b,cp2x:c,cp2y:d,x:e,y:g});this.f=e;this.g=g};j.quadraticCurveTo=function(a,b,c,d){var e=this.f+0.6666666666666666*(a-this.f),g=this.g+0.6666666666666666*(b-this.g),h=e+(c-this.f)/3,l=g+(d-this.g)/3;this.bezierCurveTo(e,
8
+ g,h,l,c,d)};j.arc=function(a,b,c,d,e,g){c*=m;var h=g?"at":"wa",l=a+M(d)*c-A,n=b+L(d)*c-A,o=a+M(e)*c-A,f=b+L(e)*c-A;if(l==o&&!g){l+=0.125}this.c.push({type:h,x:a,y:b,radius:c,xStart:l,yStart:n,xEnd:o,yEnd:f})};j.rect=function(a,b,c,d){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+d);this.lineTo(a,b+d);this.closePath()};j.strokeRect=function(a,b,c,d){this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+d);this.lineTo(a,b+d);this.closePath();this.stroke()};j.fillRect=function(a,
9
+ b,c,d){this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+d);this.lineTo(a,b+d);this.closePath();this.fill()};j.createLinearGradient=function(a,b,c,d){var e=new H("gradient");return e};j.createRadialGradient=function(a,b,c,d,e,g){var h=new H("gradientradial");h.n=c;h.o=g;h.i.x=a;h.i.y=b;return h};j.drawImage=function(a,b){var c,d,e,g,h,l,n,o,f=a.runtimeStyle.width,k=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var q=a.width,r=a.height;a.runtimeStyle.width=
10
+ f;a.runtimeStyle.height=k;if(arguments.length==3){c=arguments[1];d=arguments[2];h=(l=0);n=(e=q);o=(g=r)}else if(arguments.length==5){c=arguments[1];d=arguments[2];e=arguments[3];g=arguments[4];h=(l=0);n=q;o=r}else if(arguments.length==9){h=arguments[1];l=arguments[2];n=arguments[3];o=arguments[4];c=arguments[5];d=arguments[6];e=arguments[7];g=arguments[8]}else{throw"Invalid number of arguments";}var s=this.b(c,d),t=[],v=10,w=10;t.push(" <g_vml_:group",' coordsize="',m*v,",",m*w,'"',' coordorigin="0,0"',
11
+ ' style="width:',v,";height:",w,";position:absolute;");if(this.a[0][0]!=1||this.a[0][1]){var x=[];x.push("M11='",this.a[0][0],"',","M12='",this.a[1][0],"',","M21='",this.a[0][1],"',","M22='",this.a[1][1],"',","Dx='",i(s.x/m),"',","Dy='",i(s.y/m),"'");var p=s,y=this.b(c+e,d),z=this.b(c,d+g),B=this.b(c+e,d+g);p.x=Math.max(p.x,y.x,z.x,B.x);p.y=Math.max(p.y,y.y,z.y,B.y);t.push("padding:0 ",i(p.x/m),"px ",i(p.y/m),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",x.join(""),", sizingmethod='clip');")}else{t.push("top:",
12
+ i(s.y/m),"px;left:",i(s.x/m),"px;")}t.push(' ">','<g_vml_:image src="',a.src,'"',' style="width:',m*e,";"," height:",m*g,';"',' cropleft="',h/q,'"',' croptop="',l/r,'"',' cropright="',(q-h-n)/q,'"',' cropbottom="',(r-l-o)/r,'"'," />","</g_vml_:group>");this.j.insertAdjacentHTML("BeforeEnd",t.join(""))};j.stroke=function(a){var b=[],c=O(a?this.fillStyle:this.strokeStyle),d=c[0],e=c[1]*this.globalAlpha,g=10,h=10;b.push("<g_vml_:shape",' fillcolor="',d,'"',' filled="',Boolean(a),'"',' style="position:absolute;width:',
13
+ g,";height:",h,';"',' coordorigin="0 0" coordsize="',m*g," ",m*h,'"',' stroked="',!a,'"',' strokeweight="',this.lineWidth,'"',' strokecolor="',d,'"',' path="');var l={x:null,y:null},n={x:null,y:null};for(var o=0;o<this.c.length;o++){var f=this.c[o];if(f.type=="moveTo"){b.push(" m ");var k=this.b(f.x,f.y);b.push(i(k.x),",",i(k.y))}else if(f.type=="lineTo"){b.push(" l ");var k=this.b(f.x,f.y);b.push(i(k.x),",",i(k.y))}else if(f.type=="close"){b.push(" x ")}else if(f.type=="bezierCurveTo"){b.push(" c ");
14
+ var k=this.b(f.x,f.y),q=this.b(f.cp1x,f.cp1y),r=this.b(f.cp2x,f.cp2y);b.push(i(q.x),",",i(q.y),",",i(r.x),",",i(r.y),",",i(k.x),",",i(k.y))}else if(f.type=="at"||f.type=="wa"){b.push(" ",f.type," ");var k=this.b(f.x,f.y),s=this.b(f.xStart,f.yStart),t=this.b(f.xEnd,f.yEnd);b.push(i(k.x-this.d*f.radius),",",i(k.y-this.e*f.radius)," ",i(k.x+this.d*f.radius),",",i(k.y+this.e*f.radius)," ",i(s.x),",",i(s.y)," ",i(t.x),",",i(t.y))}if(k){if(l.x==null||k.x<l.x){l.x=k.x}if(n.x==null||k.x>n.x){n.x=k.x}if(l.y==
15
+ null||k.y<l.y){l.y=k.y}if(n.y==null||k.y>n.y){n.y=k.y}}}b.push(' ">');if(typeof this.fillStyle=="object"){var v={x:"50%",y:"50%"},w=n.x-l.x,x=n.y-l.y,p=w>x?w:x;v.x=i(this.fillStyle.i.x/w*100+50)+"%";v.y=i(this.fillStyle.i.y/x*100+50)+"%";var y=[];if(this.fillStyle.p=="gradientradial"){var z=this.fillStyle.n/p*100,B=this.fillStyle.o/p*100-z}else{var z=0,B=100}var C={offset:null,color:null},D={offset:null,color:null};this.fillStyle.h.sort(function(T,U){return T.offset-U.offset});for(var o=0;o<this.fillStyle.h.length;o++){var u=
16
+ this.fillStyle.h[o];y.push(u.offset*B+z,"% ",u.color,",");if(u.offset>C.offset||C.offset==null){C.offset=u.offset;C.color=u.color}if(u.offset<D.offset||D.offset==null){D.offset=u.offset;D.color=u.color}}y.pop();b.push("<g_vml_:fill",' color="',D.color,'"',' color2="',C.color,'"',' type="',this.fillStyle.p,'"',' focusposition="',v.x,", ",v.y,'"',' colors="',y.join(""),'"',' opacity="',e,'" />')}else if(a){b.push('<g_vml_:fill color="',d,'" opacity="',e,'" />')}else{b.push("<g_vml_:stroke",' opacity="',
17
+ e,'"',' joinstyle="',this.lineJoin,'"',' miterlimit="',this.miterLimit,'"',' endcap="',S(this.lineCap),'"',' weight="',this.lineWidth,'px"',' color="',d,'" />')}b.push("</g_vml_:shape>");this.j.insertAdjacentHTML("beforeEnd",b.join(""));this.c=[]};j.fill=function(){this.stroke(true)};j.closePath=function(){this.c.push({type:"close"})};j.b=function(a,b){return{x:m*(a*this.a[0][0]+b*this.a[1][0]+this.a[2][0])-A,y:m*(a*this.a[0][1]+b*this.a[1][1]+this.a[2][1])-A}};j.save=function(){var a={};N(this,a);
18
+ this.k.push(a);this.m.push(this.a);this.a=G(J(),this.a)};j.restore=function(){N(this.k.pop(),this);this.a=this.m.pop()};j.translate=function(a,b){var c=[[1,0,0],[0,1,0],[a,b,1]];this.a=G(c,this.a)};j.rotate=function(a){var b=M(a),c=L(a),d=[[b,c,0],[-c,b,0],[0,0,1]];this.a=G(d,this.a)};j.scale=function(a,b){this.d*=a;this.e*=b;var c=[[a,0,0],[0,b,0],[0,0,1]];this.a=G(c,this.a)};j.clip=function(){};j.arcTo=function(){};j.createPattern=function(){return new P};function H(a){this.p=a;this.n=0;this.o=
19
+ 0;this.h=[];this.i={x:0,y:0}}H.prototype.addColorStop=function(a,b){b=O(b);this.h.push({offset:1-a,color:b})};function P(){}G_vmlCanvasManager=Q;CanvasRenderingContext2D=K;CanvasGradient=H;CanvasPattern=P})()};
@@ -0,0 +1 @@
1
+ JS={extend:function(a,b){b=b||{};for(var c in b){if(a[c]===b[c])continue;a[c]=b[c]}return a},makeFunction:function(){return function(){return this.initialize?(this.initialize.apply(this,arguments)||this):this}},makeBridge:function(a){var b=function(){};b.prototype=a.prototype;return new b},delegate:function(a,b){return function(){return this[a][b].apply(this[a],arguments)}},bind:function(){var a=JS.array(arguments),b=a.shift(),c=a.shift()||null;return function(){return b.apply(c,a.concat(JS.array(arguments)))}},callsSuper:function(a){return a.SUPER===undefined?a.SUPER=/\bcallSuper\b/.test(a.toString()):a.SUPER},mask:function(a){var b=a.toString().replace(/callSuper/g,'super');a.toString=function(){return b};return a},array:function(a){if(!a)return[];if(a.toArray)return a.toArray();var b=a.length,c=[];while(b--)c[b]=a[b];return c},indexOf:function(a,b){for(var c=0,d=a.length;c<d;c++){if(a[c]===b)return c}return-1},isFn:function(a){return a instanceof Function},ignore:function(a,b){return/^(include|extend)$/.test(a)&&typeof b==='object'}};JS.Module=JS.makeFunction();JS.extend(JS.Module.prototype,{initialize:function(a,b){b=b||{};this.__mod__=this;this.__inc__=[];this.__fns__={};this.__dep__=[];this.__res__=b._1||null;this.include(a||{})},define:function(a,b,c){c=c||{};this.__fns__[a]=b;if(JS.Module._0&&c._0&&JS.isFn(b))JS.Module._0(a,c._0);var d=this.__dep__.length;while(d--)this.__dep__[d].resolve()},instanceMethod:function(a){var b=this.lookup(a).pop();return JS.isFn(b)?b:null},include:function(a,b,c){if(!a)return c&&this.resolve();b=b||{};var d=a.include,f=a.extend,e,g,j,h,i=b._4||this;if(a.__inc__&&a.__fns__){this.__inc__.push(a);a.__dep__.push(this);if(b._2)a.extended&&a.extended(b._2);else a.included&&a.included(i)}else{if(b._5){for(h in a){if(JS.ignore(h,a[h]))continue;this.define(h,a[h],{_0:i||b._2||this})}}else{if(typeof d==='object'){e=[].concat(d);for(g=0,j=e.length;g<j;g++)i.include(e[g],b)}if(typeof f==='object'){e=[].concat(f);for(g=0,j=e.length;g<j;g++)i.extend(e[g],false);i.extend()}b._5=true;return i.include(a,b,c)}}c&&this.resolve()},includes:function(a){if(Object===a||this===a||this.__res__===a.prototype)return true;var b=this.__inc__.length;while(b--){if(this.__inc__[b].includes(a))return true}return false},ancestors:function(a){a=a||[];for(var b=0,c=this.__inc__.length;b<c;b++)this.__inc__[b].ancestors(a);var d=(this.__res__||{}).klass,f=(d&&this.__res__===d.prototype)?d:this;if(JS.indexOf(a,f)===-1)a.push(f);return a},lookup:function(a){var b=this.ancestors(),c=[],d,f,e;for(d=0,f=b.length;d<f;d++){e=b[d].__mod__.__fns__[a];if(e)c.push(e)}return c},make:function(a,b){if(!JS.isFn(b)||!JS.callsSuper(b))return b;var c=this;return function(){return c.chain(this,a,arguments)}},chain:JS.mask(function(c,d,f){var e=this.lookup(d),g=e.length-1,j=c.callSuper,h=JS.array(f),i;c.callSuper=function(){var a=arguments.length;while(a--)h[a]=arguments[a];g-=1;var b=e[g].apply(c,h);g+=1;return b};i=e.pop().apply(c,h);j?c.callSuper=j:delete c.callSuper;return i}),resolve:function(a){var a=a||this,b=a.__res__,c,d,f,e;if(a===this){c=this.__dep__.length;while(c--)this.__dep__[c].resolve()}if(!b)return;for(c=0,d=this.__inc__.length;c<d;c++)this.__inc__[c].resolve(a);for(f in this.__fns__){e=a.make(f,this.__fns__[f]);if(b[f]!==e)b[f]=e}}});JS.ObjectMethods=new JS.Module({__eigen__:function(){if(this.__meta__)return this.__meta__;var a=this.__meta__=new JS.Module({},{_1:this});a.include(this.klass.__mod__);return a},extend:function(a,b){return this.__eigen__().include(a,{_2:this},b!==false)},isA:function(a){return this.__eigen__().includes(a)},method:function(a){var b=this,c=b.__mcache__=b.__mcache__||{};if((c[a]||{}).fn===b[a])return c[a].bd;return(c[a]={fn:b[a],bd:JS.bind(b[a],b)}).bd}});JS.Class=JS.makeFunction();JS.extend(JS.Class.prototype=JS.makeBridge(JS.Module),{initialize:function(a,b){var c=JS.extend(JS.makeFunction(),this);c.klass=c.constructor=this.klass;if(!JS.isFn(a)){b=a;a=Object}c.inherit(a);c.include(b,null,false);c.resolve();do{a.inherited&&a.inherited(c)}while(a=a.superclass);return c},inherit:function(a){this.superclass=a;if(this.__eigen__){this.__eigen__().include(a.__eigen__?a.__eigen__():new JS.Module(a.prototype));this.__meta__.resolve()}this.subclasses=[];(a.subclasses||[]).push(this);var b=this.prototype=JS.makeBridge(a);b.klass=b.constructor=this;this.__mod__=new JS.Module({},{_1:this.prototype});this.include(JS.ObjectMethods,null,false);if(a!==Object)this.include(a.__mod__||new JS.Module(a.prototype,{_1:a.prototype}),null,false)},include:function(a,b,c){if(!a)return;var d=this.__mod__,b=b||{};b._4=this;return d.include(a,b,c!==false)},extend:function(a){if(!this.callSuper)return;this.callSuper();var b=this.subclasses.length;while(b--)this.subclasses[b].extend()},define:function(){var a=this.__mod__;a.define.apply(a,arguments);a.resolve()},includes:JS.delegate('__mod__','includes'),ancestors:JS.delegate('__mod__','ancestors'),resolve:JS.delegate('__mod__','resolve')});JS.Module=JS.extend(new JS.Class(JS.Module.prototype),JS.ObjectMethods.__fns__);JS.Module.include(JS.ObjectMethods);JS.Class=JS.extend(new JS.Class(JS.Module,JS.Class.prototype),JS.ObjectMethods.__fns__);JS.Module.klass=JS.Module.constructor=JS.Class.klass=JS.Class.constructor=JS.Class;JS.Module.extend({_3:[],methodAdded:function(a,b){this._3.push([a,b])},_0:function(a,b){var c=this._3,d=c.length;while(d--)c[d][0].call(c[d][1]||null,a,b)}});JS.extend(JS,{Interface:new JS.Class({initialize:function(d){this.test=function(a,b){var c=d.length;while(c--){if(!JS.isFn(a[d[c]]))return b?d[c]:false}return true}},extend:{ensure:function(){var a=JS.array(arguments),b=a.shift(),c,d;while(c=a.shift()){d=c.test(b,true);if(d!==true)throw new Error('object does not implement '+d+'()');}}}}),Singleton:new JS.Class({initialize:function(a,b){return new(new JS.Class(a,b))}})});
@@ -0,0 +1,31 @@
1
+ <html>
2
+ <head>
3
+ <title>Source Control Churn Results</title>
4
+ <style>
5
+ <%= inline_css("default.css") %>
6
+ </style>
7
+ </head>
8
+
9
+ <body>
10
+ <h1>Source Control Churn Results</h1>
11
+ <a href="index.html">back to menu</a>
12
+ <p>Files that change a lot in your project may be bad a sign.
13
+ This task uses your source control log to identify those files.
14
+ </p>
15
+ <table>
16
+ <tr>
17
+ <th>File Path</th>
18
+ <th>Times Changed</th>
19
+ </tr>
20
+ <% count = 0 %>
21
+ <% @churn[:changes].each do |change| %>
22
+ <tr>
23
+ <td><%= change[:file_path] %></td>
24
+ <td><%= change[:times_changed] %></td>
25
+ </tr>
26
+ <% count += 1 %>
27
+ <% end %>
28
+ </table>
29
+ <p>Generated on <%= Time.now.localtime %></p>
30
+ </body>
31
+ </html>