Index: openacs-4/packages/xowiki/xowiki.info
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/xowiki.info,v
diff -u -r1.75 -r1.76
--- openacs-4/packages/xowiki/xowiki.info	27 Feb 2008 09:52:01 -0000	1.75
+++ openacs-4/packages/xowiki/xowiki.info	10 Mar 2008 13:16:02 -0000	1.76
@@ -8,11 +8,11 @@
     <singleton-p>f</singleton-p>
     <auto-mount>xowiki</auto-mount>
 
-    <version name="0.81" url="http://openacs.org/repository/download/apm/xowiki-0.81.apm">
+    <version name="0.82" url="http://openacs.org/repository/download/apm/xowiki-0.82.apm">
         <owner url="mailto:neumann@wu-wien.ac.at">Gustaf Neumann</owner>
         <summary>A more generic xotcl-based wikis example with object types
 and subtypes based on the content repository (with category support)</summary>
-        <release-date>2008-02-27</release-date>
+        <release-date>2008-03-10</release-date>
         <vendor>Gustaf Neumann, WU Wien</vendor>
         <description format="text/html">&lt;pre&gt;
 XoWiki is a Wiki implementation for OpenACS in XOTcl. Instead of
@@ -54,16 +54,16 @@
         <license>BSD-Style</license>
         <maturity>0</maturity>
 
-        <provides url="xowiki" version="0.81"/>
+        <provides url="xowiki" version="0.82"/>
         <requires url="acs-datetime" version="4.0"/>
         <requires url="categories" version="1.0d3"/>
         <requires url="file-storage" version="4.7d3"/>
         <requires url="general-comments" version="4.6.1"/>
-        <requires url="xotcl-core" version="0.81"/>
+        <requires url="xotcl-core" version="0.82"/>
 
         <callbacks>
-            <callback type="before-uninstall"  proc="::xowiki::before-uninstall"/>
             <callback type="after-install"  proc="::xowiki::after-install"/>
+            <callback type="before-uninstall"  proc="::xowiki::before-uninstall"/>
             <callback type="after-upgrade"  proc="::xowiki::upgrade_callback"/>
         </callbacks>
         <parameters>
Index: openacs-4/packages/xowiki/catalog/xowiki.de_DE.ISO-8859-1.xml
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/catalog/xowiki.de_DE.ISO-8859-1.xml,v
diff -u -r1.29 -r1.30
--- openacs-4/packages/xowiki/catalog/xowiki.de_DE.ISO-8859-1.xml	2 Dec 2007 21:38:40 -0000	1.29
+++ openacs-4/packages/xowiki/catalog/xowiki.de_DE.ISO-8859-1.xml	10 Mar 2008 13:16:02 -0000	1.30
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<message_catalog package_key="xowiki" package_version="0.79" locale="de_DE" charset="ISO-8859-1">
+<message_catalog package_key="xowiki" locale="de_DE" charset="ISO-8859-1">
 
   <msg key="abstract">Zusammenfassung</msg>
   <msg key="admin">Verwalten</msg>
@@ -21,8 +21,8 @@
   <msg key="event-title_of_lecture">Vortragstitel</msg>
   <msg key="Form-form">Formular</msg>
   <msg key="Form-form_constraints">Einschr�nkungen</msg>
-  <msg key="form-menu-answer_link">Eintr�ge f�r dieses Formular</msg>
-  <msg key="form-menu-new_link">Formular ausf�llen</msg>
+  <msg key="form-menu-button-answers">Eintr�ge f�r dieses Formular</msg>
+  <msg key="form-menu-button-new">Formular ausf�llen</msg>
   <msg key="index">Index</msg>
   <msg key="new_page">Neuer Eintrag</msg>
   <msg key="news-source">Quelle</msg>
@@ -55,7 +55,7 @@
   <msg key="revisions">Verlauf</msg>
   <msg key="search">Suche</msg>
   <msg key="title">Titel</msg>
-  <msg key="title_of_event">Titel
+  <msg key="title_of_event">Titel
 </msg>
   <msg key="view">Ansehen</msg>
   <msg key="weblog-more">mehr...</msg>
Index: openacs-4/packages/xowiki/catalog/xowiki.en_US.ISO-8859-1.xml
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/catalog/xowiki.en_US.ISO-8859-1.xml,v
diff -u -r1.35 -r1.36
--- openacs-4/packages/xowiki/catalog/xowiki.en_US.ISO-8859-1.xml	2 Dec 2007 21:38:40 -0000	1.35
+++ openacs-4/packages/xowiki/catalog/xowiki.en_US.ISO-8859-1.xml	10 Mar 2008 13:16:02 -0000	1.36
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<message_catalog package_key="xowiki" package_version="0.79" locale="en_US" charset="ISO-8859-1">
+<message_catalog package_key="xowiki" locale="en_US" charset="ISO-8859-1">
 
   <msg key="abstract">Abstract</msg>
   <msg key="admin">Admin</msg>
@@ -39,8 +39,11 @@
   <msg key="File-name-help_text">Can be obtained from the name of the uploaded file</msg>
   <msg key="Form-form">Form</msg>
   <msg key="Form-form_constraints">Form Constraints</msg>
-  <msg key="form-menu-answer_link">Entries for this form</msg>
-  <msg key="form-menu-new_link">Fill out</msg>
+  <msg key="form-menu-button-answers">Entries for this form</msg>
+  <msg key="form-menu-button-form">Form %form_name%</msg>
+  <msg key="form-menu-button-new">Fill out</msg>
+  <msg key="form-menu-button-wf">Workflow %form_name%</msg>
+  <msg key="form-menu-button-wf-instances">Instances of %form_name%</msg>
   <msg key="Form-submit_button">       OK       </msg>
   <msg key="Form-template">Template</msg>
   <msg key="Form-validate_form_constraints">%errorMsg%</msg>
@@ -83,7 +86,7 @@
   <msg key="revisions">Revisions</msg>
   <msg key="richtext-validate_safe_html">%errorMsg%</msg>
   <msg key="search">Search</msg>
-  <msg key="title_of_event">Title
+  <msg key="title_of_event">Title
 </msg>
   <msg key="view">View</msg>
   <msg key="weblog-more">more...</msg>
Index: openacs-4/packages/xowiki/catalog/xowiki.es_ES.ISO-8859-1.xml
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/catalog/xowiki.es_ES.ISO-8859-1.xml,v
diff -u -r1.9 -r1.10
--- openacs-4/packages/xowiki/catalog/xowiki.es_ES.ISO-8859-1.xml	26 Nov 2007 09:14:43 -0000	1.9
+++ openacs-4/packages/xowiki/catalog/xowiki.es_ES.ISO-8859-1.xml	10 Mar 2008 13:16:02 -0000	1.10
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<message_catalog package_key="xowiki" package_version="0.79" locale="es_ES" charset="ISO-8859-1">
+<message_catalog package_key="xowiki" locale="es_ES" charset="ISO-8859-1">
 
   <msg key="admin">Administrar</msg>
   <msg key="back">Volver</msg>
Index: openacs-4/packages/xowiki/tcl/form-field-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/form-field-procs.tcl,v
diff -u -r1.53 -r1.54
--- openacs-4/packages/xowiki/tcl/form-field-procs.tcl	31 Jan 2008 19:19:26 -0000	1.53
+++ openacs-4/packages/xowiki/tcl/form-field-procs.tcl	10 Mar 2008 13:16:02 -0000	1.54
@@ -336,6 +336,10 @@
     return $v
   }
 
+  FormField instproc value_if_nothing_is_returned_from_from {default} {
+    return $default
+  }
+
   FormField instproc pretty_value {v} {
     if {[my exists options]} {
       foreach o [my set options] {
@@ -1135,6 +1139,9 @@
   Class FormField::boolean -superclass FormField::radio -parameter {
     {default t}
   }
+  FormField::boolean instproc value_if_nothing_is_returned_from_from {default} {
+    return f
+  }
   FormField::boolean instproc initialize {} {
     # should be with cvs head message catalogs:
     # my options {{#acs-kernel.common_No# f} {#acs-kernel.common_Yes# t}}
Index: openacs-4/packages/xowiki/tcl/includelet-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/includelet-procs.tcl,v
diff -u -r1.15 -r1.16
--- openacs-4/packages/xowiki/tcl/includelet-procs.tcl	28 Feb 2008 09:04:30 -0000	1.15
+++ openacs-4/packages/xowiki/tcl/includelet-procs.tcl	10 Mar 2008 13:16:02 -0000	1.16
@@ -2091,7 +2091,8 @@
   }
 
 
-  ::xowiki::IncludeletClass create create-item-button -superclass ::xowiki::includelet::item-button \
+  ::xowiki::IncludeletClass create create-item-button \
+      -superclass ::xowiki::includelet::item-button \
       -parameter {
         {__decoration none}
         {src /resources/acs-subsite/Add16.gif}
@@ -2509,54 +2510,77 @@
 
 namespace eval ::xowiki::includelet {
   #############################################################################
+  Class create form-menu-button \
+      -parameter {
+        form
+        method
+        link
+        package_id
+        base
+        return_url
+        {label_suffix ""}
+      }
+  form-menu-button instproc render {} {
+    my instvar package_id base form method return_url label_suffix link
+    if {![info exists link]} {
+      set link [$package_id make_link -link $base $form $method return_url]
+    }
+    if {$link eq ""} {
+      return ""
+    }
+    set msg_key [namespace tail [my info class]]
+    set label [_ xowiki.$msg_key [list form_name [$form name]]]$label_suffix
+    return "<a href='$link'>$label</a>"
+  }
+
+  Class form-menu-button-new -superclass form-menu-button -parameter {
+    {method create-new}
+  }
+  Class form-menu-button-answers -superclass form-menu-button -parameter {
+    {method list}
+  }
+  form-menu-button-answers instproc render {} {
+    set count [[my form] count_usages]
+    my label_suffix " ($count)"
+    next
+  }
+
+  Class form-menu-button-form -superclass form-menu-button -parameter {
+    {method view}
+  }
+
+
   ::xowiki::IncludeletClass create form-menu \
       -superclass ::xowiki::Includelet \
       -parameter {
         {__decoration none}
         {parameter_declaration {
-          {-form_item_id:integer,required}
+          {-form_item_id:integer}
+          {-buttons {new answers}}
+          {-button_objs}
+          {-return_url}
         }}
       }
   
   form-menu instproc render {} {
     my get_parameters
-    # todo return_url
     my instvar __including_page
-    set base [$package_id pretty_link [$__including_page name]]
-    set new_link [$package_id make_link -link $base $__including_page create-new return_url]
-    set answer_link [$package_id make_link -link $base $__including_page list return_url]
-    set template [::xo::db::CrClass get_instance_from_db -item_id $form_item_id]
-    set count [$template count_usages]
-    set links [list]
-    foreach l [list new_link answer_link] {
-      if {[set $l] ne ""} {
-        set label #xowiki.form-menu-$l#
-        if {$l eq "answer_link"} {append label " ($count) "}
-        lappend links "<a href='[set $l]'>$label</a>"
+    if {![info exists button_objs]} {
+      set form [::xo::db::CrClass get_instance_from_db -item_id $form_item_id]
+      set base [$package_id pretty_link [$form name]]
+      foreach b $buttons {
+        set obj  [form-menu-button-$b new -volatile -package_id $package_id \
+                      -base $base -form $form]
+        if {[info exists return_url]} {$obj return_url $return_url}
+        lappend button_objs $obj
       }
     }
+    set links [list]
+    foreach b $button_objs { lappend links [$b render] }
     return "<div style='clear: both;'><div class='wiki-menu'>[join $links { &middot; }]</div></div>\n"
   }
 
   #############################################################################
-  ::xowiki::IncludeletClass create form-entry-menu \
-      -superclass ::xowiki::Includelet \
-      -parameter {
-        {__decoration none}
-        {parameter_declaration {
-        }}
-      }
-  
-  form-entry-menu instproc render {} {
-    my get_parameters
-    my instvar __including_page
-    set form [$__including_page page_template]
-    set base [$package_id pretty_link [$form name]]
-    return "<div style='clear: both;'><div class='wiki-menu'><a href='$base'>Form [$form name]</a>\
-	</div></div>\n"
-  }
-
-  #############################################################################
   ::xowiki::IncludeletClass create form-usages \
       -superclass ::xowiki::Includelet \
       -parameter {
@@ -2574,6 +2598,7 @@
   form-usages instproc render {} {
     my get_parameters
     my instvar __including_page
+    set o $__including_page
 
     ::xo::Page requireCSS "/resources/acs-templating/lists.css"
     set return_url [::xo::cc url]?[::xo::cc actual_query]
@@ -2584,12 +2609,12 @@
     }
 
     set form_item [::xowiki::Form get_instance_from_db -item_id $form_item_id]
-    $form_item destroy_on_cleanup
+    set form_constraints [$form_item get_form_constraints $o]
 
     if {![info exists field_names]} {
       set fn [::xowiki::PageInstance get_short_spec_from_form_constraints \
                   -name @table \
-                  -form_constraints [$form_item form_constraints]]
+                  -form_constraints $form_constraints]
       set field_names [split $fn ,]
     }
     if {$field_names eq ""} {
@@ -2607,7 +2632,6 @@
     #my msg sql_atts=$sql_atts
     #my msg field_names=$field_names
 
-    set form_constraints [$form_item form_constraints]
     # set cr_field_spec [::xowiki::PageInstance get_short_spec_from_form_constraints \
     #                            -name @cr_fields \
     #                            -form_constraints $form_constraints]
Index: openacs-4/packages/xowiki/tcl/package-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/package-procs.tcl,v
diff -u -r1.111 -r1.112
--- openacs-4/packages/xowiki/tcl/package-procs.tcl	29 Jan 2008 12:06:25 -0000	1.111
+++ openacs-4/packages/xowiki/tcl/package-procs.tcl	10 Mar 2008 13:16:02 -0000	1.112
@@ -175,7 +175,7 @@
   #
   # conditional links
   #
-  Package ad_instproc make_link {{-with_entities 1} -privilege -link object method args} {
+  Package ad_instproc make_link {{-with_entities 0} -privilege -link object method args} {
     Creates conditionally a link for use in xowiki. When the generated link 
     will be activated, the specified method of the object will be invoked.
     make_link checks in advance, wether the actual user has enough 
@@ -611,12 +611,17 @@
     set added 0
     set replaced 0
     set updated 0
+    set todo [list]
 
     foreach o $objects {
       $o demarshall -parent_id $folder_id -package_id $package_id -creation_user $user_id
 
       # page instances have references to page templates, add these first
-      if {[$o istype ::xowiki::PageInstance]} continue
+      if {[$o istype ::xowiki::PageInstance]} {
+        lappend todo $o
+        continue
+      }
+      my log "importing (1st round) $o [$o name] [$o info class]"
 
       set item_id [::xo::db::CrClass lookup -name [$o set name] -parent_id $folder_id]
       if {$item_id != 0} {
@@ -637,33 +642,49 @@
       }
     }
 
-    foreach o $objects {
-      if {[$o istype ::xowiki::PageInstance]} {
+    while {[llength $todo] > 0} {
+      my log "importing (2nd round) todo=$todo"
+      set c 0
+      set found 0
+      foreach o $todo {
 	set old_template_id [$o set page_template]
 	set template_id [::xo::db::CrClass lookup \
-			  -name [::$old_template_id set name] \
-			  -parent_id $folder_id]
-        db_transaction {
-          set item_id [::xo::db::CrClass lookup -name [$o set name] -parent_id $folder_id]
-          if {$item_id != 0} {
-	    if {$replace} { ;# we delete the original
-	      ::xo::db::CrClass delete -item_id $item_id
-	      set item_id 0
-	      incr replaced
-	    } else {
-	      ::xo::db::CrClass get_instance_from_db -item_id $item_id
-	      $item_id copy_content_vars -from_object $o
-              $item_id set page_template $template_id
-	      $item_id save -use_given_publish_date [$item_id exists publish_date]
-	      incr updated
-	    }
-	  }
-	  if {$item_id == 0} {  ;# the item does not exist -> update reference and save
-	    $o set page_template $template_id
-            $o save_new -use_given_publish_date [$o exists publish_date]
-            incr added
+                             -name [::$old_template_id set name] \
+                             -parent_id $folder_id ]
+        if {$template_id == 0} {
+          my log "importing (2nd round) delay import of $o"
+          incr c
+        } else {
+          set todo [lreplace $todo $c $c]
+          set found 1
+          break
+        }
+      }
+      if {$found == 0} {
+        my log "can't resolve dependencies in $todo"
+        break
+      }
+      my log "importing (2nd round) process $o, todo=$todo"
+      db_transaction {
+        set item_id [::xo::db::CrClass lookup -name [$o set name] -parent_id $folder_id]
+        if {$item_id != 0} {
+          if {$replace} { ;# we delete the original
+            ::xo::db::CrClass delete -item_id $item_id
+            set item_id 0
+            incr replaced
+          } else {
+            ::xo::db::CrClass get_instance_from_db -item_id $item_id
+            $item_id copy_content_vars -from_object $o
+            $item_id set page_template $template_id
+            $item_id save -use_given_publish_date [$item_id exists publish_date]
+            incr updated
           }
         }
+        if {$item_id == 0} {  ;# the item does not exist -> update reference and save
+          $o set page_template $template_id
+          $o save_new -use_given_publish_date [$o exists publish_date]
+          incr added
+        }
       }
     }
     foreach o $objects {$o destroy}
Index: openacs-4/packages/xowiki/tcl/xowiki-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/xowiki-procs.tcl,v
diff -u -r1.209 -r1.210
--- openacs-4/packages/xowiki/tcl/xowiki-procs.tcl	1 Mar 2008 18:36:01 -0000	1.209
+++ openacs-4/packages/xowiki/tcl/xowiki-procs.tcl	10 Mar 2008 13:16:02 -0000	1.210
@@ -353,6 +353,8 @@
       publish_status 1 item_id 1 revision_id 1 last_modified 1 parent_id 1
     }
     foreach var [$from_object info vars] {
+      # don't copy vars starting with "__"
+      if {[string match "__*" $var]} continue
       if {![info exists excluded_var($var)]} {
         my set $var [$from_object set $var]
       }
@@ -1025,7 +1027,7 @@
   }
 
   Page instproc lookup_form_field {
-    -name 
+    -name:required
     form_fields
   } {
     set key ::_form_field_names($name)
@@ -1039,6 +1041,17 @@
     error "No form field with name $name found"
   }
 
+  Page instproc lookup_cached_form_field {
+    -name:required
+  } {
+    set key ::_form_field_names($name)
+    #my msg "FOUND($name)=[info exists $key]"
+    if {[info exists $key]} {
+      return [set $key]
+    }
+    error "No form field with name $name found"
+  }
+
   Page instproc show_fields {form_fields} {
     # this method is for debugging only
     set msg ""
@@ -1219,23 +1232,19 @@
   }
 
   PageInstance instproc get_short_spec {name} {
-    #my msg "get_short_spec $name"
     my instvar page_template
-    # in the old-fashioned 2-form page-instance create, page_template
-    # might be non-existant or empty.
-    if {[info exists page_template] && $page_template ne "" &&
-        [$page_template exists form_constraints]} {
-      set short_spec [::xowiki::PageInstance get_short_spec_from_form_constraints \
-                          -name $name -form_constraints [$page_template form_constraints]]
-      if {$short_spec ne ""} {
-        return $short_spec
-      }
+    set form_constraints [my get_from_template form_constraints]
+    #my msg "get_short_spec $name c=$form_constraints"
+    if {$form_constraints ne ""} {
+      return [::xowiki::PageInstance get_short_spec_from_form_constraints \
+                  -name $name -form_constraints $form_constraints]
     }
     return ""
   }
 
   PageInstance instproc get_field_label {name value} {
     set short_spec [my get_short_spec $name]
+    #my msg "short_spec for $name = '$short_spec'"
     if {$short_spec ne ""} {
       set f [FormField new -volatile -name $name -spec $short_spec]
       return [$f pretty_value $value]
@@ -1272,14 +1281,26 @@
     return $default_spec
   }
 
+  PageInstance instproc get_form_id {} {
+    return [my page_template]
+  }
+ 
+  Page instproc get_form_constraints {form_item} {
+    # Whis method determines the form constraints typically
+    # from the form item object (::xowiki::Form)
+    # We define it as a method of Page to ease overloading.
+    return [$form_item form_constraints]
+  }
+
   PageInstance instproc get_from_template {var} {
     my instvar page_template
-    if {[info command ::$page_template] eq ""} {
+    set form_id [my get_form_id]
+    if {![my isobject ::$form_id]} {
       #my log  "-- fetching page_template = $page_template"
-      ::xo::db::CrClass get_instance_from_db -item_id $page_template
-      $page_template destroy_on_cleanup
+      ::xo::db::CrClass get_instance_from_db -item_id $form_id
     }
-    return [$page_template set $var]
+    if {[::$form_id exists $var]} {return [::$form_id set $var]}
+    return ""
   }
 
   PageInstance instproc get_content {} {
@@ -1299,6 +1320,7 @@
     array set __ia [my template_vars $content]
     # add extra variables as instance attributes
     array set __ia [my set instance_attributes]
+
     foreach var [array names __ia] {
       #my log "-- set $var [list $__ia($var)]"
       # TODO: just for the lookup, whether a field is a richt text field,
@@ -1315,6 +1337,10 @@
     }
     next
   }
+  PageInstance instproc count_usages {{-all false}} {
+    # TODO: if we continue this approach, this method should go into Page
+    return [::xowiki::PageTemplate count_usages -item_id [my item_id] -all $all]
+  }
 
   #
   # Methods of ::xowiki::Object
@@ -1386,7 +1412,9 @@
     return $content
   }
 
-  Form instproc list {} {
+
+  Page instproc list {} {
+    # todo move me
     my view [my include [list form-usages -form_item_id [my item_id]]]
   }
 
@@ -1426,11 +1454,31 @@
   #
   # Methods of ::xowiki::FormPage
   #
+  FormPage instproc initialize_loaded_object {} {
+    if {[my exists page_template]} {
+      ::xo::db::CrClass get_instance_from_db -item_id [my page_template]
+    }
+    my array set __ia [my instance_attributes]
+    next
+  }
+
+  FormPage instproc property {name} {
+    if {[string match "_*" $name]} {
+      set key [string range $name 1 end]
+    } {
+      set key  __ia($name)
+    }
+    if {[my exists $key]} {
+      return [my set $key]
+    }
+    return ""
+  }
+
   FormPage instproc footer {} {
     if {[my exists __no_form_page_footer]} {
       next
     } else {
-      return [my include [list form-entry-menu]]
+      return [my include [list form-menu -form_item_id $form_item_id -buttons form]]
     }
   }
 
@@ -1492,38 +1540,27 @@
       my array unset field_in_form
       if {$form_vars} {foreach v $field_names {my set field_in_form($v) 1}}
       set form_fields [my create_form_fields $field_names]
+      my load_values_into_form_fields $form_fields
       set form [my regsub_eval  \
 		    [template::adp_variable_regexp] $form \
 		    {my form_field_as_html -mode display "\\\1" "\2" $form_fields}]
       
       dom parse -simple -html $form doc
       $doc documentElement root
-      my set_form_data  $form_fields
+      my set_form_data $form_fields
       return [Form disable_input_fields [$root asHTML]]
     }
   }
 
   FormPage instproc get_value {before varname} {
     #my msg "varname=$varname"
-    array set __ia [my set instance_attributes]
-    switch -glob $varname {
-      _*      {set value [my set [string range $varname 1 end]]}
-      default {
-        if {[info exists __ia($varname)]} {
-          set value [set __ia($varname)]
-        } elseif {[my exists $varname]} {
-          set value [my $varname]
-        } else {
-          my log "**** unknown variable '$varname' ****"
-          #my msg "**** [my set instance_attributes]"
-          set value ""
-        }
-      }
-    }
+    set value [my property $varname]
 
+    # todo: might be more efficient to check, if it exists already
     set f [my create_raw_form_field -name $varname \
                -slot [my find_slot [string trimleft $varname _]] \
                -configuration [list -value $value]]
+
     if {[$f hide_value]} {
       set value ""
     } else {
@@ -1545,6 +1582,8 @@
 
   Page instproc save_data {{-use_given_publish_date:boolean false} old_name category_ids} {
     #my log "-- [self args]"
+    # never cache __ia
+    my array unset __ia
     my instvar package_id name
     db_transaction {
       #
Index: openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl,v
diff -u -r1.130 -r1.131
--- openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl	11 Feb 2008 02:18:35 -0000	1.130
+++ openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl	10 Mar 2008 13:16:02 -0000	1.131
@@ -606,46 +606,51 @@
     #
     foreach f $form_fields {
       #my msg "validate $f [$f name] [info exists processed([$f name])]"
-       set att [$f name]
+      set att [$f name]
  
-       # Certain form field types (e.g. checkboxes) are not transmitted, if not
-       # checked. Therefore, we have not processed these fields above and
-       # have to do it now.
-       
-       if {![info exists processed($att)]} {
-         #my msg "form field $att not yet processed"
-         switch -glob -- $att {
-           __* {
-             # other internal variables (like __object_name) are ignored
-           }
-           _* {
-             # instance attribute fields
-             set value [$f value ""]
-             set varname [string range $att 1 end]
-             if {![string match *.* $att]} {my set $varname $value}
-           }
-           default {
-             # user form content fields
-             if {[$f istype ::xowiki::FormField::boolean]} {
-               # boolean not "checked" means false
-               set value f
-             } else {
-               set value [$f value ""]
-             }
-             if {![string match *.* $att]} {set __ia($att)  $value}
-           }
+      # Certain form field types (e.g. checkboxes) are not transmitted, if not
+      # checked. Therefore, we have not processed these fields above and
+      # have to do it now.
+      
+      if {![info exists processed($att)]} {
+	#my msg "form field $att not yet processed"
+	switch -glob -- $att {
+	  __* {
+	    # other internal variables (like __object_name) are ignored
+	  }
+	  _* {
+	    # instance attribute fields
+	    set varname [string range $att 1 end]
+            set preset ""
+            if {[my exists $varname]} {set preset [my set $varname]}
+            set v [$f value_if_nothing_is_returned_from_from $preset]
+            set value [$f value $v]
+            if {$v ne $preset} {
+              if {![string match *.* $att]} {my set $varname $value}
+            }
+	  }
+	  default {
+	    # user form content fields
+            set preset ""
+            if {[info exists __ia($att)]} {set preset $__ia($att)}
+            set v [$f value_if_nothing_is_returned_from_from $preset]
+            set value [$f value $v]
+            if {$v ne $preset} {
+              if {![string match *.* $att]} {set __ia($att) $value}
+            }
+	  }
          }
-       }
-
+      }
+      
        #
        # Run validators
        #
   
-      set validation_error [$f validate [self]]
-      #my msg "validation of [$f name] with value '[$f value]' returns $validation_error"
-      if {$validation_error ne ""} {
-        $f error_msg $validation_error
-        incr validation_errors
+       set validation_error [$f validate [self]]
+       #my msg "validation of [$f name] with value '[$f value]' returns $validation_error"
+       if {$validation_error ne ""} {
+	 $f error_msg $validation_error
+	 incr validation_errors
       }
     }
     #my msg "--set instance attributes to [array get __ia]"
@@ -661,7 +666,7 @@
     if {!$found} {
       set f [my create_raw_form_field -name $name -slot [my find_slot $name]]
     }
-    #my msg "$name mode=$mode type=[$f set type]"
+    #my msg "$found $name mode=$mode type=[$f set type] value=[$f value]"
     if {$mode eq "edit" || [$f display_field]} {
       set html [$f asHTML]
     } else {
@@ -810,7 +815,7 @@
         }
       } else {
         #
-        # perform standard bult update (with revision)
+        # perform standard update (with revision)
         # 
         my save_data \
             -use_given_publish_date [expr {[lsearch $field_names _publish_date] > -1}] \
@@ -828,6 +833,27 @@
         [my query_parameter "return_url" [$package_id pretty_link [my name]]]
   }
 
+
+  FormPage instproc load_values_into_form_fields {form_fields} {
+    array set __ia [my set instance_attributes]
+    foreach f $form_fields {
+      set att [$f name]
+      switch -glob $att {
+        __* {}
+        _* {
+          set varname [string range $att 1 end]
+          $f value [my set $varname]
+        }
+        default {
+          if {[info exists __ia($att)]} {
+            #my msg "setting $f ([$f info class]) value $__ia($att)"
+            $f value $__ia($att)
+          }
+        }
+      }
+    }
+  }
+
   FormPage instproc edit {
     {-validation_errors ""}
   } {
@@ -915,26 +941,28 @@
       }
 
       array set __ia [my set instance_attributes]
-      foreach att $field_names {
-        #my msg "setting HTML att $att"
-        switch -glob $att {
-          __* {}
-          _* {
-            set f [my lookup_form_field -name $att $form_fields]
-            set varname [string range $att 1 end]
-            $f value [my set $varname]
-          }
-          default {
-            set f [my lookup_form_field -name $att $form_fields]
-            #my msg "check $att f=$f [info exists __ia($att)]"
-            if {[info exists __ia($att)]} {
-              #my msg "setting $f ([$f info class]) value $__ia($att)"
-              $f value $__ia($att)
-            }
-          }
-        }
-	set ff($att) $f
-      }
+      my load_values_into_form_fields $form_fields
+      foreach f $form_fields {set ff([$f name]) $f }
+#       foreach att $field_names {
+#         #my msg "setting HTML att $att"
+#         switch -glob $att {
+#           __* {}
+#           _* {
+#             set f [my lookup_form_field -name $att $form_fields]
+#             set varname [string range $att 1 end]
+#             $f value [my set $varname]
+#           }
+#           default {
+#             set f [my lookup_form_field -name $att $form_fields]
+#             #my msg "check $att f=$f [info exists __ia($att)]"
+#             if {[info exists __ia($att)]} {
+#               #my msg "setting $f ([$f info class]) value $__ia($att)"
+#               $f value $__ia($att)
+#             }
+#           }
+#         }
+# 	set ff($att) $f
+#       }
 
       # for named entries, just set the entry fields to empty,
       # without changing the instance variables
@@ -1254,25 +1282,6 @@
 #     return $name
 #   }
 
-#   Page instproc create-new {} {
-#     my instvar package_id
-#     set name [my new_name [::xo::cc form_parameter name ""]]
-#     set class [::xo::cc form_parameter class ::xowiki::Page]
-#     if {[::xotcl::Object isclass $class] && [$class info heritage ::xowiki::Page] ne ""} { 
-#       set class [::xo::cc form_parameter class ::xowiki::Page]
-#       set f [$class new -destroy_on_cleanup \
-#                  -name $name \
-#                  -package_id $package_id \
-#                  -parent_id [my parent_id] \
-#                  -publish_status "production" \
-#                  -title [my title] \
-#                  -text [list [::xo::cc form_parameter content ""] text/html]]
-#       $f save_new
-#       $package_id returnredirect \
-#           [my query_parameter "return_url" [$package_id pretty_link $name]?m=edit]
-#     }
-#   }
-
   PageTemplate instproc delete {} {
     my instvar package_id item_id name
     set count [my count_usages -all true]
@@ -1289,14 +1298,30 @@
     }
   }
 
-  Form instproc create-new {} {
+  Page instproc default_instance_attributes {} {
+    #
+    # Provide the default list of instance attributes to derived
+    # FormPages.
+    #
+    # We want to be able to create FormPages from all pages.
+    # by defining this method, we allow derived applications
+    # to provide their own set of instance attributes
+    return [list]
+  }
+
+  Page instproc create-new {} {
     my instvar package_id
+    set instance_attributes [my default_instance_attributes]
+
     set f [FormPage new -destroy_on_cleanup \
                -package_id $package_id \
                -parent_id [my parent_id] \
                -publish_status "production" \
+               -instance_attributes $instance_attributes \
                -page_template [my item_id]]
-
+    #
+    # if we copy an item, we use source_item_id to provide defaults
+    #
     set source_item_id [$package_id query_parameter source_item_id ""]
     if {$source_item_id ne ""} {
       set source [FormPage get_instance_from_db -item_id $source_item_id]
@@ -1306,7 +1331,9 @@
       $f set name ""
       regexp {^.*:(.*)$} [$source set name] _ name
     } else {
-      # set some default values if they are provided
+      #
+      # set some default values from query parameters
+      #
       foreach key {name title page_order last_page_id} {
 	if {[$package_id exists_query_parameter $key]} {
 	  $f set $key [$package_id query_parameter $key]
Index: openacs-4/packages/xowiki/www/admin/list.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/admin/list.tcl,v
diff -u -r1.19 -r1.20
--- openacs-4/packages/xowiki/www/admin/list.tcl	8 Jan 2008 17:07:24 -0000	1.19
+++ openacs-4/packages/xowiki/www/admin/list.tcl	10 Mar 2008 13:16:02 -0000	1.20
@@ -39,7 +39,8 @@
 
 set actions ""
 foreach type $object_types {
-  set link [$package_id make_link $package_id edit-new {object_type $type} return_url autoname]
+  set link [$package_id make_link -with_entities 0 \
+                $package_id edit-new {object_type $type} return_url autoname]
   if {$link eq ""} continue
   append actions [subst {
     Action new \