--
--- TOC entry 39 (OID 536004)
+-- TOC entry 40 (OID 536004)
 -- Name: pages_id_seq; Type: ACL; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 40 (OID 536021)
+-- TOC entry 41 (OID 536021)
 -- Name: contents_id_seq; Type: ACL; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 41 (OID 536371)
+-- TOC entry 42 (OID 536371)
 -- Name: hosts_id_seq; Type: ACL; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 42 (OID 537151)
+-- TOC entry 43 (OID 537151)
 -- Name: images_id_seq; Type: ACL; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 43 (OID 537166)
+-- TOC entry 44 (OID 537166)
 -- Name: files_id_seq; Type: ACL; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 44 (OID 540816)
+-- TOC entry 45 (OID 540816)
 -- Name: users_id_seq; Type: ACL; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 45 (OID 542605)
+-- TOC entry 46 (OID 542605)
 -- Name: contacts_id_seq; Type: ACL; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 50 (OID 536388)
+-- TOC entry 39 (OID 544445)
+-- Name: links; Type: ACL; Schema: public; Owner: rich
+--
+
+REVOKE ALL ON TABLE links FROM PUBLIC;
+GRANT ALL ON TABLE links TO "www-data";
+
+
+--
+-- TOC entry 51 (OID 536388)
 -- Name: hostnames_hostid_name_uq; Type: INDEX; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 51 (OID 536389)
+-- TOC entry 52 (OID 536389)
 -- Name: hostnams_name_uq; Type: INDEX; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 47 (OID 536419)
+-- TOC entry 48 (OID 536419)
 -- Name: pages_url_uq; Type: INDEX; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 52 (OID 536924)
+-- TOC entry 53 (OID 536924)
 -- Name: email_notify_email_uq; Type: INDEX; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 53 (OID 540251)
+-- TOC entry 54 (OID 540251)
 -- Name: images_name_uq; Type: INDEX; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 55 (OID 540252)
+-- TOC entry 56 (OID 540252)
 -- Name: files_name_uq; Type: INDEX; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 58 (OID 540831)
+-- TOC entry 59 (OID 540831)
 -- Name: users_name_uq; Type: INDEX; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 57 (OID 540946)
+-- TOC entry 58 (OID 540946)
 -- Name: users_id_uq; Type: INDEX; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 60 (OID 540970)
+-- TOC entry 61 (OID 540970)
 -- Name: sitemenu_ordering_uq; Type: INDEX; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 61 (OID 540971)
+-- TOC entry 62 (OID 540971)
 -- Name: sitemenu_url_uq; Type: INDEX; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 64 (OID 542626)
+-- TOC entry 65 (OID 542626)
 -- Name: contact_emails_uq; Type: INDEX; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 65 (OID 543505)
+-- TOC entry 66 (OID 543505)
 -- Name: themes_theme_css_uq; Type: INDEX; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 66 (OID 543763)
+-- TOC entry 67 (OID 543763)
 -- Name: page_emails_email_uq; Type: INDEX; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 67 (OID 543795)
+-- TOC entry 68 (OID 543795)
 -- Name: mailing_lists_email_uq; Type: INDEX; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 62 (OID 543880)
+-- TOC entry 63 (OID 543880)
 -- Name: contacts_name_uq; Type: INDEX; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 68 (OID 544454)
+-- TOC entry 69 (OID 544454)
 -- Name: links_uq; Type: INDEX; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 46 (OID 536012)
+-- TOC entry 47 (OID 536012)
 -- Name: pages_pkey; Type: CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 48 (OID 536027)
+-- TOC entry 49 (OID 536027)
 -- Name: contents_pkey; Type: CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 49 (OID 536377)
+-- TOC entry 50 (OID 536377)
 -- Name: hosts_pkey; Type: CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 54 (OID 537158)
+-- TOC entry 55 (OID 537158)
 -- Name: images_pkey; Type: CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 56 (OID 537173)
+-- TOC entry 57 (OID 537173)
 -- Name: files_pkey; Type: CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 59 (OID 540825)
+-- TOC entry 60 (OID 540825)
 -- Name: users_pkey; Type: CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 63 (OID 542611)
+-- TOC entry 64 (OID 542611)
 -- Name: contacts_pkey; Type: CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 73 (OID 536029)
+-- TOC entry 74 (OID 536029)
 -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 76 (OID 536384)
+-- TOC entry 77 (OID 536384)
 -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 74 (OID 536394)
+-- TOC entry 75 (OID 536394)
 -- Name: hosts_hostname_cn; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 69 (OID 536404)
+-- TOC entry 70 (OID 536404)
 -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 77 (OID 536920)
+-- TOC entry 78 (OID 536920)
 -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 78 (OID 537160)
+-- TOC entry 79 (OID 537160)
 -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 79 (OID 537175)
+-- TOC entry 80 (OID 537175)
 -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 70 (OID 539155)
+-- TOC entry 71 (OID 539155)
 -- Name: pages_redirect_cn; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 80 (OID 540827)
+-- TOC entry 81 (OID 540827)
 -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 81 (OID 540837)
+-- TOC entry 82 (OID 540837)
 -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 71 (OID 540942)
+-- TOC entry 72 (OID 540942)
 -- Name: $2; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 72 (OID 540947)
+-- TOC entry 73 (OID 540947)
 -- Name: pages_user_cn; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 82 (OID 540966)
+-- TOC entry 83 (OID 540966)
 -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 83 (OID 540972)
+-- TOC entry 84 (OID 540972)
 -- Name: sitemenu_url_cn; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 84 (OID 542613)
+-- TOC entry 85 (OID 542613)
 -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 85 (OID 542622)
+-- TOC entry 86 (OID 542622)
 -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 75 (OID 543506)
+-- TOC entry 76 (OID 543506)
 -- Name: hosts_theme_css_cn; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 86 (OID 543759)
+-- TOC entry 87 (OID 543759)
 -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 87 (OID 543764)
+-- TOC entry 88 (OID 543764)
 -- Name: page_emails_url_cn; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 88 (OID 543791)
+-- TOC entry 89 (OID 543791)
 -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 89 (OID 544450)
+-- TOC entry 90 (OID 544450)
 -- Name: $1; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 90 (OID 544455)
+-- TOC entry 91 (OID 544455)
 -- Name: links_from_cn; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
 
 --
--- TOC entry 91 (OID 544459)
+-- TOC entry 92 (OID 544459)
 -- Name: links_to_cn; Type: FK CONSTRAINT; Schema: public; Owner: rich
 --
 
 
     cocanwiki_images.cmi 
 cocanwiki_images.cmx: cocanwiki_files.cmx cocanwiki_strings.cmx \
     cocanwiki_images.cmi 
+cocanwiki_links.cmo: wikilib.cmi cocanwiki_links.cmi 
+cocanwiki_links.cmx: wikilib.cmx cocanwiki_links.cmi 
 cocanwiki_ok.cmo: cocanwiki_template.cmi 
 cocanwiki_ok.cmx: cocanwiki_template.cmx 
 cocanwiki_template.cmo: cocanwiki_files.cmo cocanwiki_version.cmo \
 pagestyle.cmx: cocanwiki.cmx 
 preview.cmo: cocanwiki.cmo wikilib.cmi 
 preview.cmx: cocanwiki.cmx wikilib.cmx 
+rebuild_links.cmo: cocanwiki.cmo cocanwiki_links.cmi cocanwiki_template.cmi 
+rebuild_links.cmx: cocanwiki.cmx cocanwiki_links.cmx cocanwiki_template.cmx 
 recent.cmo: cocanwiki.cmo cocanwiki_date.cmo cocanwiki_template.cmi 
 recent.cmx: cocanwiki.cmx cocanwiki_date.cmx cocanwiki_template.cmx 
 restore.cmo: cocanwiki.cmo cocanwiki_diff.cmo cocanwiki_emailnotify.cmo \
 
 # Makefile for COCANWIKI.
-# $Id: Makefile,v 1.28 2004/09/27 12:37:54 rich Exp $
+# $Id: Makefile,v 1.29 2004/09/28 10:56:39 rich Exp $
 
 include ../Makefile.config
 
        cocanwiki.cmo \
        cocanwiki_diff.cmo \
        cocanwiki_emailnotify.cmo \
-       wikilib.cmo
+       wikilib.cmo \
+       cocanwiki_links.cmo
 
 OBJS := 00-TEMPLATE.cmo \
        change_password.cmo \
        page_email_unsubscribe.cmo \
        pagestyle.cmo \
        preview.cmo \
+       rebuild_links.cmo \
        recent.cmo \
        restore.cmo \
        restore_form.cmo \
 
--- /dev/null
+(* COCANWIKI - a wiki written in Objective CAML.
+ * Written by Richard W.M. Jones <rich@merjis.com>.
+ * Copyright (C) 2004 Merjis Ltd.
+ * $Id: cocanwiki_links.ml,v 1.1 2004/09/28 10:56:39 rich Exp $
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *)
+
+open ExtString
+
+let split_tags_re = Pcre.regexp ~flags:[`DOTALL] "<.*?>|[^<]+"
+let internal_re = Pcre.regexp "class=\"internal\""
+let href_re = Pcre.regexp "href=\"/(.*?)\""
+
+let get_links_from_section dbh hostid content =
+  let html = Wikilib.xhtml_of_content dbh hostid content in
+
+  (* Split into attrs and non-attrs.  We end up with a list like this:
+   * [ "<ul>"; "<li>"; "Some text"; "</li>"; ... ]
+   *)
+  let html =
+    try
+      let html = Pcre.extract_all ~rex:split_tags_re html in
+      let html = Array.to_list html in
+      List.map (function [| a |] -> a | _ -> assert false) html
+    with
+       Not_found -> [] in
+
+  (* Only interested in the <a> tags. *)
+  let html = List.filter (fun str -> String.starts_with str "<a ") html in
+
+  (* Only interested in the tags with class="internal". *)
+  let html =
+    List.filter (fun str ->
+                  Pcre.pmatch ~rex:internal_re str
+                  && Pcre.pmatch ~rex:href_re str)
+      html in
+
+  (* Extract the URL names. *)
+  let links = List.map (fun str ->
+                         let subs =
+                           try Pcre.exec ~rex:href_re str
+                           with Not_found -> assert false in
+                         Pcre.get_substring subs 1) html in
+
+  (* Return the list of links. *)
+  links
 
--- /dev/null
+(* COCANWIKI - a wiki written in Objective CAML.
+ * Written by Richard W.M. Jones <rich@merjis.com>.
+ * Copyright (C) 2004 Merjis Ltd.
+ * $Id: cocanwiki_links.mli,v 1.1 2004/09/28 10:56:39 rich Exp $
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *)
+
+val get_links_from_section : Dbi.connection -> int -> string -> string list
 
 (* COCANWIKI - a wiki written in Objective CAML.
  * Written by Richard W.M. Jones <rich@merjis.com>.
  * Copyright (C) 2004 Merjis Ltd.
- * $Id: edit.ml,v 1.12 2004/09/24 15:53:57 rich Exp $
+ * $Id: edit.ml,v 1.13 2004/09/28 10:56:39 rich Exp $
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
       let sth =
        dbh#prepare_cached
          "set constraints pages_redirect_cn, sitemenu_url_cn,
-               page_emails_url_cn deferred" in
+               page_emails_url_cn, links_from_cn, links_to_cn deferred" in
       sth#execute [];
 
       (* Mark the old page as deleted.  NB. There is a small race
 
 (* COCANWIKI - a wiki written in Objective CAML.
  * Written by Richard W.M. Jones <rich@merjis.com>.
  * Copyright (C) 2004 Merjis Ltd.
- * $Id: edit_page_css.ml,v 1.9 2004/09/24 15:53:57 rich Exp $
+ * $Id: edit_page_css.ml,v 1.10 2004/09/28 10:56:39 rich Exp $
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 
   let sth = dbh#prepare_cached
              "set constraints pages_redirect_cn, sitemenu_url_cn,
-                   page_emails_url_cn deferred" in
+                   page_emails_url_cn, links_from_cn, links_to_cn deferred" in
   sth#execute [];
 
   let sth = dbh#prepare_cached "update pages set url_deleted = url,
 
 (* COCANWIKI - a wiki written in Objective CAML.
  * Written by Richard W.M. Jones <rich@merjis.com>.
  * Copyright (C) 2004 Merjis Ltd.
- * $Id: edit_page_title.ml,v 1.1 2004/09/25 16:05:03 rich Exp $
+ * $Id: edit_page_title.ml,v 1.2 2004/09/28 10:56:40 rich Exp $
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 
   let sth = dbh#prepare_cached
              "set constraints pages_redirect_cn, sitemenu_url_cn,
-                   page_emails_url_cn deferred" in
+                   page_emails_url_cn, links_from_cn, links_to_cn deferred" in
   sth#execute [];
 
   let sth = dbh#prepare_cached "update pages set url_deleted = url,
 
--- /dev/null
+(* COCANWIKI - a wiki written in Objective CAML.
+ * Written by Richard W.M. Jones <rich@merjis.com>.
+ * Copyright (C) 2004 Merjis Ltd.
+ * $Id: rebuild_links.ml,v 1.1 2004/09/28 10:56:40 rich Exp $
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *)
+
+open Apache
+open Registry
+open Cgi
+open Printf
+
+open Cocanwiki
+open Cocanwiki_template
+open Cocanwiki_links
+
+let run r (q : cgi) (dbh : Dbi.connection) hostid _ _ =
+  let template_start = _get_template "rebuild_links_start.html" in
+  let template = _get_template "rebuild_links.html" in
+  let template_done = _get_template "rebuild_links_done.html" in
+
+  (* Delete entries in the old links table. *)
+  let sth = dbh#prepare_cached "delete from links where hostid = ?" in
+  sth#execute [`Int hostid];
+
+  (* Estimate how many sections we will have to process. *)
+  let sth =
+    dbh#prepare_cached
+      "select count(c.id) from contents c, pages p
+        where c.pageid = p.id
+          and p.hostid = ?
+          and p.url is not null
+          and p.redirect is null" in
+  sth#execute [`Int hostid];
+
+  let total_sections = sth#fetch1int () in
+
+  (* Pull out the list of sections to process. *)
+  let sth =
+    dbh#prepare_cached
+      "select c.content, c.ordering, p.url from contents c, pages p
+        where c.pageid = p.id
+          and p.hostid = ?
+          and p.url is not null
+          and p.redirect is null
+        order by p.url, c.ordering" in
+  sth#execute [`Int hostid];
+
+  q#header ();
+  print_string r template_start#to_string;
+
+  let insert_link =
+    let sth =
+      dbh#prepare_cached "insert into links (hostid, from_url, to_url)
+                          values (?, ?, ?)" in
+    fun from_url to_url ->
+      sth#execute [`Int hostid; `String from_url; `String to_url]
+  in
+
+  (* Process each section ... *)
+  let i = ref 0 in
+
+  sth#iter
+    (function [`String content; `Int ordering; `String url] ->
+       let pc = 100 * !i / total_sections in incr i;
+       template#set "ordering" (string_of_int ordering);
+       template#set "url" url;
+       template#set "pc" (string_of_int pc);
+       print_string r template#to_string;
+
+       let links = get_links_from_section dbh hostid content in
+       List.iter (insert_link url) links
+
+       | _ -> assert false);
+
+  (* Finish off. *)
+  dbh#commit ();
+
+  print_string r template_done#to_string
+
+let () =
+  register_script ~restrict:[CanManageSite] run
 
 (* COCANWIKI - a wiki written in Objective CAML.
  * Written by Richard W.M. Jones <rich@merjis.com>.
  * Copyright (C) 2004 Merjis Ltd.
- * $Id: restore.ml,v 1.9 2004/09/24 15:53:57 rich Exp $
+ * $Id: restore.ml,v 1.10 2004/09/28 10:56:40 rich Exp $
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
     let sth =
       dbh#prepare_cached
        "set constraints pages_redirect_cn, sitemenu_url_cn,
-             page_emails_url_cn deferred" in
+             page_emails_url_cn, links_from_cn, links_to_cn deferred" in
     sth#execute [];
 
     let sth = dbh#prepare_cached "update pages set url_deleted = url,
 
 <a href="/_bin/edit_host_settings_form.cmo">Edit these settings ...</a>
 </p>
 
+<h2>Site maintenance</h2>
+
+<ul>
+<li> <a href="/_bin/rebuild_links.cmo">Rebuild link structure</a>
+</ul>
+
 <ul id="topmenu" class="menu">
 <li class="first"> <a href="/">Home page</a> </li>
 <li> <a href="/_sitemap">Sitemap</a> </li>
 
--- /dev/null
+<script type="text/javascript">//<!--
+progress_div.setAttribute ("style", "width: ::pc::%");
+name_p.innerHTML = "::url_html:: (::ordering_html::) ::pc::%";
+//--></script>
+<noscript>
+<p> Processing <strong>/::url_html::</strong> section ::ordering_html::,
+approximately ::pc_html::% done. </p>
+</noscript>
+<!-- 4096 blank characters                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                -->
\ No newline at end of file
 
--- /dev/null
+<script type="text/javascript">//<!--
+progress_div.setAttribute ("style", "width: 100%");
+name_p.innerHTML = "Finished";
+//--></script>
+<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
+<p>
+<a href="/_bin/host_menu.cmo">Back to global settings</a>
+</p>
\ No newline at end of file
 
--- /dev/null
+<div id="outer"><div id="progress"></div></div>
+<p id="name">This is a test</p>
+<style type="text/css"><!--
+body {
+  font-size: 1.5em;
+  font-family: arial, helvetica, sans-serif;
+}
+div#outer {
+  position: absolute;
+  top: 1em;
+  left: 5%;
+  z-index: 0;
+  width: 90%;
+  border: 1px solid #000;
+}
+div#progress {
+  z-index: 1;
+  width: 50%;
+  height: 2em;
+  background-color: #ccf;
+}
+p#name {
+  position: absolute;
+  top: 0.5em;
+  left: 5%;
+  z-index: 2;
+  width: 90%;
+  text-align: center;
+  font-weight: bold;
+}
+--></style>
+<script type="text/javascript">//<!--
+var progress_div = document.getElementById ("progress");
+var name_p = document.getElementById ("name");
+//--></script>