Pimki 1.0.092

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. data/README +158 -0
  2. data/README-PIMKI +87 -0
  3. data/app/controllers/wiki.rb +563 -0
  4. data/app/models/author.rb +4 -0
  5. data/app/models/chunks/category.rb +31 -0
  6. data/app/models/chunks/category_test.rb +21 -0
  7. data/app/models/chunks/chunk.rb +20 -0
  8. data/app/models/chunks/engines.rb +34 -0
  9. data/app/models/chunks/include.rb +29 -0
  10. data/app/models/chunks/literal.rb +19 -0
  11. data/app/models/chunks/match.rb +19 -0
  12. data/app/models/chunks/nowiki.rb +31 -0
  13. data/app/models/chunks/nowiki_test.rb +14 -0
  14. data/app/models/chunks/test.rb +18 -0
  15. data/app/models/chunks/todo.rb +22 -0
  16. data/app/models/chunks/uri.rb +97 -0
  17. data/app/models/chunks/uri_test.rb +92 -0
  18. data/app/models/chunks/wiki.rb +82 -0
  19. data/app/models/chunks/wiki_test.rb +36 -0
  20. data/app/models/page.rb +91 -0
  21. data/app/models/page_lock.rb +24 -0
  22. data/app/models/page_set.rb +73 -0
  23. data/app/models/page_test.rb +76 -0
  24. data/app/models/revision.rb +91 -0
  25. data/app/models/revision_test.rb +252 -0
  26. data/app/models/web.rb +277 -0
  27. data/app/models/web_test.rb +53 -0
  28. data/app/models/wiki_content.rb +113 -0
  29. data/app/models/wiki_service.rb +137 -0
  30. data/app/models/wiki_service_test.rb +15 -0
  31. data/app/models/wiki_words.rb +26 -0
  32. data/app/models/wiki_words_test.rb +12 -0
  33. data/app/views/bottom.rhtml +4 -0
  34. data/app/views/markdown_help.rhtml +16 -0
  35. data/app/views/menu.rhtml +20 -0
  36. data/app/views/navigation.rhtml +26 -0
  37. data/app/views/rdoc_help.rhtml +16 -0
  38. data/app/views/static_style_sheet.rhtml +231 -0
  39. data/app/views/style.rhtml +179 -0
  40. data/app/views/textile_help.rhtml +28 -0
  41. data/app/views/top.rhtml +52 -0
  42. data/app/views/wiki/authors.rhtml +15 -0
  43. data/app/views/wiki/bliki.rhtml +101 -0
  44. data/app/views/wiki/bliki_edit.rhtml +33 -0
  45. data/app/views/wiki/bliki_new.rhtml +61 -0
  46. data/app/views/wiki/bliki_revision.rhtml +51 -0
  47. data/app/views/wiki/edit.rhtml +34 -0
  48. data/app/views/wiki/edit_menu.rhtml +27 -0
  49. data/app/views/wiki/edit_web.rhtml +139 -0
  50. data/app/views/wiki/export.rhtml +14 -0
  51. data/app/views/wiki/feeds.rhtml +10 -0
  52. data/app/views/wiki/list.rhtml +164 -0
  53. data/app/views/wiki/locked.rhtml +14 -0
  54. data/app/views/wiki/login.rhtml +11 -0
  55. data/app/views/wiki/mind.rhtml +39 -0
  56. data/app/views/wiki/new.rhtml +27 -0
  57. data/app/views/wiki/new_system.rhtml +78 -0
  58. data/app/views/wiki/new_web.rhtml +64 -0
  59. data/app/views/wiki/page.rhtml +84 -0
  60. data/app/views/wiki/print.rhtml +16 -0
  61. data/app/views/wiki/published.rhtml +10 -0
  62. data/app/views/wiki/recently_revised.rhtml +31 -0
  63. data/app/views/wiki/revision.rhtml +87 -0
  64. data/app/views/wiki/rss_feed.rhtml +22 -0
  65. data/app/views/wiki/search.rhtml +26 -0
  66. data/app/views/wiki/tex.rhtml +23 -0
  67. data/app/views/wiki/tex_web.rhtml +35 -0
  68. data/app/views/wiki/todo.rhtml +39 -0
  69. data/app/views/wiki/web_list.rhtml +13 -0
  70. data/app/views/wiki_words_help.rhtml +8 -0
  71. data/libraries/action_controller_servlet.rb +177 -0
  72. data/libraries/bluecloth.rb +1127 -0
  73. data/libraries/diff/diff.rb +475 -0
  74. data/libraries/diff/diff_test.rb +80 -0
  75. data/libraries/erb.rb +490 -0
  76. data/libraries/madeleine/automatic.rb +357 -0
  77. data/libraries/madeleine/clock.rb +94 -0
  78. data/libraries/madeleine_service.rb +69 -0
  79. data/libraries/rdocsupport.rb +156 -0
  80. data/libraries/redcloth_for_tex.rb +869 -0
  81. data/libraries/redcloth_for_tex_test.rb +41 -0
  82. data/libraries/view_helper.rb +33 -0
  83. data/libraries/web_controller_server.rb +95 -0
  84. data/pimki.rb +97 -0
  85. metadata +169 -0
@@ -0,0 +1,15 @@
1
+ <% @title = "Authors" %><%= sub_template "top" %>
2
+
3
+ <p>You can also see a graph of authors->pages in the <a href="../mind/?type=neato&authors_graph=on&Go=Redraw">Mind Map<a> section.<p>
4
+
5
+ <ul id="authorList">
6
+ <% for author in @authors %>
7
+ <li>
8
+ <%= @web.make_link(author) %>
9
+ co- or authored:
10
+ <%= @web.select.pages_authored_by(author).collect { |page| page.link }.join ", " %>
11
+ </li>
12
+ <% end %>
13
+ </ul>
14
+
15
+ <%= sub_template "bottom" %>
@@ -0,0 +1,101 @@
1
+ <% @title = "Bliki" %>
2
+ <%= sub_template "top" %>
3
+
4
+ <% if @req.query['authorname'] != 'noselect' and not @req.query['regexp'].nil? and not @req.query['regexp'].empty? %>
5
+ <p>You are filtering entries by author: <em><%= @req.query['authorname'] %></em>
6
+ containing: <em><%= @req.query['regexp'] %></em>
7
+ <br /><a href="../bliki/" class="navlink" accesskey="R">Remove Filter</a>
8
+ <% elsif not @req.query['authorname'].nil? and @req.query['authorname'] != 'noselect' %>
9
+ <p>You are filtering entries by: <em><%= @req.query['authorname'] %></em>
10
+ <br /><a href="../bliki/" class="navlink" accesskey="R">Remove Filter</a>
11
+ <% elsif not @req.query['regexp'].nil? %>
12
+ <p>You are filtering entries containing: <em><%= @req.query['regexp'] %></em>
13
+ <br /><a href="../bliki/" class="navlink" accesskey="R">Remove Filter</a>
14
+ <% end %>
15
+
16
+ <p><a href="../bliki_new/" class="navlink" accesskey="E">New Entry</a></p>
17
+
18
+ <% if @entries.length > 0 %>
19
+ <table width="100%">
20
+ <% (@entries.length > 3 ? 3 : @entries.length).times do |idx| %>
21
+ <tr>
22
+ <td width="70%"><h3 style="color:<%= @color %>"><%= @entries[idx].plain_name %></h3></td>
23
+ </tr>
24
+ <tr>
25
+ <th align="left" style="font-size:10;color:<%= @color %>"><%= @entries[idx].revisions.first.created_at.strftime("%B %d, %Y") %>
26
+ <% if @entries[idx].revisions.first != @entries[idx].revisions.last %>
27
+ -- Last revised on: <%= @entries[idx].revisions.last.created_at.strftime("%B %d, %Y") %>
28
+ <% end %>
29
+ </th>
30
+ </tr>
31
+ <tr>
32
+ <td colspan="2"><%= @entries[idx].display_content %></td>
33
+ </tr>
34
+ <tr><td>
35
+ <div class="navigation">
36
+ <a href="../bliki_edit/<%= @entries[idx].name %>" class="navlink" accesskey="E">Edit</a>
37
+ | <a href="../bliki_delete/<%= @entries[idx].name %>" class="navlink" onClick="return confirm('Are you sure you want delete this entry completely?')">Delete</a>
38
+ <% if @entries[idx].revisions.length > 1 %>
39
+ <small>
40
+ | <a href="../bliki_revision/<%= @entries[idx].name %>?rev=<%= @entries[idx].revisions.length - 1 %>" class="navlink" accesskey="R">Older Revisions</a>
41
+ (<%= @entries[idx].revisions.length - 1 %>)
42
+ </small>
43
+ <% end %>
44
+ <% if @entries[idx].references.length > 0 %>
45
+ <small>
46
+ | Referenced by: <%= @entries[idx].references.collect { |ref| ref.link }.join(", ") %>
47
+ </small>
48
+ <% end %>
49
+ </div>
50
+ </td>
51
+ <th align="right"><small><%= @entries[idx].author_link %></small></th>
52
+ </tr>
53
+ <tr><td colspan="2"><hr></td></tr>
54
+ <% end %>
55
+ </table>
56
+ <% else %>
57
+ <p><strong>No entries found.</strong></p>
58
+ <% end %>
59
+
60
+ <h2>All Entries:</h2>
61
+ <ul>
62
+ <% @entries.each do |page| %>
63
+ <li><a href="../bliki_revision/<%= page.name %>?rev=<%= page.revisions.length - 1 %>" class="navlink" accesskey="R"><%= page.plain_name %></a>
64
+ <small>[<%= page.author_link %>, <%=page.revisions.first.created_at.strftime("%d-%b-%Y") %>]</small>
65
+ </li>
66
+ <% end %>
67
+ </ul>
68
+
69
+ <script language="JavaScript1.2">
70
+ function validateSelection() {
71
+ var selection = document.getElementById('sel_author').value;
72
+ var regex = document.getElementById('search_regex').value;
73
+ if (selection == "noselect" && regex == "") {
74
+ alert("Please make a selection and/or supply a rexex to search.");
75
+ return false;
76
+ }
77
+ return true;
78
+ }
79
+ </script>
80
+
81
+ <h2>Apply filter:</h2>
82
+ <table><tr>
83
+ <td>Show only pages authored by:</td>
84
+ <form class="navigation" action="bliki" action="post" onSubmit="return validateSelection();">
85
+ <td>
86
+ <select id="sel_author" name="authorname" size="1">
87
+ <option value="noselect">------------
88
+ <% for auth in @authors %>
89
+ <option value="<%= auth %>"><%= auth %>
90
+ <% end %>
91
+ </select>
92
+ </td>
93
+ </tr><tr>
94
+ <td>Regexp search on all entries:</td>
95
+ <td><input type="text" id="search_regex" name="regexp"></td>
96
+ <td><input type="submit" name="Search" value="Search"></td>
97
+ </form>
98
+ </tr></table>
99
+
100
+ <%= sub_template "bottom" %>
101
+
@@ -0,0 +1,33 @@
1
+ <%
2
+ @title = "Editing #{@page.plain_name}"
3
+ @content_width = 720
4
+ @hide_navigation = true
5
+ %>
6
+ <%= sub_template "top" %>
7
+
8
+ <%= render_markup_help %>
9
+
10
+ <form action="../bliki_save/<%= @page.name %>" method="post" onSubmit="return validateAuthorName();">
11
+ <p>
12
+ <textarea name="content" style="width: 450px; height: 430px"><%= @page.content %></textarea>
13
+ </p>
14
+ <p>
15
+ <input type="submit" value="Update"> as
16
+ <input type="text" name="author" id="authorName" value="<%= @author %>"
17
+ onClick="this.value == 'AnonymousCoward' ? this.value = '' : true">
18
+ | <a href="../cancel_bliki_edit/<%= @page.name %>">Cancel</a> <small>(unlocks entry)</small>
19
+ </p>
20
+ </form>
21
+
22
+ <script language="JavaScript1.2">
23
+ function validateAuthorName() {
24
+ if (/^([A-Z][a-z]+[A-Z]\w+)$/.test(document.getElementById('authorName').value)) {
25
+ return true;
26
+ } else {
27
+ alert('You wrote "' + document.getElementById('authorName').value + '" as your name, but it needs to be a wiki word. Try concating first name and last name, like DavidHeinemeierHansson.');
28
+ return false;
29
+ }
30
+ }
31
+ </script>
32
+
33
+ <%= sub_template "bottom" %>
@@ -0,0 +1,61 @@
1
+ <%
2
+ @title = "Creating new bliki entry"
3
+ @content_width = 720
4
+ @hide_navigation = true
5
+ %>
6
+ <%= sub_template "top" %>
7
+
8
+ <p>
9
+ <%= render_markup_help %>
10
+
11
+ <form action="../bliki_save/" method="post" onSubmit="return validateWikiWords();">
12
+ <table width="450">
13
+ <tr style="background-color:dfd">
14
+ <td width="70%">Title: <input size="40%" type="text" name="pagename" id="newPageName"></td>
15
+ <th align="right"><small><%= Date.today.strftime("%d %b %Y") %></small></th>
16
+ </tr>
17
+ <tr>
18
+ <td colspan="2"><textarea name="content" style="width: 450px; height: 430px">
19
+ | / | *Morning* | *Afternoon* |
20
+ | *Mon* | - | - |
21
+ | *Tue* | - | - |
22
+ | *Wed* | - | - |
23
+ | *Thu* | - | - |
24
+ | *Fri* | - | - |
25
+ </textarea></td>
26
+ </tr>
27
+ <tr style="background-color:efe">
28
+ <th colspan="2" align="right">
29
+ <input type="text" name="author" id="authorName" value="<%= @author || 'AnonymousCoward'%>"
30
+ onClick="this.value == 'AnonymousCoward' ? this.value = '' : true">
31
+ </th>
32
+ </tr>
33
+ </table>
34
+
35
+ <p>
36
+ <input type="submit" value="Update"> as
37
+
38
+ | <a href="../cancel_bliki_edit/">Cancel</a> <small>(unlocks entry)</small>
39
+ </p>
40
+ </form>
41
+
42
+ <script language="JavaScript1.2">
43
+ function validateWikiWords() {
44
+ alert(escape(document.getElementById('newPageName').value));
45
+ return false;
46
+ if (/^([A-Z][a-z]+[A-Z]\w+)$/.test(document.getElementById('authorName').value)) {
47
+ // return true; skip to validate page name
48
+ } else {
49
+ alert('You wrote "' + document.getElementById('authorName').value + '" as your name, but it needs to be a wiki word. Try concating first name and last name, like DavidHeinemeierHansson.');
50
+ return false;
51
+ }
52
+ if (/^[\w\s\d]+)$/.test(document.getElementById('newPageName').value)) {
53
+ return true;
54
+ } else {
55
+ alert('You wrote "' + document.getElementById('newPageName').value + '" as the entry name, but it can only contain letters, digits and space.');
56
+ return false;
57
+ }
58
+ }
59
+ </script>
60
+
61
+ <%= sub_template "bottom" %>
@@ -0,0 +1,51 @@
1
+ <% @title = "#{@page.plain_name} (Rev ##{@revision.number})" %>
2
+ <%= sub_template "top" %>
3
+
4
+ <table width="100%">
5
+ <tr style="background-color:dfd">
6
+ <td width="70%"><h4><%= @revision.page.name %></h4></td>
7
+ <th><small><%= @revision.pretty_created_at %></small></th>
8
+ </tr>
9
+ <tr>
10
+ <td colspan="2"><%= @revision.display_content %></td>
11
+ </tr>
12
+ <tr style="background-color:efe">
13
+ <th colspan="2" align="right"><small><%= web.make_link(@revision.author, nil, {}) %></small></th>
14
+ </tr>
15
+ </table>
16
+
17
+ <div class="byline">
18
+ <%= "Revision from #{@revision.pretty_created_at} by" %>
19
+ <%# @page.web.pages[@revision.author] ? WikiWords.existing_page_link(@revision.author) : WikiWords.unexisting_page_link(@revision.author) %>
20
+ </div>
21
+
22
+ <div class="navigation">
23
+ <% if @revision.previous_revision %>
24
+ <a href="../bliki_revision/<%= @page.name %>?rev=<%= @revision.previous_revision.number %>" class="navlink">Lower</a>
25
+ <% @lower = true
26
+ end
27
+ if @revision.next_revision
28
+ if @lower %>
29
+ -
30
+ <% end %>
31
+ <a href="../bliki_revision/<%= @page.name %>?rev=<%= @revision.next_revision.number %>" class="navlink">Higher</a>
32
+ <% end %>
33
+
34
+ <%= '|' if @revision.previous_revision or @revision.next_revision %>
35
+ <a href="../bliki_delete/<%= @page.name %>" class="navlink" onClick="return confirm('Are you sure you want delete this entry completely?')">Delete All</a>
36
+ <% if @revision.next_revision %>
37
+ | <a href="../bliki_revision/<%= @page.name %>?rev=<%= @page.revisions.length - 1 %>" class="navlink">Back to current</a>
38
+ <% else %>
39
+ | <a href="../rollback_bliki/<%= @page.name %>?rev=<%= @revision.number - 1 %>"
40
+ class="navlink" onClick="return confirm('Are you sure you want reset the page to this revision?')">Rollback to here</a>
41
+ <% end %>
42
+
43
+
44
+ <% if @page.references.length > 0 %>
45
+ <small>
46
+ | Referenced by: <%= @page.references.collect { |ref| "<a href='#{ref.name}'>#{ref.name}</a>" }.join(", ") %>
47
+ </small>
48
+ <% end %>
49
+ </div>
50
+
51
+ <%= sub_template "bottom" %>
@@ -0,0 +1,34 @@
1
+ <%
2
+ @title = "Editing #{@page.plain_name}"
3
+ @content_width = 720
4
+ @hide_navigation = true
5
+ @style_additions = "#Container, #Content {padding-left:100px;}"
6
+
7
+ %>
8
+ <%= sub_template "top" %>
9
+
10
+ <%= "<p style='color:red'>Please correct the error that caused this error in rendering:<br/><small>#{@params["msg"]}</small></p>" if @params["msg"] %>
11
+
12
+ <%= render_markup_help %>
13
+
14
+ <form style="float:right" id="editForm" action="../save/<%= @page.name %>" method="post" onSubmit="cleanAuthorName();">
15
+ <p>
16
+ <textarea name="content" style="width: 450px; height: 430px"><%= @page.content %></textarea>
17
+ </p>
18
+ <p>
19
+ <input type="submit" value="Update"> as
20
+ <input type="text" name="author" id="authorName" value="<%= @author %>"
21
+ onClick="this.value == 'AnonymousCoward' ? this.value = '' : true">
22
+ | <a href="../cancel_edit/<%= @page.name %>">Cancel</a> <small>(unlocks page)</small>
23
+ </p>
24
+ </form>
25
+
26
+ <script language="JavaScript1.2">
27
+ function cleanAuthorName() {
28
+ if (document.getElementById('authorName').value == "") {
29
+ document.getElementById('authorName').value = 'AnonymousCoward';
30
+ }
31
+ }
32
+ </script>
33
+
34
+ <%= sub_template "bottom" %>
@@ -0,0 +1,27 @@
1
+ <%
2
+ @title = "Editing Left-Side Menu Options"
3
+ @content_width = 700
4
+ @hide_navigation = true
5
+ %>
6
+ <%= sub_template "top" %>
7
+
8
+ <%= render_markup_help %>
9
+
10
+ <form id="editForm" action="../save_menu" method="post">
11
+ <p>Please choose the format you prefer for the left-size menu:</p>
12
+ <p><input type="radio" name="type" value="all" <%= 'checked' if @menu_type == 'all' %>>All Pages</p>
13
+ <p><input type="radio" name="type" value="revised" <%= 'checked' if @menu_type == 'revised' %>>Recently revised pages</p>
14
+ <p><input type="radio" name="type" value="recent" <%= 'checked' if @menu_type == 'recent' %>>Recently visited pages</p>
15
+ <p><input type="radio" name="type" value="viewed" <%= 'checked' if @menu_type == 'viewed' %>>Most viewed pages</p>
16
+ <p><input type="radio" name="type" value="linkers" <%= 'checked' if @menu_type == 'linkers' %>>Only pages that link other pages (default)</p>
17
+ <p>For the above options you can choose if you want to limit the number of results. Enter the number of items you wish, or 0 for all items: <input type="textfield" size="20", name="limit" value="<%= @list_limit %>" /></p>
18
+ <p><input type="radio" name="type" value="user" <%= 'checked' if @menu_type == 'user' %>>Or just write your own menu contents (as a regular Wiki page):
19
+ <textarea name="content" style="width: 400px; height: 300px"><%= @menu_content %></textarea>
20
+ </p>
21
+ <p>
22
+ <input type="submit" name='action' value="Update">
23
+ <input type="submit" name='action' value="Cancel Update">
24
+ </p>
25
+ </form>
26
+
27
+ <%= sub_template "bottom" %>
@@ -0,0 +1,139 @@
1
+ <% @title = "Edit Web" %>
2
+ <%= sub_template "top" %>
3
+
4
+ <form action="../update_web" id="setup" method="post" onSubmit="cleanAddress(); return validateSetup()">
5
+ <h2 style="margin-bottom: 3px">Name and address</h2>
6
+ <div class="help">
7
+ The name of the web is included in the title on all pages. The address is the base path that all pages within the web live beneath.
8
+ Ex: the address "rails" gives URLs like <i>/rails/show/HomePage</i>.
9
+ </div>
10
+
11
+ <div class="inputBox">
12
+ Name: <input type="text" id="name" name="name" value="<%= @web.name %>" onChange="proposeAddress();"> &nbsp;&nbsp;
13
+ Address: <input type="text" id="address" name="address" value="<%= @web.address %>" onChange="cleanAddress();">
14
+ <i>(Letters & digits only)</i>
15
+ </div>
16
+
17
+ <h2 style="margin-bottom: 3px">Specialize</h2>
18
+ <div class="help">
19
+ Turning safe mode on will strip HTML tags and stylesheet options from the content of all pages.
20
+ Turning on "brackets only" will require all wiki words to be as [[wiki word]] and WikiWord won't work.
21
+ Additions to the stylesheet take precedence over the existing styles. <i>Hint:</i> View source on a page you want to
22
+ style to find ID names on individual tags. <a href="#" onClick="document.getElementById('additionalStyle').style.display='block';return false;">See styles >></a>
23
+ </div>
24
+ <div class="inputBox">
25
+ Markup:
26
+ <select name="markup">
27
+ <%= html_options({ "Textile" => :textile, "Markdown" => :markdown, "RDoc" => :rdoc }, @web.markup) %>
28
+ </select>
29
+
30
+ &nbsp;&nbsp;
31
+
32
+ Color:
33
+ <select name="color">
34
+ <%= html_options({ "Green" => "008B26", "Purple" => "504685", "Red" => "DA0006", "Orange" => "FA6F00", "Grey" => "8BA2B0" },
35
+ @web.color) %>
36
+ </select>
37
+
38
+ &nbsp;&nbsp;
39
+
40
+ <small>
41
+
42
+ <input type="checkbox" name="safe_mode"<%= " CHECKED" if @web.safe_mode %>> Safe mode
43
+
44
+ &nbsp;&nbsp;
45
+
46
+ <input type="checkbox" name="brackets_only"<%= " CHECKED" if @web.brackets_only %>> Brackets only
47
+
48
+ &nbsp;&nbsp;
49
+
50
+ <input type="checkbox" name="count_pages"<%= " CHECKED" if @web.count_pages %>> Count pages
51
+
52
+ </small>
53
+
54
+ <textarea id="additionalStyle" style="display: none; margin-top: 10px; margin-bottom: 5px; width: 560px; height: 200px" name="additional_style"><%= @web.additional_style %></textarea>
55
+ </div>
56
+
57
+ <h2 style="margin-bottom: 3px">Password protection for this web (<%= @web.name %>)</h2>
58
+ <div class="help">
59
+ This is the password that visitors need to view and edit this web. Setting the password to nothing will remove the password protection.
60
+ </div>
61
+ <div class="inputBox">
62
+ Password: <input type="password" id="password" name="password" value="<%= @web.password %>"> &nbsp;&nbsp;
63
+ Verify: <input type="password" id="password_check" value="<%= @web.password %>" name="password_check">
64
+ </div>
65
+
66
+ <h2 style="margin-bottom: 3px">Publish read-only version of this web (<%= @web.name %>)</h2>
67
+ <div class="help">
68
+ You can turn on a read-only version of this web that's accessible even when the regular web is password protected.
69
+ The published version is accessible through URLs like /wiki/published/HomePage.
70
+ </div>
71
+ <div class="inputBox">
72
+ <input type="checkbox" name="published"<%= " CHECKED" if @web.published %>> Publish this web
73
+ </div>
74
+
75
+ <p align="right">
76
+ <small>
77
+ Enter system password
78
+ <input type="password" id="system_password" name="system_password">
79
+ and
80
+ <input type="submit" value="Update Web">
81
+ <br/><br/>
82
+ ...or forget changes and <a href="/new_web/">create a new web</a>
83
+ </small>
84
+ </p>
85
+
86
+ </form>
87
+
88
+ <br/>
89
+ <h1>Other administrative tasks</h1>
90
+
91
+ <form action="../remove_orphaned_pages" id="remove_orphaned_pages" method="post">
92
+
93
+ <p align="right">
94
+ <small>
95
+ Clean up by entering system password
96
+ <input type="password" id="system_password" name="system_password">
97
+ and
98
+ <input type="submit" value="Delete Orphan Pages">
99
+ </small>
100
+ </p>
101
+
102
+ <script>
103
+ function proposeAddress() {
104
+ document.getElementById('address').value =
105
+ document.getElementById('name').value.replace(/[^a-zA-Z0-9]/g, "").toLowerCase();
106
+ }
107
+
108
+ function cleanAddress() {
109
+ document.getElementById('address').value =
110
+ document.getElementById('address').value.replace(/[^a-zA-Z0-9]/g, "").toLowerCase();
111
+ }
112
+
113
+ function validateSetup() {
114
+ if (document.getElementById('system_password').value == "") {
115
+ alert("You must enter the system password");
116
+ return false;
117
+ }
118
+
119
+ if (document.getElementById('name').value == "") {
120
+ alert("You must pick a name for the web");
121
+ return false;
122
+ }
123
+
124
+ if (document.getElementById('address').value == "") {
125
+ alert("You must pick an address for the web");
126
+ return false;
127
+ }
128
+
129
+ if (document.getElementById('password').value != "" &&
130
+ document.getElementById('password').value != document.getElementById('password_check').value) {
131
+ alert("The password and its verification doesn't match");
132
+ return false;
133
+ }
134
+
135
+ return true;
136
+ }
137
+ </script>
138
+
139
+ <%= sub_template "bottom" %>