scruffy 0.2.6 → 0.3.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. data/{History.txt → CHANGES.txt} +15 -12
  2. data/README.txt +25 -25
  3. data/lib/scruffy.rb +0 -5
  4. data/lib/scruffy/components.rb +1 -0
  5. data/lib/scruffy/components/axes.rb +23 -0
  6. data/lib/scruffy/components/background.rb +3 -3
  7. data/lib/scruffy/components/base.rb +3 -0
  8. data/lib/scruffy/components/data_markers.rb +23 -8
  9. data/lib/scruffy/components/graphs.rb +4 -0
  10. data/lib/scruffy/components/grid.rb +45 -4
  11. data/lib/scruffy/components/legend.rb +63 -21
  12. data/lib/scruffy/components/title.rb +1 -1
  13. data/lib/scruffy/components/value_markers.rb +9 -16
  14. data/lib/scruffy/formatters.rb +41 -3
  15. data/lib/scruffy/graph.rb +27 -11
  16. data/lib/scruffy/graph_state.rb +5 -0
  17. data/lib/scruffy/helpers.rb +1 -0
  18. data/lib/scruffy/helpers/layer_container.rb +28 -4
  19. data/lib/scruffy/helpers/marker_helper.rb +25 -0
  20. data/lib/scruffy/helpers/point_container.rb +46 -17
  21. data/lib/scruffy/layers.rb +6 -1
  22. data/lib/scruffy/layers/bar.rb +35 -14
  23. data/lib/scruffy/layers/base.rb +51 -21
  24. data/lib/scruffy/layers/box.rb +114 -0
  25. data/lib/scruffy/layers/line.rb +31 -14
  26. data/lib/scruffy/layers/multi.rb +74 -0
  27. data/lib/scruffy/layers/multi_area.rb +119 -0
  28. data/lib/scruffy/layers/multi_bar.rb +51 -0
  29. data/lib/scruffy/layers/scatter.rb +13 -5
  30. data/lib/scruffy/layers/stacked.rb +2 -1
  31. data/lib/scruffy/rasterizers.rb +1 -0
  32. data/lib/scruffy/rasterizers/mini_magick_rasterizer.rb +24 -0
  33. data/lib/scruffy/rasterizers/rmagick_rasterizer.rb +8 -2
  34. data/lib/scruffy/renderers.rb +2 -0
  35. data/lib/scruffy/renderers/axis_legend.rb +41 -0
  36. data/lib/scruffy/renderers/base.rb +6 -4
  37. data/lib/scruffy/renderers/basic.rb +20 -0
  38. data/lib/scruffy/renderers/standard.rb +7 -6
  39. data/lib/scruffy/themes.rb +37 -1
  40. data/lib/scruffy/version.rb +1 -7
  41. data/spec/output/array.svg +55 -0
  42. data/spec/output/hash.svg +55 -0
  43. data/spec/scruffy/graph_spec.rb +4 -4
  44. data/spec/scruffy/layers/base_spec.rb +15 -10
  45. metadata +84 -96
  46. data/CHANGES +0 -104
  47. data/License.txt +0 -20
  48. data/MIT-LICENSE +0 -20
  49. data/Manifest.txt +0 -104
  50. data/PostInstall.txt +0 -6
  51. data/README +0 -9
  52. data/Rakefile +0 -108
  53. data/config/hoe.rb +0 -78
  54. data/config/requirements.rb +0 -15
  55. data/script/console +0 -10
  56. data/script/destroy +0 -14
  57. data/script/generate +0 -14
  58. data/script/txt2html +0 -82
  59. data/setup.rb +0 -1585
  60. data/spec/scruffy/layers/line_spec.rb +0 -10
  61. data/tasks/deployment.rake +0 -34
  62. data/tasks/environment.rake +0 -7
  63. data/tasks/website.rake +0 -17
  64. data/test/graph_creation_test.rb +0 -101
  65. data/test/test_helper.rb +0 -2
  66. data/website/images/blank.gif.html +0 -7
  67. data/website/images/graphs/all_smiles.png +0 -0
  68. data/website/images/graphs/bar_test.png +0 -0
  69. data/website/images/graphs/bar_test.svg +0 -71
  70. data/website/images/graphs/line_test.png +0 -0
  71. data/website/images/graphs/line_test.svg +0 -60
  72. data/website/images/graphs/multi_test.png +0 -0
  73. data/website/images/graphs/multi_test.svg +0 -296
  74. data/website/images/graphs/pie_test.png +0 -0
  75. data/website/images/graphs/pie_test.svg +0 -40
  76. data/website/images/graphs/split_test.png +0 -0
  77. data/website/images/graphs/split_test.svg +0 -295
  78. data/website/images/graphs/stacking_test.png +0 -0
  79. data/website/images/graphs/stacking_test.svg +0 -146
  80. data/website/images/header.png +0 -0
  81. data/website/images/header_gradient.png +0 -0
  82. data/website/images/overlay.png +0 -0
  83. data/website/images/scruffy.png +0 -0
  84. data/website/index.html +0 -225
  85. data/website/index.txt +0 -204
  86. data/website/javascripts/application.js +0 -2
  87. data/website/javascripts/controls.js +0 -815
  88. data/website/javascripts/dragdrop.js +0 -913
  89. data/website/javascripts/effects.js +0 -958
  90. data/website/javascripts/lightbox.js +0 -437
  91. data/website/javascripts/prototype.js +0 -2006
  92. data/website/javascripts/rounded_corners_lite.inc.js +0 -285
  93. data/website/stylesheets/lightbox.css +0 -27
  94. data/website/stylesheets/screen.css +0 -147
  95. data/website/stylesheets/scruffy.css +0 -227
  96. data/website/template.html.erb +0 -47
Binary file
Binary file
Binary file
@@ -1,225 +0,0 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
- <head>
5
- <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
6
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
- <title>
8
-
9
- </title>
10
- <script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
11
- <style>
12
-
13
- </style>
14
- <script type="text/javascript">
15
- window.onload = function() {
16
- settings = {
17
- tl: { radius: 10 },
18
- tr: { radius: 10 },
19
- bl: { radius: 10 },
20
- br: { radius: 10 },
21
- antiAlias: true,
22
- autoPad: true,
23
- validTags: ["div"]
24
- }
25
- var versionBox = new curvyCorners(settings, document.getElementById("version"));
26
- versionBox.applyCornersToAll();
27
- }
28
- </script>
29
- </head>
30
- <body>
31
- <div id="main">
32
-
33
- <h1></h1>
34
- <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/scruffy"; return false'>
35
- <p>Get Version</p>
36
- <a href="http://rubyforge.org/projects/scruffy" class="numbers">0.2.6</a>
37
- </div>
38
- <p><a href="index.html">Home</a><br />
39
- <a href="doc">Documentation</a><br />
40
- <a href="http://rubyforge.org/projects/scruffy/">RubyForge Project</a></p>
41
- <h1>Don&#8217;t Worry.</h1>
42
- <h1>Be Scruffy.</h1>
43
- <blockquote>
44
- <p>Beautiful Graphs for Ruby.</p>
45
- </blockquote>
46
- <h2>What is Scruffy?</h2>
47
- <p>Scruffy is a Ruby library for generating attractive and powerful graphs, useful for web applications, print media and many others.</p>
48
- <p>Scruffy&#8217;s key features include:</p>
49
- <ul>
50
- <li><strong>Built on <span class="caps">SVG</span></strong><br/>
51
- Scruffy uses <span class="caps">SVG</span> internally for rendering graphs. This allows Scruffy to render your graph identically at almost any size.</li>
52
- </ul>
53
- <ul>
54
- <li><strong>Mix-n-Match Graphs</strong><br/>
55
- A Scruffy graph isn&#8217;t limited to a single graph type (line, bar, area, etc). You can specify a different type for every data set.</li>
56
- </ul>
57
- <ul>
58
- <li><strong>Snapshot Rendering</strong><br/>
59
- You can render a Scruffy graph as many times as you want, and change any settings between renders. Data, colors, even the graph size and image type can all be changed for the next render.</li>
60
- </ul>
61
- <ul>
62
- <li><strong>Easily Extendable</strong><br/>
63
- Scruffy is designed to be extremely extendible. Adding new graph types or themes can be done in as little as a few lines of code. If you need more control over your graphs, you can customize the layouts, data generation, almost anything.</li>
64
- </ul>
65
- <h2>Installing</h2>
66
- <p><pre class='syntax'><span class="ident">sudo</span> <span class="ident">gem</span> <span class="ident">install</span> <span class="ident">scruffy</span></pre></p>
67
- <h2>Demonstration of usage</h2>
68
- <h3>Pie Chart<br />
69
- <pre class='syntax'>
70
- <span class="ident">graph</span> <span class="punct">=</span> <span class="constant">Scruffy</span><span class="punct">::</span><span class="constant">Graph</span><span class="punct">.</span><span class="ident">new</span>
71
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">title</span> <span class="punct">=</span> <span class="punct">&quot;</span><span class="string">Favourite Snacks</span><span class="punct">&quot;</span>
72
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">renderer</span> <span class="punct">=</span> <span class="constant">Scruffy</span><span class="punct">::</span><span class="constant">Renderers</span><span class="punct">::</span><span class="constant">Pie</span><span class="punct">.</span><span class="ident">new</span>
73
-
74
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:pie</span><span class="punct">,</span> <span class="punct">'</span><span class="string"></span><span class="punct">',</span> <span class="punct">{</span>
75
- <span class="punct">'</span><span class="string">Apple</span><span class="punct">'</span> <span class="punct">=&gt;</span> <span class="number">20</span><span class="punct">,</span>
76
- <span class="punct">'</span><span class="string">Banana</span><span class="punct">'</span> <span class="punct">=&gt;</span> <span class="number">100</span><span class="punct">,</span>
77
- <span class="punct">'</span><span class="string">Orange</span><span class="punct">'</span> <span class="punct">=&gt;</span> <span class="number">70</span><span class="punct">,</span>
78
- <span class="punct">'</span><span class="string">Taco</span><span class="punct">'</span> <span class="punct">=&gt;</span> <span class="number">30</span>
79
- <span class="punct">}</span>
80
-
81
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">render</span> <span class="symbol">:to</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">pie_test.svg</span><span class="punct">&quot;</span>
82
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">render</span> <span class="symbol">:width</span> <span class="punct">=&gt;</span> <span class="number">300</span><span class="punct">,</span> <span class="symbol">:height</span> <span class="punct">=&gt;</span> <span class="number">200</span><span class="punct">,</span>
83
- <span class="symbol">:to</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">pie_test.png</span><span class="punct">&quot;,</span> <span class="symbol">:as</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">png</span><span class="punct">'</span>
84
- </pre></h3>
85
- <p><img src="images/graphs/pie_test.png" alt="" /></p>
86
- <h3>Line Graph<br />
87
- <pre class='syntax'>
88
- <span class="ident">graph</span> <span class="punct">=</span> <span class="constant">Scruffy</span><span class="punct">::</span><span class="constant">Graph</span><span class="punct">.</span><span class="ident">new</span>
89
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">title</span> <span class="punct">=</span> <span class="punct">&quot;</span><span class="string">Sample Line Graph</span><span class="punct">&quot;</span>
90
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">renderer</span> <span class="punct">=</span> <span class="constant">Scruffy</span><span class="punct">::</span><span class="constant">Renderers</span><span class="punct">::</span><span class="constant">Standard</span><span class="punct">.</span><span class="ident">new</span>
91
-
92
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:line</span><span class="punct">,</span> <span class="punct">'</span><span class="string">Example</span><span class="punct">',</span> <span class="punct">[</span><span class="number">20</span><span class="punct">,</span> <span class="number">100</span><span class="punct">,</span> <span class="number">70</span><span class="punct">,</span> <span class="number">30</span><span class="punct">,</span> <span class="number">106</span><span class="punct">]</span>
93
-
94
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">render</span> <span class="symbol">:to</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">line_test.svg</span><span class="punct">&quot;</span>
95
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">render</span> <span class="symbol">:width</span> <span class="punct">=&gt;</span> <span class="number">300</span><span class="punct">,</span> <span class="symbol">:height</span> <span class="punct">=&gt;</span> <span class="number">200</span><span class="punct">,</span>
96
- <span class="symbol">:to</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">line_test.png</span><span class="punct">&quot;,</span> <span class="symbol">:as</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">png</span><span class="punct">'</span>
97
- </pre></h3>
98
- <p><img src="images/graphs/line_test.png" alt="" /></p>
99
- <h3>Bar Graph<br />
100
- <pre class='syntax'>
101
- <span class="ident">graph</span> <span class="punct">=</span> <span class="constant">Scruffy</span><span class="punct">::</span><span class="constant">Graph</span><span class="punct">.</span><span class="ident">new</span>
102
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">title</span> <span class="punct">=</span> <span class="punct">&quot;</span><span class="string">Sample Line Graph</span><span class="punct">&quot;</span>
103
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">renderer</span> <span class="punct">=</span> <span class="constant">Scruffy</span><span class="punct">::</span><span class="constant">Renderers</span><span class="punct">::</span><span class="constant">Standard</span><span class="punct">.</span><span class="ident">new</span>
104
-
105
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:line</span><span class="punct">,</span> <span class="punct">'</span><span class="string">Example</span><span class="punct">',</span> <span class="punct">[</span><span class="number">20</span><span class="punct">,</span> <span class="number">100</span><span class="punct">,</span> <span class="number">70</span><span class="punct">,</span> <span class="number">30</span><span class="punct">,</span> <span class="number">106</span><span class="punct">]</span>
106
-
107
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">render</span> <span class="symbol">:to</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">line_test.svg</span><span class="punct">&quot;</span>
108
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">render</span> <span class="symbol">:width</span> <span class="punct">=&gt;</span> <span class="number">300</span><span class="punct">,</span> <span class="symbol">:height</span> <span class="punct">=&gt;</span> <span class="number">200</span><span class="punct">,</span>
109
- <span class="symbol">:to</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">line_test.png</span><span class="punct">&quot;,</span> <span class="symbol">:as</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">png</span><span class="punct">'</span>
110
- </pre></h3>
111
- <p><img src="images/graphs/bar_test.png" alt="" /></p>
112
- <h3>Split Graph<br />
113
- <pre class='syntax'>
114
- <span class="ident">graph</span> <span class="punct">=</span> <span class="constant">Scruffy</span><span class="punct">::</span><span class="constant">Graph</span><span class="punct">.</span><span class="ident">new</span>
115
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">title</span> <span class="punct">=</span> <span class="punct">&quot;</span><span class="string">Long-term Comparisons</span><span class="punct">&quot;</span>
116
-
117
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">value_formatter</span> <span class="punct">=</span> <span class="constant">Scruffy</span><span class="punct">::</span><span class="constant">Formatters</span><span class="punct">::</span><span class="constant">Currency</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span>
118
- <span class="symbol">:special_negatives</span> <span class="punct">=&gt;</span> <span class="constant">true</span><span class="punct">,</span> <span class="symbol">:negative_color</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">#ff7777</span><span class="punct">')</span>
119
-
120
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">renderer</span> <span class="punct">=</span> <span class="constant">Scruffy</span><span class="punct">::</span><span class="constant">Renderers</span><span class="punct">::</span><span class="constant">Split</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span>
121
- <span class="symbol">:split_label</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">Northeastern (Top) / Central (Bottom)</span><span class="punct">')</span>
122
-
123
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:area</span><span class="punct">,</span> <span class="punct">'</span><span class="string">Jeff</span><span class="punct">',</span>
124
- <span class="punct">[</span><span class="number">20</span><span class="punct">,</span> <span class="punct">-</span><span class="number">5</span><span class="punct">,</span> <span class="number">100</span><span class="punct">,</span> <span class="number">70</span><span class="punct">,</span> <span class="number">30</span><span class="punct">,</span> <span class="number">106</span><span class="punct">,</span> <span class="number">203</span><span class="punct">,</span> <span class="number">100</span><span class="punct">,</span> <span class="number">50</span><span class="punct">,</span> <span class="number">203</span><span class="punct">,</span> <span class="number">289</span><span class="punct">,</span> <span class="number">20</span><span class="punct">],</span>
125
- <span class="symbol">:category</span> <span class="punct">=&gt;</span> <span class="symbol">:top</span>
126
-
127
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:area</span><span class="punct">,</span> <span class="punct">'</span><span class="string">Jerry</span><span class="punct">',</span>
128
- <span class="punct">[-</span><span class="number">10</span><span class="punct">,</span> <span class="number">70</span><span class="punct">,</span> <span class="number">20</span><span class="punct">,</span> <span class="number">102</span><span class="punct">,</span> <span class="number">201</span><span class="punct">,</span> <span class="number">26</span><span class="punct">,</span> <span class="number">30</span><span class="punct">,</span> <span class="number">106</span><span class="punct">,</span> <span class="number">203</span><span class="punct">,</span> <span class="number">100</span><span class="punct">,</span> <span class="number">50</span><span class="punct">,</span> <span class="number">39</span><span class="punct">],</span>
129
- <span class="symbol">:category</span> <span class="punct">=&gt;</span> <span class="symbol">:top</span>
130
-
131
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:bar</span><span class="punct">,</span> <span class="punct">'</span><span class="string">Jack</span><span class="punct">',</span>
132
- <span class="punct">[</span><span class="number">30</span><span class="punct">,</span> <span class="number">0</span><span class="punct">,</span> <span class="number">49</span><span class="punct">,</span> <span class="number">29</span><span class="punct">,</span> <span class="number">100</span><span class="punct">,</span> <span class="number">203</span><span class="punct">,</span> <span class="number">70</span><span class="punct">,</span> <span class="number">20</span><span class="punct">,</span> <span class="number">102</span><span class="punct">,</span> <span class="number">201</span><span class="punct">,</span> <span class="number">26</span><span class="punct">,</span> <span class="number">130</span><span class="punct">],</span>
133
- <span class="symbol">:category</span> <span class="punct">=&gt;</span> <span class="symbol">:bottom</span>
134
-
135
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:line</span><span class="punct">,</span> <span class="punct">'</span><span class="string">Brasten</span><span class="punct">',</span>
136
- <span class="punct">[</span><span class="number">42</span><span class="punct">,</span> <span class="number">10</span><span class="punct">,</span> <span class="number">75</span><span class="punct">,</span> <span class="number">150</span><span class="punct">,</span> <span class="number">130</span><span class="punct">,</span> <span class="number">70</span><span class="punct">,</span> <span class="punct">-</span><span class="number">10</span><span class="punct">,</span> <span class="punct">-</span><span class="number">20</span><span class="punct">,</span> <span class="number">50</span><span class="punct">,</span> <span class="number">92</span><span class="punct">,</span> <span class="punct">-</span><span class="number">21</span><span class="punct">,</span> <span class="number">19</span><span class="punct">],</span>
137
- <span class="symbol">:categories</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="symbol">:top</span><span class="punct">,</span> <span class="symbol">:bottom</span><span class="punct">]</span>
138
-
139
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:line</span><span class="punct">,</span> <span class="punct">'</span><span class="string">Jim</span><span class="punct">',</span>
140
- <span class="punct">[-</span><span class="number">10</span><span class="punct">,</span> <span class="punct">-</span><span class="number">20</span><span class="punct">,</span> <span class="number">50</span><span class="punct">,</span> <span class="number">92</span><span class="punct">,</span> <span class="punct">-</span><span class="number">21</span><span class="punct">,</span> <span class="number">56</span><span class="punct">,</span> <span class="number">92</span><span class="punct">,</span> <span class="number">84</span><span class="punct">,</span> <span class="number">82</span><span class="punct">,</span> <span class="number">100</span><span class="punct">,</span> <span class="number">39</span><span class="punct">,</span> <span class="number">120</span><span class="punct">],</span>
141
- <span class="symbol">:categories</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="symbol">:top</span><span class="punct">,</span> <span class="symbol">:bottom</span><span class="punct">]</span>
142
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">point_markers</span> <span class="punct">=</span> <span class="punct">['</span><span class="string">Jan</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Feb</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Mar</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Apr</span><span class="punct">',</span> <span class="punct">'</span><span class="string">May</span><span class="punct">',</span>
143
- <span class="punct">'</span><span class="string">Jun</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Jul</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Aug</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Sep</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Oct</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Nov</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Dec</span><span class="punct">']</span>
144
-
145
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">render</span> <span class="symbol">:to</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">split_test.svg</span><span class="punct">&quot;</span>
146
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">render</span> <span class="symbol">:width</span> <span class="punct">=&gt;</span> <span class="number">500</span><span class="punct">,</span>
147
- <span class="symbol">:to</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">split_test.png</span><span class="punct">&quot;,</span> <span class="symbol">:as</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">png</span><span class="punct">'</span>
148
- </pre></h3>
149
- <p><img src="images/graphs/split_test.png" alt="" /></p>
150
- <h3>Stacking Graph Types<br />
151
- <pre class='syntax'>
152
- <span class="ident">graph</span> <span class="punct">=</span> <span class="constant">Scruffy</span><span class="punct">::</span><span class="constant">Graph</span><span class="punct">.</span><span class="ident">new</span>
153
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">title</span> <span class="punct">=</span> <span class="punct">&quot;</span><span class="string">Comparative Agent Performance</span><span class="punct">&quot;</span>
154
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">value_formatter</span> <span class="punct">=</span> <span class="constant">Scruffy</span><span class="punct">::</span><span class="constant">Formatters</span><span class="punct">::</span><span class="constant">Percentage</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="symbol">:precision</span> <span class="punct">=&gt;</span> <span class="number">0</span><span class="punct">)</span>
155
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:stacked</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">stacked</span><span class="punct">|</span>
156
- <span class="ident">stacked</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:bar</span><span class="punct">,</span> <span class="punct">'</span><span class="string">Jack</span><span class="punct">',</span> <span class="punct">[</span><span class="number">30</span><span class="punct">,</span> <span class="number">60</span><span class="punct">,</span> <span class="number">49</span><span class="punct">,</span> <span class="number">29</span><span class="punct">,</span> <span class="number">100</span><span class="punct">,</span> <span class="number">120</span><span class="punct">]</span>
157
- <span class="ident">stacked</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:bar</span><span class="punct">,</span> <span class="punct">'</span><span class="string">Jill</span><span class="punct">',</span> <span class="punct">[</span><span class="number">120</span><span class="punct">,</span> <span class="number">240</span><span class="punct">,</span> <span class="number">0</span><span class="punct">,</span> <span class="number">100</span><span class="punct">,</span> <span class="number">140</span><span class="punct">,</span> <span class="number">20</span><span class="punct">]</span>
158
- <span class="ident">stacked</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:bar</span><span class="punct">,</span> <span class="punct">'</span><span class="string">Hill</span><span class="punct">',</span> <span class="punct">[</span><span class="number">10</span><span class="punct">,</span> <span class="number">10</span><span class="punct">,</span> <span class="number">90</span><span class="punct">,</span> <span class="number">20</span><span class="punct">,</span> <span class="number">40</span><span class="punct">,</span> <span class="number">10</span><span class="punct">]</span>
159
- <span class="keyword">end</span>
160
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">point_markers</span> <span class="punct">=</span> <span class="punct">['</span><span class="string">Jan</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Feb</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Mar</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Apr</span><span class="punct">',</span> <span class="punct">'</span><span class="string">May</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Jun</span><span class="punct">']</span>
161
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">render</span> <span class="symbol">:to</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">stacking_test.svg</span><span class="punct">&quot;</span>
162
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">render</span> <span class="symbol">:width</span> <span class="punct">=&gt;</span> <span class="number">500</span><span class="punct">,</span> <span class="symbol">:to</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">stacking_test.png</span><span class="punct">&quot;,</span> <span class="symbol">:as</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">png</span><span class="punct">'</span>
163
- </pre></h3>
164
- <p><img src="images/graphs/stacking_test.png" alt="" /></p>
165
- <h3>Multi-viewport Multi-layered<br />
166
- <pre class='syntax'>
167
- <span class="ident">graph</span> <span class="punct">=</span> <span class="constant">Scruffy</span><span class="punct">::</span><span class="constant">Graph</span><span class="punct">.</span><span class="ident">new</span>
168
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">title</span> <span class="punct">=</span> <span class="punct">&quot;</span><span class="string">Some Kind of Information</span><span class="punct">&quot;</span>
169
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">renderer</span> <span class="punct">=</span> <span class="constant">Scruffy</span><span class="punct">::</span><span class="constant">Renderers</span><span class="punct">::</span><span class="constant">Cubed</span><span class="punct">.</span><span class="ident">new</span>
170
-
171
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:area</span><span class="punct">,</span> <span class="punct">'</span><span class="string">Jeff</span><span class="punct">',</span> <span class="punct">[</span><span class="number">20</span><span class="punct">,</span> <span class="punct">-</span><span class="number">5</span><span class="punct">,</span> <span class="number">100</span><span class="punct">,</span> <span class="number">70</span><span class="punct">,</span> <span class="number">30</span><span class="punct">,</span> <span class="number">106</span><span class="punct">],</span>
172
- <span class="symbol">:categories</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="symbol">:top_left</span><span class="punct">,</span> <span class="symbol">:bottom_right</span><span class="punct">]</span>
173
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:area</span><span class="punct">,</span> <span class="punct">'</span><span class="string">Jerry</span><span class="punct">',</span> <span class="punct">[-</span><span class="number">10</span><span class="punct">,</span> <span class="number">70</span><span class="punct">,</span> <span class="number">20</span><span class="punct">,</span> <span class="number">102</span><span class="punct">,</span> <span class="number">201</span><span class="punct">,</span> <span class="number">26</span><span class="punct">],</span>
174
- <span class="symbol">:categories</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="symbol">:bottom_left</span><span class="punct">,</span> <span class="symbol">:buttom_right</span><span class="punct">]</span>
175
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:bar</span><span class="punct">,</span> <span class="punct">'</span><span class="string">Jack</span><span class="punct">',</span> <span class="punct">[</span><span class="number">30</span><span class="punct">,</span> <span class="number">0</span><span class="punct">,</span> <span class="number">49</span><span class="punct">,</span> <span class="number">29</span><span class="punct">,</span> <span class="number">100</span><span class="punct">,</span> <span class="number">203</span><span class="punct">],</span>
176
- <span class="symbol">:categories</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="symbol">:bottom_left</span><span class="punct">,</span> <span class="symbol">:top_right</span><span class="punct">]</span>
177
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:line</span><span class="punct">,</span> <span class="punct">'</span><span class="string">Brasten</span><span class="punct">',</span> <span class="punct">[</span><span class="number">42</span><span class="punct">,</span> <span class="number">10</span><span class="punct">,</span> <span class="number">75</span><span class="punct">,</span> <span class="number">150</span><span class="punct">,</span> <span class="number">130</span><span class="punct">,</span> <span class="number">70</span><span class="punct">],</span>
178
- <span class="symbol">:categories</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="symbol">:top_right</span><span class="punct">,</span> <span class="symbol">:bottom_left</span><span class="punct">]</span>
179
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">add</span> <span class="symbol">:line</span><span class="punct">,</span> <span class="punct">'</span><span class="string">Jim</span><span class="punct">',</span> <span class="punct">[-</span><span class="number">10</span><span class="punct">,</span> <span class="punct">-</span><span class="number">20</span><span class="punct">,</span> <span class="number">50</span><span class="punct">,</span> <span class="number">92</span><span class="punct">,</span> <span class="punct">-</span><span class="number">21</span><span class="punct">,</span> <span class="number">56</span><span class="punct">],</span>
180
- <span class="symbol">:categories</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="symbol">:top_left</span><span class="punct">,</span> <span class="symbol">:bottom_right</span><span class="punct">]</span>
181
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">point_markers</span> <span class="punct">=</span> <span class="punct">['</span><span class="string">Jan</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Feb</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Mar</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Apr</span><span class="punct">',</span> <span class="punct">'</span><span class="string">May</span><span class="punct">',</span> <span class="punct">'</span><span class="string">Jun</span><span class="punct">']</span>
182
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">render</span> <span class="symbol">:to</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">multi_test.svg</span><span class="punct">&quot;</span>
183
- <span class="ident">graph</span><span class="punct">.</span><span class="ident">render</span> <span class="symbol">:width</span> <span class="punct">=&gt;</span> <span class="number">500</span><span class="punct">,</span> <span class="symbol">:to</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">multi_test.png</span><span class="punct">&quot;,</span> <span class="symbol">:as</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">png</span><span class="punct">'</span>
184
- </pre></h3>
185
- <p><img src="images/graphs/multi_test.png" alt="" /></p>
186
- <h2>Source Code</h2>
187
- <p>The trunk repository is <code>svn://rubyforge.org/var/svn/scruffy/trunk</code> for anonymous access.</p>
188
- <p>Rubyforge Project is <a href="http://rubyforge.org/projects/scruffy/" class="major">here</a></p>
189
- <h2>News</h2>
190
- <ul>
191
- <li><strong>2008-10-13, Scruffy 0.2.5</strong> &#8211; Fixed font_family settings from theme.</li>
192
- </ul>
193
- <ul>
194
- <li><strong>2008-08-22, Scruffy 0.2.4</strong> &#8211; Bug fixes:<br />
195
- Bug 21517, legend text missing, fixed.<br />
196
- Bug 21604, Fails to properly require RMagick, fixed.</li>
197
- </ul>
198
- <ul>
199
- <li><strong>July 8th, 2008, Scruffy 0.2.3</strong> &#8211; Pie Charts added.</li>
200
- </ul>
201
- <ul>
202
- <li><strong>August 18th, 2006, Scruffy 0.2.2</strong> &#8211; Significant changes from 0.1.0! New layouts, better rendering, etc.<br />
203
- Check out more examples at <a href="http://www.ibrasten.com/articles/tag/scruffy">iBrasten.com</a></li>
204
- </ul>
205
- <ul>
206
- <li><strong>August 11th, 2006, Scruffy 0.1.0</strong> &#8211; the first release intended for public use &#8211; has been posted!</li>
207
- </ul>
208
- <h2>License</h2>
209
- <p>This code is free to use under the terms of the <span class="caps">MIT</span> license.</p>
210
- <h2>Contact</h2>
211
- <p>Scruffy was created by <a href="http://www.ibrasten.com">Brasten Sager</a>.</p>
212
- <p>Collaborative work by <a href="http://www.ajostman.com/blog">A.J. Ostman</a>.</p>
213
- <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script><script type="text/javascript">
214
- _uacct = "UA-1742674-1";
215
- urchinTracker();
216
- </script>
217
- <p class="coda">
218
- 23rd August 2009<br>
219
- </p>
220
- </div>
221
-
222
- <!-- insert site tracking codes here, like Google Urchin -->
223
-
224
- </body>
225
- </html>
@@ -1,204 +0,0 @@
1
-
2
- <a href="index.html">Home</a>
3
- "Documentation":doc
4
- "RubyForge Project":http://rubyforge.org/projects/scruffy/
5
-
6
- h1. Don't Worry.
7
-
8
- h1. Be Scruffy.
9
-
10
- bq. Beautiful Graphs for Ruby.
11
-
12
-
13
- h2. What is Scruffy?
14
-
15
- Scruffy is a Ruby library for generating attractive and powerful graphs, useful for web applications, print media and many others.
16
-
17
- Scruffy's key features include:
18
-
19
- * *Built on SVG*<br/>
20
- Scruffy uses SVG internally for rendering graphs. This allows Scruffy to render your graph identically at almost any size.
21
-
22
- * *Mix-n-Match Graphs*<br/>
23
- A Scruffy graph isn't limited to a single graph type (line, bar, area, etc). You can specify a different type for every data set.
24
-
25
- * *Snapshot Rendering*<br/>
26
- You can render a Scruffy graph as many times as you want, and change any settings between renders. Data, colors, even the graph size and image type can all be changed for the next render.
27
-
28
- * *Easily Extendable*<br/>
29
- Scruffy is designed to be extremely extendible. Adding new graph types or themes can be done in as little as a few lines of code. If you need more control over your graphs, you can customize the layouts, data generation, almost anything.
30
-
31
-
32
- h2. Installing
33
-
34
- <pre syntax="ruby">sudo gem install scruffy</pre>
35
-
36
-
37
- h2. Demonstration of usage
38
-
39
- h3. Pie Chart
40
- <pre syntax="ruby">
41
- graph = Scruffy::Graph.new
42
- graph.title = "Favourite Snacks"
43
- graph.renderer = Scruffy::Renderers::Pie.new
44
-
45
- graph.add :pie, '', {
46
- 'Apple' => 20,
47
- 'Banana' => 100,
48
- 'Orange' => 70,
49
- 'Taco' => 30
50
- }
51
-
52
- graph.render :to => "pie_test.svg"
53
- graph.render :width => 300, :height => 200,
54
- :to => "pie_test.png", :as => 'png'
55
- </pre>
56
-
57
- !images/graphs/pie_test.png!
58
-
59
- h3. Line Graph
60
- <pre syntax="ruby">
61
- graph = Scruffy::Graph.new
62
- graph.title = "Sample Line Graph"
63
- graph.renderer = Scruffy::Renderers::Standard.new
64
-
65
- graph.add :line, 'Example', [20, 100, 70, 30, 106]
66
-
67
- graph.render :to => "line_test.svg"
68
- graph.render :width => 300, :height => 200,
69
- :to => "line_test.png", :as => 'png'
70
- </pre>
71
-
72
- !images/graphs/line_test.png!
73
-
74
- h3. Bar Graph
75
- <pre syntax="ruby">
76
- graph = Scruffy::Graph.new
77
- graph.title = "Sample Line Graph"
78
- graph.renderer = Scruffy::Renderers::Standard.new
79
-
80
- graph.add :line, 'Example', [20, 100, 70, 30, 106]
81
-
82
- graph.render :to => "line_test.svg"
83
- graph.render :width => 300, :height => 200,
84
- :to => "line_test.png", :as => 'png'
85
- </pre>
86
-
87
- !images/graphs/bar_test.png!
88
-
89
- h3. Split Graph
90
- <pre syntax="ruby">
91
- graph = Scruffy::Graph.new
92
- graph.title = "Long-term Comparisons"
93
-
94
- graph.value_formatter = Scruffy::Formatters::Currency.new(
95
- :special_negatives => true, :negative_color => '#ff7777')
96
-
97
- graph.renderer = Scruffy::Renderers::Split.new(
98
- :split_label => 'Northeastern (Top) / Central (Bottom)')
99
-
100
- graph.add :area, 'Jeff',
101
- [20, -5, 100, 70, 30, 106, 203, 100, 50, 203, 289, 20],
102
- :category => :top
103
-
104
- graph.add :area, 'Jerry',
105
- [-10, 70, 20, 102, 201, 26, 30, 106, 203, 100, 50, 39],
106
- :category => :top
107
-
108
- graph.add :bar, 'Jack',
109
- [30, 0, 49, 29, 100, 203, 70, 20, 102, 201, 26, 130],
110
- :category => :bottom
111
-
112
- graph.add :line, 'Brasten',
113
- [42, 10, 75, 150, 130, 70, -10, -20, 50, 92, -21, 19],
114
- :categories => [:top, :bottom]
115
-
116
- graph.add :line, 'Jim',
117
- [-10, -20, 50, 92, -21, 56, 92, 84, 82, 100, 39, 120],
118
- :categories => [:top, :bottom]
119
- graph.point_markers = ['Jan', 'Feb', 'Mar', 'Apr', 'May',
120
- 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
121
-
122
- graph.render :to => "split_test.svg"
123
- graph.render :width => 500,
124
- :to => "split_test.png", :as => 'png'
125
- </pre>
126
-
127
- !images/graphs/split_test.png!
128
-
129
- h3. Stacking Graph Types
130
- <pre syntax="ruby">
131
- graph = Scruffy::Graph.new
132
- graph.title = "Comparative Agent Performance"
133
- graph.value_formatter = Scruffy::Formatters::Percentage.new(:precision => 0)
134
- graph.add :stacked do |stacked|
135
- stacked.add :bar, 'Jack', [30, 60, 49, 29, 100, 120]
136
- stacked.add :bar, 'Jill', [120, 240, 0, 100, 140, 20]
137
- stacked.add :bar, 'Hill', [10, 10, 90, 20, 40, 10]
138
- end
139
- graph.point_markers = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
140
- graph.render :to => "stacking_test.svg"
141
- graph.render :width => 500, :to => "stacking_test.png", :as => 'png'
142
- </pre>
143
-
144
- !images/graphs/stacking_test.png!
145
-
146
- h3. Multi-viewport Multi-layered
147
- <pre syntax="ruby">
148
- graph = Scruffy::Graph.new
149
- graph.title = "Some Kind of Information"
150
- graph.renderer = Scruffy::Renderers::Cubed.new
151
-
152
- graph.add :area, 'Jeff', [20, -5, 100, 70, 30, 106],
153
- :categories => [:top_left, :bottom_right]
154
- graph.add :area, 'Jerry', [-10, 70, 20, 102, 201, 26],
155
- :categories => [:bottom_left, :buttom_right]
156
- graph.add :bar, 'Jack', [30, 0, 49, 29, 100, 203],
157
- :categories => [:bottom_left, :top_right]
158
- graph.add :line, 'Brasten', [42, 10, 75, 150, 130, 70],
159
- :categories => [:top_right, :bottom_left]
160
- graph.add :line, 'Jim', [-10, -20, 50, 92, -21, 56],
161
- :categories => [:top_left, :bottom_right]
162
- graph.point_markers = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
163
- graph.render :to => "multi_test.svg"
164
- graph.render :width => 500, :to => "multi_test.png", :as => 'png'
165
- </pre>
166
-
167
- !images/graphs/multi_test.png!
168
-
169
- h2. Source Code
170
-
171
- The trunk repository is <code>svn://rubyforge.org/var/svn/scruffy/trunk</code> for anonymous access.
172
-
173
- Rubyforge Project is <a href="http://rubyforge.org/projects/scruffy/" class="major">here</a>
174
-
175
- h2. News
176
- * *2008-10-13, Scruffy 0.2.5* - Fixed font_family settings from theme.
177
-
178
- * *2008-08-22, Scruffy 0.2.4* - Bug fixes:
179
- Bug 21517, legend text missing, fixed.
180
- Bug 21604, Fails to properly require RMagick, fixed.
181
-
182
- * *July 8th, 2008, Scruffy 0.2.3* - Pie Charts added.
183
-
184
- * *August 18th, 2006, Scruffy 0.2.2* - Significant changes from 0.1.0! New layouts, better rendering, etc.
185
- Check out more examples at <a href="http://www.ibrasten.com/articles/tag/scruffy">iBrasten.com</a>
186
-
187
- * *August 11th, 2006, Scruffy 0.1.0* - the first release intended for public use - has been posted!
188
-
189
-
190
- h2. License
191
-
192
- This code is free to use under the terms of the MIT license.
193
-
194
- h2. Contact
195
-
196
- Scruffy was created by <a href="http://www.ibrasten.com">Brasten Sager</a>.
197
-
198
- Collaborative work by <a href="http://www.ajostman.com/blog">A.J. Ostman</a>.
199
-
200
- <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script>
201
- <script type="text/javascript">
202
- _uacct = "UA-1742674-1";
203
- urchinTracker();
204
- </script>
@@ -1,2 +0,0 @@
1
- // Place your application-specific JavaScript functions and classes here
2
- // This file is automatically included by javascript_include_tag :defaults
@@ -1,815 +0,0 @@
1
- // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
2
- // (c) 2005 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
3
- // (c) 2005 Jon Tirsen (http://www.tirsen.com)
4
- // Contributors:
5
- // Richard Livsey
6
- // Rahul Bhargava
7
- // Rob Wills
8
- //
9
- // See scriptaculous.js for full license.
10
-
11
- // Autocompleter.Base handles all the autocompletion functionality
12
- // that's independent of the data source for autocompletion. This
13
- // includes drawing the autocompletion menu, observing keyboard
14
- // and mouse events, and similar.
15
- //
16
- // Specific autocompleters need to provide, at the very least,
17
- // a getUpdatedChoices function that will be invoked every time
18
- // the text inside the monitored textbox changes. This method
19
- // should get the text for which to provide autocompletion by
20
- // invoking this.getToken(), NOT by directly accessing
21
- // this.element.value. This is to allow incremental tokenized
22
- // autocompletion. Specific auto-completion logic (AJAX, etc)
23
- // belongs in getUpdatedChoices.
24
- //
25
- // Tokenized incremental autocompletion is enabled automatically
26
- // when an autocompleter is instantiated with the 'tokens' option
27
- // in the options parameter, e.g.:
28
- // new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
29
- // will incrementally autocomplete with a comma as the token.
30
- // Additionally, ',' in the above example can be replaced with
31
- // a token array, e.g. { tokens: [',', '\n'] } which
32
- // enables autocompletion on multiple tokens. This is most
33
- // useful when one of the tokens is \n (a newline), as it
34
- // allows smart autocompletion after linebreaks.
35
-
36
- var Autocompleter = {}
37
- Autocompleter.Base = function() {};
38
- Autocompleter.Base.prototype = {
39
- baseInitialize: function(element, update, options) {
40
- this.element = $(element);
41
- this.update = $(update);
42
- this.hasFocus = false;
43
- this.changed = false;
44
- this.active = false;
45
- this.index = 0;
46
- this.entryCount = 0;
47
-
48
- if (this.setOptions)
49
- this.setOptions(options);
50
- else
51
- this.options = options || {};
52
-
53
- this.options.paramName = this.options.paramName || this.element.name;
54
- this.options.tokens = this.options.tokens || [];
55
- this.options.frequency = this.options.frequency || 0.4;
56
- this.options.minChars = this.options.minChars || 1;
57
- this.options.onShow = this.options.onShow ||
58
- function(element, update){
59
- if(!update.style.position || update.style.position=='absolute') {
60
- update.style.position = 'absolute';
61
- Position.clone(element, update, {setHeight: false, offsetTop: element.offsetHeight});
62
- }
63
- Effect.Appear(update,{duration:0.15});
64
- };
65
- this.options.onHide = this.options.onHide ||
66
- function(element, update){ new Effect.Fade(update,{duration:0.15}) };
67
-
68
- if (typeof(this.options.tokens) == 'string')
69
- this.options.tokens = new Array(this.options.tokens);
70
-
71
- this.observer = null;
72
-
73
- this.element.setAttribute('autocomplete','off');
74
-
75
- Element.hide(this.update);
76
-
77
- Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
78
- Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
79
- },
80
-
81
- show: function() {
82
- if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
83
- if(!this.iefix &&
84
- (navigator.appVersion.indexOf('MSIE')>0) &&
85
- (navigator.userAgent.indexOf('Opera')<0) &&
86
- (Element.getStyle(this.update, 'position')=='absolute')) {
87
- new Insertion.After(this.update,
88
- '<iframe id="' + this.update.id + '_iefix" '+
89
- 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
90
- 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
91
- this.iefix = $(this.update.id+'_iefix');
92
- }
93
- if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
94
- },
95
-
96
- fixIEOverlapping: function() {
97
- Position.clone(this.update, this.iefix);
98
- this.iefix.style.zIndex = 1;
99
- this.update.style.zIndex = 2;
100
- Element.show(this.iefix);
101
- },
102
-
103
- hide: function() {
104
- this.stopIndicator();
105
- if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
106
- if(this.iefix) Element.hide(this.iefix);
107
- },
108
-
109
- startIndicator: function() {
110
- if(this.options.indicator) Element.show(this.options.indicator);
111
- },
112
-
113
- stopIndicator: function() {
114
- if(this.options.indicator) Element.hide(this.options.indicator);
115
- },
116
-
117
- onKeyPress: function(event) {
118
- if(this.active)
119
- switch(event.keyCode) {
120
- case Event.KEY_TAB:
121
- case Event.KEY_RETURN:
122
- this.selectEntry();
123
- Event.stop(event);
124
- case Event.KEY_ESC:
125
- this.hide();
126
- this.active = false;
127
- Event.stop(event);
128
- return;
129
- case Event.KEY_LEFT:
130
- case Event.KEY_RIGHT:
131
- return;
132
- case Event.KEY_UP:
133
- this.markPrevious();
134
- this.render();
135
- if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
136
- return;
137
- case Event.KEY_DOWN:
138
- this.markNext();
139
- this.render();
140
- if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
141
- return;
142
- }
143
- else
144
- if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
145
- (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;
146
-
147
- this.changed = true;
148
- this.hasFocus = true;
149
-
150
- if(this.observer) clearTimeout(this.observer);
151
- this.observer =
152
- setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
153
- },
154
-
155
- activate: function() {
156
- this.changed = false;
157
- this.hasFocus = true;
158
- this.getUpdatedChoices();
159
- },
160
-
161
- onHover: function(event) {
162
- var element = Event.findElement(event, 'LI');
163
- if(this.index != element.autocompleteIndex)
164
- {
165
- this.index = element.autocompleteIndex;
166
- this.render();
167
- }
168
- Event.stop(event);
169
- },
170
-
171
- onClick: function(event) {
172
- var element = Event.findElement(event, 'LI');
173
- this.index = element.autocompleteIndex;
174
- this.selectEntry();
175
- this.hide();
176
- },
177
-
178
- onBlur: function(event) {
179
- // needed to make click events working
180
- setTimeout(this.hide.bind(this), 250);
181
- this.hasFocus = false;
182
- this.active = false;
183
- },
184
-
185
- render: function() {
186
- if(this.entryCount > 0) {
187
- for (var i = 0; i < this.entryCount; i++)
188
- this.index==i ?
189
- Element.addClassName(this.getEntry(i),"selected") :
190
- Element.removeClassName(this.getEntry(i),"selected");
191
-
192
- if(this.hasFocus) {
193
- this.show();
194
- this.active = true;
195
- }
196
- } else {
197
- this.active = false;
198
- this.hide();
199
- }
200
- },
201
-
202
- markPrevious: function() {
203
- if(this.index > 0) this.index--
204
- else this.index = this.entryCount-1;
205
- },
206
-
207
- markNext: function() {
208
- if(this.index < this.entryCount-1) this.index++
209
- else this.index = 0;
210
- },
211
-
212
- getEntry: function(index) {
213
- return this.update.firstChild.childNodes[index];
214
- },
215
-
216
- getCurrentEntry: function() {
217
- return this.getEntry(this.index);
218
- },
219
-
220
- selectEntry: function() {
221
- this.active = false;
222
- this.updateElement(this.getCurrentEntry());
223
- },
224
-
225
- updateElement: function(selectedElement) {
226
- if (this.options.updateElement) {
227
- this.options.updateElement(selectedElement);
228
- return;
229
- }
230
- var value = '';
231
- if (this.options.select) {
232
- var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
233
- if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
234
- } else
235
- value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
236
-
237
- var lastTokenPos = this.findLastToken();
238
- if (lastTokenPos != -1) {
239
- var newValue = this.element.value.substr(0, lastTokenPos + 1);
240
- var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
241
- if (whitespace)
242
- newValue += whitespace[0];
243
- this.element.value = newValue + value;
244
- } else {
245
- this.element.value = value;
246
- }
247
- this.element.focus();
248
-
249
- if (this.options.afterUpdateElement)
250
- this.options.afterUpdateElement(this.element, selectedElement);
251
- },
252
-
253
- updateChoices: function(choices) {
254
- if(!this.changed && this.hasFocus) {
255
- this.update.innerHTML = choices;
256
- Element.cleanWhitespace(this.update);
257
- Element.cleanWhitespace(this.update.firstChild);
258
-
259
- if(this.update.firstChild && this.update.firstChild.childNodes) {
260
- this.entryCount =
261
- this.update.firstChild.childNodes.length;
262
- for (var i = 0; i < this.entryCount; i++) {
263
- var entry = this.getEntry(i);
264
- entry.autocompleteIndex = i;
265
- this.addObservers(entry);
266
- }
267
- } else {
268
- this.entryCount = 0;
269
- }
270
-
271
- this.stopIndicator();
272
-
273
- this.index = 0;
274
- this.render();
275
- }
276
- },
277
-
278
- addObservers: function(element) {
279
- Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
280
- Event.observe(element, "click", this.onClick.bindAsEventListener(this));
281
- },
282
-
283
- onObserverEvent: function() {
284
- this.changed = false;
285
- if(this.getToken().length>=this.options.minChars) {
286
- this.startIndicator();
287
- this.getUpdatedChoices();
288
- } else {
289
- this.active = false;
290
- this.hide();
291
- }
292
- },
293
-
294
- getToken: function() {
295
- var tokenPos = this.findLastToken();
296
- if (tokenPos != -1)
297
- var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
298
- else
299
- var ret = this.element.value;
300
-
301
- return /\n/.test(ret) ? '' : ret;
302
- },
303
-
304
- findLastToken: function() {
305
- var lastTokenPos = -1;
306
-
307
- for (var i=0; i<this.options.tokens.length; i++) {
308
- var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);
309
- if (thisTokenPos > lastTokenPos)
310
- lastTokenPos = thisTokenPos;
311
- }
312
- return lastTokenPos;
313
- }
314
- }
315
-
316
- Ajax.Autocompleter = Class.create();
317
- Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
318
- initialize: function(element, update, url, options) {
319
- this.baseInitialize(element, update, options);
320
- this.options.asynchronous = true;
321
- this.options.onComplete = this.onComplete.bind(this);
322
- this.options.defaultParams = this.options.parameters || null;
323
- this.url = url;
324
- },
325
-
326
- getUpdatedChoices: function() {
327
- entry = encodeURIComponent(this.options.paramName) + '=' +
328
- encodeURIComponent(this.getToken());
329
-
330
- this.options.parameters = this.options.callback ?
331
- this.options.callback(this.element, entry) : entry;
332
-
333
- if(this.options.defaultParams)
334
- this.options.parameters += '&' + this.options.defaultParams;
335
-
336
- new Ajax.Request(this.url, this.options);
337
- },
338
-
339
- onComplete: function(request) {
340
- this.updateChoices(request.responseText);
341
- }
342
-
343
- });
344
-
345
- // The local array autocompleter. Used when you'd prefer to
346
- // inject an array of autocompletion options into the page, rather
347
- // than sending out Ajax queries, which can be quite slow sometimes.
348
- //
349
- // The constructor takes four parameters. The first two are, as usual,
350
- // the id of the monitored textbox, and id of the autocompletion menu.
351
- // The third is the array you want to autocomplete from, and the fourth
352
- // is the options block.
353
- //
354
- // Extra local autocompletion options:
355
- // - choices - How many autocompletion choices to offer
356
- //
357
- // - partialSearch - If false, the autocompleter will match entered
358
- // text only at the beginning of strings in the
359
- // autocomplete array. Defaults to true, which will
360
- // match text at the beginning of any *word* in the
361
- // strings in the autocomplete array. If you want to
362
- // search anywhere in the string, additionally set
363
- // the option fullSearch to true (default: off).
364
- //
365
- // - fullSsearch - Search anywhere in autocomplete array strings.
366
- //
367
- // - partialChars - How many characters to enter before triggering
368
- // a partial match (unlike minChars, which defines
369
- // how many characters are required to do any match
370
- // at all). Defaults to 2.
371
- //
372
- // - ignoreCase - Whether to ignore case when autocompleting.
373
- // Defaults to true.
374
- //
375
- // It's possible to pass in a custom function as the 'selector'
376
- // option, if you prefer to write your own autocompletion logic.
377
- // In that case, the other options above will not apply unless
378
- // you support them.
379
-
380
- Autocompleter.Local = Class.create();
381
- Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
382
- initialize: function(element, update, array, options) {
383
- this.baseInitialize(element, update, options);
384
- this.options.array = array;
385
- },
386
-
387
- getUpdatedChoices: function() {
388
- this.updateChoices(this.options.selector(this));
389
- },
390
-
391
- setOptions: function(options) {
392
- this.options = Object.extend({
393
- choices: 10,
394
- partialSearch: true,
395
- partialChars: 2,
396
- ignoreCase: true,
397
- fullSearch: false,
398
- selector: function(instance) {
399
- var ret = []; // Beginning matches
400
- var partial = []; // Inside matches
401
- var entry = instance.getToken();
402
- var count = 0;
403
-
404
- for (var i = 0; i < instance.options.array.length &&
405
- ret.length < instance.options.choices ; i++) {
406
-
407
- var elem = instance.options.array[i];
408
- var foundPos = instance.options.ignoreCase ?
409
- elem.toLowerCase().indexOf(entry.toLowerCase()) :
410
- elem.indexOf(entry);
411
-
412
- while (foundPos != -1) {
413
- if (foundPos == 0 && elem.length != entry.length) {
414
- ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
415
- elem.substr(entry.length) + "</li>");
416
- break;
417
- } else if (entry.length >= instance.options.partialChars &&
418
- instance.options.partialSearch && foundPos != -1) {
419
- if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
420
- partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
421
- elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
422
- foundPos + entry.length) + "</li>");
423
- break;
424
- }
425
- }
426
-
427
- foundPos = instance.options.ignoreCase ?
428
- elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
429
- elem.indexOf(entry, foundPos + 1);
430
-
431
- }
432
- }
433
- if (partial.length)
434
- ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
435
- return "<ul>" + ret.join('') + "</ul>";
436
- }
437
- }, options || {});
438
- }
439
- });
440
-
441
- // AJAX in-place editor
442
- //
443
- // see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor
444
-
445
- // Use this if you notice weird scrolling problems on some browsers,
446
- // the DOM might be a bit confused when this gets called so do this
447
- // waits 1 ms (with setTimeout) until it does the activation
448
- Field.scrollFreeActivate = function(field) {
449
- setTimeout(function() {
450
- Field.activate(field);
451
- }, 1);
452
- }
453
-
454
- Ajax.InPlaceEditor = Class.create();
455
- Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
456
- Ajax.InPlaceEditor.prototype = {
457
- initialize: function(element, url, options) {
458
- this.url = url;
459
- this.element = $(element);
460
-
461
- this.options = Object.extend({
462
- okButton: true,
463
- okText: "ok",
464
- cancelLink: true,
465
- cancelText: "cancel",
466
- savingText: "Saving...",
467
- clickToEditText: "Click to edit",
468
- okText: "ok",
469
- rows: 1,
470
- onComplete: function(transport, element) {
471
- new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
472
- },
473
- onFailure: function(transport) {
474
- alert("Error communicating with the server: " + transport.responseText.stripTags());
475
- },
476
- callback: function(form) {
477
- return Form.serialize(form);
478
- },
479
- handleLineBreaks: true,
480
- loadingText: 'Loading...',
481
- savingClassName: 'inplaceeditor-saving',
482
- loadingClassName: 'inplaceeditor-loading',
483
- formClassName: 'inplaceeditor-form',
484
- highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
485
- highlightendcolor: "#FFFFFF",
486
- externalControl: null,
487
- submitOnBlur: false,
488
- ajaxOptions: {},
489
- evalScripts: false
490
- }, options || {});
491
-
492
- if(!this.options.formId && this.element.id) {
493
- this.options.formId = this.element.id + "-inplaceeditor";
494
- if ($(this.options.formId)) {
495
- // there's already a form with that name, don't specify an id
496
- this.options.formId = null;
497
- }
498
- }
499
-
500
- if (this.options.externalControl) {
501
- this.options.externalControl = $(this.options.externalControl);
502
- }
503
-
504
- this.originalBackground = Element.getStyle(this.element, 'background-color');
505
- if (!this.originalBackground) {
506
- this.originalBackground = "transparent";
507
- }
508
-
509
- this.element.title = this.options.clickToEditText;
510
-
511
- this.onclickListener = this.enterEditMode.bindAsEventListener(this);
512
- this.mouseoverListener = this.enterHover.bindAsEventListener(this);
513
- this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
514
- Event.observe(this.element, 'click', this.onclickListener);
515
- Event.observe(this.element, 'mouseover', this.mouseoverListener);
516
- Event.observe(this.element, 'mouseout', this.mouseoutListener);
517
- if (this.options.externalControl) {
518
- Event.observe(this.options.externalControl, 'click', this.onclickListener);
519
- Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
520
- Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
521
- }
522
- },
523
- enterEditMode: function(evt) {
524
- if (this.saving) return;
525
- if (this.editing) return;
526
- this.editing = true;
527
- this.onEnterEditMode();
528
- if (this.options.externalControl) {
529
- Element.hide(this.options.externalControl);
530
- }
531
- Element.hide(this.element);
532
- this.createForm();
533
- this.element.parentNode.insertBefore(this.form, this.element);
534
- Field.scrollFreeActivate(this.editField);
535
- // stop the event to avoid a page refresh in Safari
536
- if (evt) {
537
- Event.stop(evt);
538
- }
539
- return false;
540
- },
541
- createForm: function() {
542
- this.form = document.createElement("form");
543
- this.form.id = this.options.formId;
544
- Element.addClassName(this.form, this.options.formClassName)
545
- this.form.onsubmit = this.onSubmit.bind(this);
546
-
547
- this.createEditField();
548
-
549
- if (this.options.textarea) {
550
- var br = document.createElement("br");
551
- this.form.appendChild(br);
552
- }
553
-
554
- if (this.options.okButton) {
555
- okButton = document.createElement("input");
556
- okButton.type = "submit";
557
- okButton.value = this.options.okText;
558
- okButton.className = 'editor_ok_button';
559
- this.form.appendChild(okButton);
560
- }
561
-
562
- if (this.options.cancelLink) {
563
- cancelLink = document.createElement("a");
564
- cancelLink.href = "#";
565
- cancelLink.appendChild(document.createTextNode(this.options.cancelText));
566
- cancelLink.onclick = this.onclickCancel.bind(this);
567
- cancelLink.className = 'editor_cancel';
568
- this.form.appendChild(cancelLink);
569
- }
570
- },
571
- hasHTMLLineBreaks: function(string) {
572
- if (!this.options.handleLineBreaks) return false;
573
- return string.match(/<br/i) || string.match(/<p>/i);
574
- },
575
- convertHTMLLineBreaks: function(string) {
576
- return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");
577
- },
578
- createEditField: function() {
579
- var text;
580
- if(this.options.loadTextURL) {
581
- text = this.options.loadingText;
582
- } else {
583
- text = this.getText();
584
- }
585
-
586
- var obj = this;
587
-
588
- if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {
589
- this.options.textarea = false;
590
- var textField = document.createElement("input");
591
- textField.obj = this;
592
- textField.type = "text";
593
- textField.name = "value";
594
- textField.value = text;
595
- textField.style.backgroundColor = this.options.highlightcolor;
596
- textField.className = 'editor_field';
597
- var size = this.options.size || this.options.cols || 0;
598
- if (size != 0) textField.size = size;
599
- if (this.options.submitOnBlur)
600
- textField.onblur = this.onSubmit.bind(this);
601
- this.editField = textField;
602
- } else {
603
- this.options.textarea = true;
604
- var textArea = document.createElement("textarea");
605
- textArea.obj = this;
606
- textArea.name = "value";
607
- textArea.value = this.convertHTMLLineBreaks(text);
608
- textArea.rows = this.options.rows;
609
- textArea.cols = this.options.cols || 40;
610
- textArea.className = 'editor_field';
611
- if (this.options.submitOnBlur)
612
- textArea.onblur = this.onSubmit.bind(this);
613
- this.editField = textArea;
614
- }
615
-
616
- if(this.options.loadTextURL) {
617
- this.loadExternalText();
618
- }
619
- this.form.appendChild(this.editField);
620
- },
621
- getText: function() {
622
- return this.element.innerHTML;
623
- },
624
- loadExternalText: function() {
625
- Element.addClassName(this.form, this.options.loadingClassName);
626
- this.editField.disabled = true;
627
- new Ajax.Request(
628
- this.options.loadTextURL,
629
- Object.extend({
630
- asynchronous: true,
631
- onComplete: this.onLoadedExternalText.bind(this)
632
- }, this.options.ajaxOptions)
633
- );
634
- },
635
- onLoadedExternalText: function(transport) {
636
- Element.removeClassName(this.form, this.options.loadingClassName);
637
- this.editField.disabled = false;
638
- this.editField.value = transport.responseText.stripTags();
639
- },
640
- onclickCancel: function() {
641
- this.onComplete();
642
- this.leaveEditMode();
643
- return false;
644
- },
645
- onFailure: function(transport) {
646
- this.options.onFailure(transport);
647
- if (this.oldInnerHTML) {
648
- this.element.innerHTML = this.oldInnerHTML;
649
- this.oldInnerHTML = null;
650
- }
651
- return false;
652
- },
653
- onSubmit: function() {
654
- // onLoading resets these so we need to save them away for the Ajax call
655
- var form = this.form;
656
- var value = this.editField.value;
657
-
658
- // do this first, sometimes the ajax call returns before we get a chance to switch on Saving...
659
- // which means this will actually switch on Saving... *after* we've left edit mode causing Saving...
660
- // to be displayed indefinitely
661
- this.onLoading();
662
-
663
- if (this.options.evalScripts) {
664
- new Ajax.Request(
665
- this.url, Object.extend({
666
- parameters: this.options.callback(form, value),
667
- onComplete: this.onComplete.bind(this),
668
- onFailure: this.onFailure.bind(this),
669
- asynchronous:true,
670
- evalScripts:true
671
- }, this.options.ajaxOptions));
672
- } else {
673
- new Ajax.Updater(
674
- { success: this.element,
675
- // don't update on failure (this could be an option)
676
- failure: null },
677
- this.url, Object.extend({
678
- parameters: this.options.callback(form, value),
679
- onComplete: this.onComplete.bind(this),
680
- onFailure: this.onFailure.bind(this)
681
- }, this.options.ajaxOptions));
682
- }
683
- // stop the event to avoid a page refresh in Safari
684
- if (arguments.length > 1) {
685
- Event.stop(arguments[0]);
686
- }
687
- return false;
688
- },
689
- onLoading: function() {
690
- this.saving = true;
691
- this.removeForm();
692
- this.leaveHover();
693
- this.showSaving();
694
- },
695
- showSaving: function() {
696
- this.oldInnerHTML = this.element.innerHTML;
697
- this.element.innerHTML = this.options.savingText;
698
- Element.addClassName(this.element, this.options.savingClassName);
699
- this.element.style.backgroundColor = this.originalBackground;
700
- Element.show(this.element);
701
- },
702
- removeForm: function() {
703
- if(this.form) {
704
- if (this.form.parentNode) Element.remove(this.form);
705
- this.form = null;
706
- }
707
- },
708
- enterHover: function() {
709
- if (this.saving) return;
710
- this.element.style.backgroundColor = this.options.highlightcolor;
711
- if (this.effect) {
712
- this.effect.cancel();
713
- }
714
- Element.addClassName(this.element, this.options.hoverClassName)
715
- },
716
- leaveHover: function() {
717
- if (this.options.backgroundColor) {
718
- this.element.style.backgroundColor = this.oldBackground;
719
- }
720
- Element.removeClassName(this.element, this.options.hoverClassName)
721
- if (this.saving) return;
722
- this.effect = new Effect.Highlight(this.element, {
723
- startcolor: this.options.highlightcolor,
724
- endcolor: this.options.highlightendcolor,
725
- restorecolor: this.originalBackground
726
- });
727
- },
728
- leaveEditMode: function() {
729
- Element.removeClassName(this.element, this.options.savingClassName);
730
- this.removeForm();
731
- this.leaveHover();
732
- this.element.style.backgroundColor = this.originalBackground;
733
- Element.show(this.element);
734
- if (this.options.externalControl) {
735
- Element.show(this.options.externalControl);
736
- }
737
- this.editing = false;
738
- this.saving = false;
739
- this.oldInnerHTML = null;
740
- this.onLeaveEditMode();
741
- },
742
- onComplete: function(transport) {
743
- this.leaveEditMode();
744
- this.options.onComplete.bind(this)(transport, this.element);
745
- },
746
- onEnterEditMode: function() {},
747
- onLeaveEditMode: function() {},
748
- dispose: function() {
749
- if (this.oldInnerHTML) {
750
- this.element.innerHTML = this.oldInnerHTML;
751
- }
752
- this.leaveEditMode();
753
- Event.stopObserving(this.element, 'click', this.onclickListener);
754
- Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
755
- Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
756
- if (this.options.externalControl) {
757
- Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
758
- Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
759
- Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
760
- }
761
- }
762
- };
763
-
764
- Ajax.InPlaceCollectionEditor = Class.create();
765
- Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
766
- Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
767
- createEditField: function() {
768
- if (!this.cached_selectTag) {
769
- var selectTag = document.createElement("select");
770
- var collection = this.options.collection || [];
771
- var optionTag;
772
- collection.each(function(e,i) {
773
- optionTag = document.createElement("option");
774
- optionTag.value = (e instanceof Array) ? e[0] : e;
775
- if(this.options.value==optionTag.value) optionTag.selected = true;
776
- optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
777
- selectTag.appendChild(optionTag);
778
- }.bind(this));
779
- this.cached_selectTag = selectTag;
780
- }
781
-
782
- this.editField = this.cached_selectTag;
783
- if(this.options.loadTextURL) this.loadExternalText();
784
- this.form.appendChild(this.editField);
785
- this.options.callback = function(form, value) {
786
- return "value=" + encodeURIComponent(value);
787
- }
788
- }
789
- });
790
-
791
- // Delayed observer, like Form.Element.Observer,
792
- // but waits for delay after last key input
793
- // Ideal for live-search fields
794
-
795
- Form.Element.DelayedObserver = Class.create();
796
- Form.Element.DelayedObserver.prototype = {
797
- initialize: function(element, delay, callback) {
798
- this.delay = delay || 0.5;
799
- this.element = $(element);
800
- this.callback = callback;
801
- this.timer = null;
802
- this.lastValue = $F(this.element);
803
- Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
804
- },
805
- delayedListener: function(event) {
806
- if(this.lastValue == $F(this.element)) return;
807
- if(this.timer) clearTimeout(this.timer);
808
- this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
809
- this.lastValue = $F(this.element);
810
- },
811
- onTimerEvent: function() {
812
- this.timer = null;
813
- this.callback(this.element, $F(this.element));
814
- }
815
- };