Index: openacs-4/packages/acs-object-management/catalog/acs-object-management.en_US.ISO-8859-1.xml
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-object-management/catalog/acs-object-management.en_US.ISO-8859-1.xml,v
diff -u -r1.4 -r1.5
--- openacs-4/packages/acs-object-management/catalog/acs-object-management.en_US.ISO-8859-1.xml	29 Nov 2009 16:22:31 -0000	1.4
+++ openacs-4/packages/acs-object-management/catalog/acs-object-management.en_US.ISO-8859-1.xml	22 Dec 2009 19:59:15 -0000	1.5
@@ -40,6 +40,7 @@
   <msg key="edit_widget_params">Edit widget parameters</msg>
   <msg key="element_name_help">Chose the attrbiute for this widget.</msg>
   <msg key="elements">Form elements</msg>
+  <msg key="error_previewing_widget">There was an error previewing your widget: %errmsg%. Click back to fix the problem.</msg>
   <msg key="export">Export</msg>
   <msg key="form">Form</msg>
   <msg key="form_elements">Form Elements</msg>
@@ -50,13 +51,15 @@
   <msg key="help_text">Help Text</msg>
   <msg key="inherited_attributes">Inherited Attributes</msg>
   <msg key="is_required">Is Required</msg>
+  <msg key="literal">Literal</msg>
   <msg key="manage_form">Manage Form</msg>
   <msg key="move_down_attribute">move down</msg>
   <msg key="move_up_attribute">move up</msg>
   <msg key="must_supply_either_multirow_or_indexed_array">you must supply either -multirow or -indexed_array</msg>
   <msg key="No">No</msg>
   <msg key="node_element_must_have">node 'element' must have either a 'name' attribute or an 'attribute' attribute.</msg>
   <msg key="object_type">Object Type</msg>
+  <msg key="object_view">Object View</msg>
   <msg key="param_name">Parameter</msg>
   <msg key="param_one">Parameter &quot;%param%&quot;</msg>
   <msg key="param_source">Source</msg>
@@ -77,7 +80,9 @@
   <msg key="remove_element">Remove Element from Form</msg>
   <msg key="remove_widget">remove widget</msg>
   <msg key="required_p">Required?</msg>
+  <msg key="source">source</msg>
   <msg key="supertype">Supertype</msg>
+  <msg key="tcl_proc">Tcl Proc</msg>
   <msg key="types">Types</msg>
   <msg key="unable_to_retrieve_param">unable to retrieve widget parameter %name% for attribute %attribute_id% - returning &quot;&quot; as parameter value</msg>
   <msg key="view">View</msg>
@@ -87,5 +92,6 @@
   <msg key="widget_add_edt">Widget Add/Edit</msg>
   <msg key="widget_default">-- Default Widget --</msg>
   <msg key="widget_help">Choose widget type</msg>
+  <msg key="widget_parameters">Widget Parameters</msg>
   <msg key="Yes">Yes</msg>
 </message_catalog>
Index: openacs-4/packages/acs-object-management/sql/postgresql/acs-templating-changes-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-object-management/sql/postgresql/acs-templating-changes-create.sql,v
diff -u -r1.2 -r1.3
--- openacs-4/packages/acs-object-management/sql/postgresql/acs-templating-changes-create.sql	10 Dec 2009 22:24:27 -0000	1.2
+++ openacs-4/packages/acs-object-management/sql/postgresql/acs-templating-changes-create.sql	22 Dec 2009 19:59:15 -0000	1.3
@@ -3,23 +3,41 @@
 create table acs_form_widgets (
   widget           text
                    constraint acs_form_widgets_pk
-		   primary key
+		           primary key
 );
 
+comment on table acs_form_widgets is '
+  Canonical list of all template form widgets defined in the system.
+';
+
 create table acs_form_default_widgets (
   widget           text
                    constraint acs_form_default_widgets_fk
-		   references acs_form_widgets,
+     		       references acs_form_widgets,
   datatype         text
                    constraint acs_form_default_widgets_datatype_fk
                    references acs_datatypes (datatype),
   primary key (widget, datatype)
 );
 
 comment on table acs_form_widgets is '
-  Canonical list of all template form widgets defined in the system.
+  List of all default template form widgets for each datatype.
 ';
 
+create table acs_form_allowable_widgets (
+  widget           text
+                   constraint acs_form_allowable_widgets_fk
+                   references acs_form_widgets,
+  datatype         text
+                   constraint acs_form_allowable_widgets_datatype_fk
+                   references acs_datatypes (datatype),
+  primary key (widget, datatype)
+);
+
+comment on table acs_form_allowable_widgets is '
+  List of all template form widgets mapped to possible datatypes.
+';
+
 create sequence acs_form_widget_param_seq;
 
 create table acs_form_widget_params (
@@ -39,6 +57,9 @@
   html_p           boolean
                    constraint acs_form_widget_params_html_p_nn
                    not null,
+  tcl_allowed_p    boolean
+                   constraint acs_form_widget_params_tcl_allowed_p_nn
+                   not null,
   default_value    text
 );
 
@@ -92,7 +113,7 @@
                    not null
                    constraint acs_view_attr_widg_params_param_src_ck 
                    check (param_source in ('literal', 'query', 'eval')),
-  value		   text,
+  value		       text,
 
   constraint acs_view_attr_widg_params_attr_fk
   foreign key (object_view, attribute_id)
@@ -115,155 +136,198 @@
   insert into acs_form_widgets (widget) values ('text');
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (10, 'text', 'size', 'f', 't', '30');
+    (10, 'text', 'size', 'f', 't', 'f', '30');
 
   insert into acs_form_widget_params
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (11, 'text', 'maxlength', 'f', 't', null);
+    (11, 'text', 'maxlength', 'f', 't', 'f', null);
 
+  insert into acs_form_widget_params
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
+  values
+    (12, 'text', 'value', 'f', 'f', 't', null);
+
   -- textarea widget
   insert into acs_form_widgets (widget) values ('textarea');
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (20, 'textarea', 'rows', 'f', 't', '6');
+    (20, 'textarea', 'rows', 'f', 't', 'f', '6');
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (30, 'textarea', 'cols', 'f', 't', '60');
+    (30, 'textarea', 'cols', 'f', 't', 'f', '60');
 
   insert into acs_form_widget_params
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (31, 'textarea', 'wrap', 'f', 't', 'physical');
+    (31, 'textarea', 'wrap', 'f', 't', 'f', 'physical');
 
+  insert into acs_form_widget_params
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
+  values
+    (32, 'textarea', 'value', 'f', 'f', 't', null);
+
   -- radio widget
   insert into acs_form_widgets (widget) values ('radio');
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (40, 'radio', 'options', 't', 'f', null);
+    (40, 'radio', 'options', 't', 'f', 't', null);
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (41, 'radio', 'values', 'f', 'f', null);
+    (41, 'radio', 'values', 'f', 'f', 't', null);
 
   -- checkbox widget
   insert into acs_form_widgets (widget) values ('checkbox');
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (50, 'checkbox', 'options', 't', 'f', null);
+    (50, 'checkbox', 'options', 't', 'f', 't', null);
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (51, 'checkbox', 'values', 'f', 'f', null);
+    (51, 'checkbox', 'values', 'f', 'f', 't', null);
 
   -- select widget
   insert into acs_form_widgets (widget) values ('select');
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (60, 'select', 'options', 't', 'f', '{ -- {} }');
+    (60, 'select', 'options', 't', 'f', 't', '{ -- {} }');
 
   insert into acs_form_widget_params
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (61, 'select', 'values', 'f', 'f', '{}');
+    (61, 'select', 'values', 'f', 'f', 't', '{}');
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (70, 'select', 'size', 'f', 't', null);
+    (70, 'select', 'size', 'f', 't', 'f', null);
 
   -- multiselect widget
   insert into acs_form_widgets (widget) values ('multiselect');
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (80, 'multiselect', 'options', 't', 'f', null);
+    (80, 'multiselect', 'options', 't', 'f', 't', null);
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (90, 'multiselect', 'size', 'f', 't', null);
+    (90, 'multiselect', 'size', 'f', 't', 'f', null);
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (91, 'multiselect', 'values', 'f', 'f', null);
+    (91, 'multiselect', 'values', 'f', 'f', 't', null);
 
   -- timestamp widget
   insert into acs_form_widgets (widget) values ('timestamp');
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (92, 'timestamp', 'format', 'f', 'f', null);
+    (92, 'timestamp', 'format', 'f', 'f', 't', null);
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (93, 'timestamp', 'year_interval', 'f', 'f', null);
+    (93, 'timestamp', 'year_interval', 'f', 'f', 'f', null);
 
   -- date widget
   insert into acs_form_widgets (widget) values ('date');
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (100, 'date', 'format', 'f', 'f', null);
+    (100, 'date', 'format', 'f', 'f', 't', null);
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (110, 'date', 'year_interval', 'f', 'f', null);
+    (110, 'date', 'year_interval', 'f', 'f', 'f', null);
 
+  insert into acs_form_widget_params 
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
+  values
+    (111, 'date', 'value', 'f', 'f', 't', null);
+
   -- richtext widget
   insert into acs_form_widgets (widget) values ('richtext');
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (200, 'richtext', 'rows', 'f', 't', '20');
+    (200, 'richtext', 'rows', 'f', 't', 'f', '20');
 
   insert into acs_form_widget_params 
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (230, 'richtext', 'cols', 'f', 't', '80');
+    (230, 'richtext', 'cols', 'f', 't', 'f', '80');
 
   insert into acs_form_widget_params
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (231, 'richtext', 'wrap', 'f', 't', 'physical');
+    (231, 'richtext', 'wrap', 'f', 't', 'f', 'physical');
 
+  insert into acs_form_widget_params 
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
+  values
+    (232, 'richtext', 'value', 'f', 'f', 't', null);
+
   -- search widget
   insert into acs_form_widgets (widget) values ('search');
 
   insert into acs_form_widget_params
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (120, 'search', 'search_query', 't', 'f', null);
+    (120, 'search', 'search_query', 't', 'f', 'f', null);
 
   insert into acs_form_widget_params
-    (param_id, widget, param, required_p, html_p, default_value)
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
   values
-    (121, 'search', 'result_datatype', 'f', 'f', 'search');
+    (121, 'search', 'result_datatype', 'f', 'f', 't', 'search');
 
   -- currency widget
   insert into acs_form_widgets (widget) values ('currency');
 
+  insert into acs_form_widget_params
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
+  values
+    (240, 'currency', 'format', 'f', 'f', 't', null);
+
+  -- file widget
+  insert into acs_form_widgets (widget) values ('file');
+
+  insert into acs_form_widget_params
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
+  values
+    (250, 'file', 'format', 'f', 'f', 't', null);
+
+  insert into acs_form_widget_params 
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
+  values
+    (251, 'file', 'size', 'f', 't', 'f', null);
+
+  insert into acs_form_widget_params 
+    (param_id, widget, param, required_p, html_p, tcl_allowed_p, default_value)
+  values
+    (252, 'file', 'maxlength', 'f', 't', 'f', null);
+  
 end;
 
 -- default widgets for datatypes
@@ -359,5 +423,245 @@
     (datatype, widget)
   values
     ('naturalnum', 'text');
-    
+     
 end;
+
+
+begin;
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('url', 'text');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('richtext', 'richtext');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('text', 'text');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('string', 'text');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('boolean', 'text');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('number', 'text');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('integer', 'text');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('currency', 'currency');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('currency', 'select');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('currency', 'multiselect');
+    
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('currency', 'radio');
+    
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('currency', 'checkbox');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('enumeration', 'text');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('email', 'text');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('file', 'text');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('keyword', 'text');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('date', 'date');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('timestamp', 'timestamp');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('time_of_day', 'timestamp');
+    
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('filename', 'text');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('float', 'text');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('naturalnum', 'text');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('file', 'file');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('text','textarea');
+    
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('string','textarea');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('richtext','textarea');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('text','radio');
+    
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('boolean','radio');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('integer','radio');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('naturalnum','radio');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('float','radio');    
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('text','checkbox');
+    
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('boolean','checkbox');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('integer','checkbox');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('naturalnum','checkbox');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('float','checkbox');    
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('text','select');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('keyword','select');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('integer','select');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('naturalnum','select');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('float','select');    
+    
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('text','multiselect');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('keyword','multiselect');
+    
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('integer','multiselect');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('naturalnum','multiselect');
+
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('float','multiselect');        
+ 
+  insert into acs_form_allowable_widgets
+    (datatype, widget)
+  values
+    ('text','search');
+
+end;
\ No newline at end of file
Index: openacs-4/packages/acs-object-management/tcl/form-procs.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-object-management/tcl/form-procs.xql,v
diff -u -r1.2 -r1.3
--- openacs-4/packages/acs-object-management/tcl/form-procs.xql	11 Dec 2009 00:19:09 -0000	1.2
+++ openacs-4/packages/acs-object-management/tcl/form-procs.xql	22 Dec 2009 19:59:15 -0000	1.3
@@ -16,14 +16,14 @@
 
   <fullquery name="form::element.get_params">
     <querytext>
-      select afwp.param, afwp.html_p, aovawp.value
+      select afwp.param, afwp.html_p, aovawp.value, aovawp.param_source
       from acs_form_widget_params afwp, acs_view_attribute_widget_params aovawp,
         acs_view_attribute_widgets avaw
       where avaw.object_view = :object_view
         and aovawp.attribute_id = :attribute_id
         and afwp.param_id = aovawp.param_id
       union
-      select afwp2.param, afwp2.html_p, afwp2.default_value as value
+      select afwp2.param, afwp2.html_p, afwp2.default_value as value, '' as param_source
       from acs_form_widget_params afwp2
       where not exists (select 1
                         from acs_view_attribute_widgets
Index: openacs-4/packages/acs-object-management/tcl/widget-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-object-management/tcl/widget-procs.tcl,v
diff -u -r1.1 -r1.2
--- openacs-4/packages/acs-object-management/tcl/widget-procs.tcl	27 Nov 2009 00:38:50 -0000	1.1
+++ openacs-4/packages/acs-object-management/tcl/widget-procs.tcl	22 Dec 2009 19:59:15 -0000	1.2
@@ -79,10 +79,20 @@
     db_dml delete {}
 }
 
+ad_proc object_view::attribute::widget::param::delete_all {
+    -object_view:required
+    -attribute_id:required
+} {
+} {
+    db_dml delete_all {}
+}
+
 ad_proc object_view::attribute::widget::param::set {
     -object_view:required
     -attribute_id:required
     -param_id:required
+    {-param_type "onevalue"}
+    {-param_source "literal"}
     -value:required
 } {
 } {
Index: openacs-4/packages/acs-object-management/tcl/widget-procs.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-object-management/tcl/widget-procs.xql,v
diff -u -r1.1 -r1.2
--- openacs-4/packages/acs-object-management/tcl/widget-procs.xql	27 Nov 2009 00:38:50 -0000	1.1
+++ openacs-4/packages/acs-object-management/tcl/widget-procs.xql	22 Dec 2009 19:59:15 -0000	1.2
@@ -67,6 +67,14 @@
     </querytext>
   </fullquery>
 
+  <fullquery name="object_view::attribute::widget::param::delete_all.delete_all">
+    <querytext>
+      delete from acs_view_attribute_widget_params
+      where object_view = :object_view
+        and attribute_id = :attribute_id
+    </querytext>
+  </fullquery>
+
   <fullquery name="object_view::attribute::widget::param::set.param_exists">
     <querytext>
       select 1
@@ -80,7 +88,9 @@
   <fullquery name="object_view::attribute::widget::param::set.update_value">
     <querytext>
       update acs_view_attribute_widget_params
-      set value = :value
+      set param_type = :param_type,
+          param_source = :param_source,
+          value = :value
       where object_view = :object_view
         and attribute_id = :attribute_id
         and param_id = :param_id
@@ -90,9 +100,9 @@
   <fullquery name="object_view::attribute::widget::param::set.insert_param">
     <querytext>
       insert into acs_view_attribute_widget_params
-        (object_view, attribute_id, param_id, value)
+        (object_view, attribute_id, param_id, param_type, param_source, value)
       values
-        (:object_view, :attribute_id, :param_id, :value)
+        (:object_view, :attribute_id, :param_id, :param_type, :param_source, :value)
     </querytext>
   </fullquery>
 
Index: openacs-4/packages/acs-object-management/www/admin/widget-add-edit-1.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-object-management/www/admin/widget-add-edit-1.tcl,v
diff -u -r1.1 -r1.2
--- openacs-4/packages/acs-object-management/www/admin/widget-add-edit-1.tcl	27 Nov 2009 00:38:50 -0000	1.1
+++ openacs-4/packages/acs-object-management/www/admin/widget-add-edit-1.tcl	22 Dec 2009 19:59:15 -0000	1.2
@@ -51,6 +51,9 @@
 } -on_submit {
     db_transaction {
         if { [db_0or1row get_reg_widget {}] && $registered_widget ne $widget } {
+            object_view::attribute::widget::param::delete_all \
+                -object_view $object_view \
+                -attribute_id $attribute_id
             object_view::attribute::widget::unregister \
                 -object_view $object_view \
                 -attribute_id $attribute_id
Index: openacs-4/packages/acs-object-management/www/admin/widget-add-edit-1.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-object-management/www/admin/widget-add-edit-1.xql,v
diff -u -r1.1 -r1.2
--- openacs-4/packages/acs-object-management/www/admin/widget-add-edit-1.xql	27 Nov 2009 00:38:50 -0000	1.1
+++ openacs-4/packages/acs-object-management/www/admin/widget-add-edit-1.xql	22 Dec 2009 19:59:15 -0000	1.2
@@ -4,7 +4,10 @@
   <fullquery name="get_form_widgets"> 
     <querytext>
       select widget, widget
-      from acs_form_widgets    
+      from acs_form_allowable_widgets    
+      where datatype = (select datatype
+                          from acs_attributes
+                         where attribute_id = :attribute_id)
     </querytext>
   </fullquery>
 
Index: openacs-4/packages/acs-object-management/www/admin/widget-add-edit-2.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-object-management/www/admin/widget-add-edit-2.tcl,v
diff -u -r1.1 -r1.2
--- openacs-4/packages/acs-object-management/www/admin/widget-add-edit-2.tcl	27 Nov 2009 00:38:50 -0000	1.1
+++ openacs-4/packages/acs-object-management/www/admin/widget-add-edit-2.tcl	22 Dec 2009 19:59:15 -0000	1.2
@@ -10,31 +10,48 @@
 
 ad_form -name widget_register -export {attribute_id object_view} -form {
     {object_view_pretty:text(inform)
-        {label "Object View"}
+        {label #acs-object-management.object_view#}
     }
     {attribute_name_pretty:text(inform)
-        {label "Attribute"}
+        {label #acs-object-management.attribute#}
     }
     {widget:keyword(inform)
-        {label "Widget"}
+        {label #acs-object-management.widget#}
     }
-    {-section "Widget Parameters" {legendtext "Widget Parameters"}}
+    {-section "Widget Parameters" {legendtext #acs-object-management.widget_parameters#}}
 }
 
-db_multirow params get_params {} {
+db_multirow -unclobber params get_params {} {
+    if {$param_source eq "literal"} {
+        # reverse transform any escaped characters when we submitted
+        set value [string map {\\$ $ \\[ [ \\] ] \\\\ \\} $value]    
+    }
     set optional_flag [expr { $required_p ? "" : ",optional" }]
     set param [lang::util::localize $param]
-    ad_form -extend -name widget_register -form {
-        {${param}:text(textarea)$optional_flag}
+    if { $tcl_allowed_p } {
+        set param_source_options {{#acs-object-management.literal# literal} {#acs-object-management.tcl_proc# eval}}
+    } else {
+        set param_source_options {{#acs-object-management.literal# literal}}
     }
+    if {[lsearch -exact {value values options} $param] > -1} {
+        ad_form -extend -name widget_register -form {
+            {${param}_source:text(radio)
+                {label {$param #acs-object-management.source#}}
+                {options $param_source_options}
+                {value $param_source}
+            }
+        }
+    }
+    ad_form -extend -name widget_register -form {
+        {${param}:text(textarea)$optional_flag {html {rows 6 cols 50}}}
+    }        
 }
 
 ad_form -extend -name widget_register -on_request {
     db_1row get_attr_info ""
     set object_view_pretty [lang::util::localize $object_view_pretty]
     set attribute_name_pretty [lang::util::localize $attribute_name_pretty]
     ad_set_form_values object_view_pretty attribute_name_pretty widget
-
     for { set i 1 } { $i <= [template::multirow size params] } { incr i } {
         ad_set_element_value -element [template::multirow get params $i param] \
             [template::multirow get params $i value]
@@ -43,8 +60,17 @@
     wizard submit widget_register -buttons { back next }
 } -on_submit {
     for { set i 1 } { $i <= [template::multirow size params] } { incr i } {
+        set param [template::multirow get params $i param]
         set value [template::element::get_value widget_register [template::multirow get params $i param]]
         set param_id [template::multirow get params $i param_id]
+        set param_source literal
+        if {[lsearch -exact {value values options} $param] > -1} {
+            set param_source [template::element::get_value widget_register ${param}_source]
+        }
+        if {$param_source eq "literal"} {
+            # escape malicious characters
+            set value [string map {$ \\$ [ \\[ ] \\] \\ \\\\} $value]
+        }    
         if { $value eq "" } {
             object_view::attribute::widget::param::delete \
                 -object_view $object_view \
@@ -55,6 +81,7 @@
                 -object_view $object_view \
                 -attribute_id $attribute_id \
                 -param_id $param_id \
+                -param_source $param_source \
                 -value $value
         }
     }
Index: openacs-4/packages/acs-object-management/www/admin/widget-add-edit-2.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-object-management/www/admin/widget-add-edit-2.xql,v
diff -u -r1.1 -r1.2
--- openacs-4/packages/acs-object-management/www/admin/widget-add-edit-2.xql	27 Nov 2009 00:38:50 -0000	1.1
+++ openacs-4/packages/acs-object-management/www/admin/widget-add-edit-2.xql	22 Dec 2009 19:59:15 -0000	1.2
@@ -15,7 +15,8 @@
   <fullquery name="get_params">      
     <querytext>
       select
-        afwp.param_id, afwp.param, afwp.required_p, afwp.html_p,
+        afwp.param_id, afwp.param, afwp.required_p, afwp.html_p, 
+        afwp.tcl_allowed_p,
         coalesce(aovawp.value, afwp.default_value) as value,
         coalesce(aovawp.param_source,'literal') as param_source
       from
Index: openacs-4/packages/acs-object-management/www/admin/widget-add-edit-3.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-object-management/www/admin/widget-add-edit-3.tcl,v
diff -u -r1.1 -r1.2
--- openacs-4/packages/acs-object-management/www/admin/widget-add-edit-3.tcl	27 Nov 2009 00:38:50 -0000	1.1
+++ openacs-4/packages/acs-object-management/www/admin/widget-add-edit-3.tcl	22 Dec 2009 19:59:15 -0000	1.2
@@ -11,10 +11,15 @@
 set last_step [expr $step-1]
 set back_url [wizard get_forward_url $last_step]
 
-ad_form -name widget_preview -has_submit 1 -form \
-    [list [form::element \
-              -object_view $object_view \
-              -attribute_id $attribute_id]]
+if {[catch {
+    ad_form -name widget_preview -has_submit 1 -form \
+        [list [form::element \
+                  -object_view $object_view \
+                  -attribute_id $attribute_id]]
+} errmsg] } {
+    ad_return_error "[_ acs-subsite.Error]" "[_ acs-object-management.error_previewing_widget]"
+    ad_script_abort
+}
 
 ad_form -name widget_buttons -form {
 } -on_request {