From c2b800e61e10d401fcbdc57dd150270da5b550e9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9rome=20Perrin?= <perrinjerome@gmail.com>
Date: Thu, 16 Mar 2023 14:44:52 +0900
Subject: [PATCH] SkinsTool: fix Find form with Zope4 ZMI (#127)

SkinsTool: fix Find form with Zope4 ZMI

SkinsTool has a custom "Find" tab that got broken when FindSupport API changed for Zope4, this repairs all this.

Co-authored-by: Maurits van Rees <maurits@vanrees.org>
---
 src/Products/CMFCore/SkinsTool.py         |   7 +-
 src/Products/CMFCore/dtml/findForm.dtml   | 394 +++++++++++++++-------
 src/Products/CMFCore/dtml/findResult.dtml | 313 -----------------
 4 files changed, 280 insertions(+), 437 deletions(-)
 delete mode 100644 src/Products/CMFCore/dtml/findResult.dtml

diff --git a/src/Products/CMFCore/SkinsTool.py b/src/Products/CMFCore/SkinsTool.py
index c7df7000..acfd6c8f 100644
--- a/src/Products/CMFCore/SkinsTool.py
+++ b/src/Products/CMFCore/SkinsTool.py
@@ -100,13 +100,8 @@ def _getSelections(self):
                               'manage_propertiesForm')
     manage_propertiesForm = DTMLFile('dtml/skinProps', globals())
 
-    # the following two methods override those in FindSupport, to
+    # the following method override the one in FindSupport, to
     # support marking of objects used in specific skins
-    security.declareProtected(ManagePortal,  # NOQA: flake8: D001
-                              'manage_findResult')
-    manage_findResult = DTMLFile('findResult', _dtmldir,
-                                 management_view='Find')
-
     security.declareProtected(ManagePortal,  # NOQA: flake8: D001
                               'manage_findForm')
     manage_findForm = DTMLFile('findForm', _dtmldir,
diff --git a/src/Products/CMFCore/dtml/findForm.dtml b/src/Products/CMFCore/dtml/findForm.dtml
index 0fcb7102..7d935e16 100644
--- a/src/Products/CMFCore/dtml/findForm.dtml
+++ b/src/Products/CMFCore/dtml/findForm.dtml
@@ -1,131 +1,289 @@
 <dtml-var manage_page_header>
+
 <dtml-var manage_tabs>
 
 <main class="container-fluid">
 
-<p class="form-help">
-Find allows you to locate Zope objects based on different
-criteria. For more find choices choose the <EM>Advanced</EM>
-find option.
-</p>
-
-<FORM ACTION="manage_findResult" METHOD="GET">
-<INPUT TYPE = "hidden" NAME="searchtype" VALUE="simple">
-<TABLE class="action">
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-label">
-  Find objects of type:
-  </div>
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-element">
-  <SELECT NAME="obj_metatypes:list" SIZE="8" MULTIPLE>
-  <OPTION VALUE="all" SELECTED> All types
-<dtml-let sorted_meta_types="[]">
-  <dtml-in all_meta_types mapping>
-  <dtml-call "sorted_meta_types.append(name)">
-  </dtml-in>
-  <dtml-call "sorted_meta_types.sort()">
-  <dtml-in sorted_meta_types>
-  <OPTION VALUE="&dtml-sequence-item;">&dtml-sequence-item;
-  </dtml-in>
-</dtml-let>
-  </SELECT>
-  </div>
-  </TD>
-</TR>
+<!-- BO findResults.dtml -->
+<dtml-in "('obj_ids', 'obj_searchterm', 'obj_expr', 'obj_mtime', 'obj_mspec', 'obj_permission', 'obj_roles', 'search_sub','searchtype')"
+	><dtml-else "_.hasattr(REQUEST, _['sequence-item'])"
+	><dtml-call "REQUEST.set(_['sequence-item'], None)"
+	></dtml-else
+></dtml-in>
+<dtml-call "REQUEST.set('obj_metatypes',
+                        [x for x in (REQUEST.get('obj_metatypes', []) or [])])">
 
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-label">
-  with ids:
-  </div>
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <INPUT TYPE="TEXT" NAME="obj_ids:tokens" SIZE="30">
-  </TD>
-</TR>
-
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-label">
-  containing:
-  </div>
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <INPUT TYPE="TEXT" NAME="obj_searchterm" SIZE="30">
-  </TD>
-</TR>
-
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-label">
-  modified:
-  </div>
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-element">
-  <SELECT NAME="obj_mspec">
-  <OPTION VALUE="&lt;"> before
-  <OPTION VALUE="&gt;"> after
-  </SELECT> 
-  </div>
-  <INPUT TYPE="TEXT" NAME="obj_mtime" SIZE="22">
-  </TD>
-</TR>
+<dtml-if btn_submit>
+<dtml-with "_.namespace(
+	results=ZopeFind(this(),
+		obj_ids=obj_ids,
+		obj_metatypes=obj_metatypes,
+		obj_searchterm=obj_searchterm,
+		obj_expr=obj_expr,
+		obj_mtime=obj_mtime,
+		obj_mspec=obj_mspec,
+		obj_permission=obj_permission,
+		obj_roles=obj_roles,
+		search_sub=search_sub,
+		REQUEST=REQUEST)
+	)">
+<form action="manage_compareResults">
+<dtml-unless batch_size><dtml-call "REQUEST.set('batch_size',20)"></dtml-unless>
 
+<dtml-if results>
+	<div class="alert alert-success">
+		Displaying items
+		<dtml-in name="results" size=batch_size start=query_start
+			><dtml-if sequence-start>&dtml-sequence-number;</dtml-if
+			><dtml-if sequence-end>-&dtml-sequence-number; of
+				<dtml-var "_.len(results)"
+			></dtml-if
+		></dtml-in>
+		items matching your query. You can <a href="#zmi-search-form">revise</a>
+		your search terms below.
+	</div>
+<dtml-else>
+	<div class="alert alert-danger">
+		No items were found matching your query. You can
+		<a href="#zmi-search-form">revise</a> your search terms below.
+	</div>
+</dtml-if>
 
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-label">
-  mark the object used in skin:
-  </div>
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-element">
-  <SELECT NAME="obj_skinspec">
-   <dtml-in getSkinSelections>
-    <OPTION value="&dtml-sequence-item;"
-            <dtml-if "_['sequence-item'] == getDefaultSkin()">selected</dtml-if>>
-            <dtml-var sequence-item>
-    </OPTION>
-   </dtml-in>
-  </SELECT>
-  </div>
-  </TD>
-</TR>
-
-
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-text">
-  <INPUT TYPE="RADIO" NAME="search_sub:int" VALUE="0"> 
-  Search only in this folder
-  <BR>
-  <INPUT TYPE="RADIO" NAME="search_sub:int" VALUE="1" CHECKED> 
-  Search all subfolders
+<dtml-unless searchtype><dtml-call "REQUEST.set('searchtype', 'simple')"></dtml-unless>
+<dtml-unless skey><dtml-call "REQUEST.set('skey', 'id')"></dtml-unless>
+<dtml-unless rkey><dtml-call "REQUEST.set('rkey', '')"></dtml-unless>
+<dtml-if "rkey == 'reverse'"><dtml-call "REQUEST.set('rkey', skey)"></dtml-if>
+
+
+<dtml-if "_.len(results) > int(batch_size)">
+	<nav class="zmi-find-results nav row mb-2">
+	<div class="col-6">
+	<dtml-in name="results" previous size=batch_size start=query_start>
+		<a class="btn btn-primary float-left"
+			href="<dtml-var "REQUEST.URL" html_quote>&dtml-sequence-query;query_start=&dtml-previous-sequence-start-number;">
+			<i class="fa fa-caret-left"></i>&nbsp;&nbsp;Previous
+		</a>
+	</dtml-in>
+	</div>
+	<div class="col-6 text-right">
+	<dtml-in name="results" next size=batch_size start=query_start>
+		<a class="btn btn-primary"
+			href="<dtml-var "REQUEST.URL" html_quote>&dtml-sequence-query;query_start=&dtml-next-sequence-start-number;">
+			Next&nbsp;&nbsp;<i class="fa fa-caret-right"></i>
+		</a>
+	</dtml-in>
+	</div>
+	</nav>
+</dtml-if>
+
+
+<ul class="zmi-find-results list-group mb-5">
+<dtml-in results size="batch_size" start="query_start" sort_expr="skey"
+         reverse_expr="rkey">
+	<li class="list-group-item">
+  <div class="form-check">
+    <input class="form-check-input col-0" type="checkbox" value="&dtml.url_quote-sequence-key;" name="item_paths:list"/>
+    <a href="&dtml.url_quote-sequence-key;/manage_workspace"
+    class="col-2
+      <dtml-if "isFirstInSkin(_['sequence-key'], obj_skinspec)">font-weight-bold"</dtml-if>
+      ">
+            <i title="&dtml-meta_type;"
+               class="&dtml-zmi_icon;">&nbsp;</i>
+            &dtml-sequence-key; <dtml-if title>(&dtml-title;)</dtml-if>
+		</a>
   </div>
-  </TD>
-</TR>
-
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-element">
-  <INPUT class="form-element" TYPE="SUBMIT" NAME="btn_submit" VALUE="Find">  
-  <span class="form-text">
-  <a href="manage_findAdv">Advanced...<a>
-  </span>
+	</li>
+</dtml-in>
+</ul>
+
+</dtml-with> <!-- /namespace -->
+  <div class="zmi-controls">
+    <input class="btn btn-primary" type="submit" name="btn_submit" value="Compare" />
   </div>
-  </TD>
-</TR>
-</TABLE>
-</FORM>
+</form>
+</dtml-if> <!-- /button submit -->
+<!-- EO findResults.dtml -->
+
+<form id="zmi-search-form" action="manage_findForm" method="get" class="zmi-find">
+<table class="table table-borderless">
+<tr class="simple-search">
+	<td style="width:10rem">
+		<label for="type" class="form-label">Find objects of type:</label>
+	</td>
+	<td style="width:*">
+	<div class="form-element">
+		<select id="type" class="form-control" name="obj_metatypes:list" size="8" multiple="multiple">
+		<option value="all"
+			<dtml-if "not obj_metatypes">
+				selected="selected"
+			<dtml-else>
+				<dtml-var "('all' in obj_metatypes) and 'selected=\042selected\042' or ''">
+			</dtml-if>
+		>All types</option>
+		<dtml-let sorted_meta_types="[]"
+			><dtml-in all_meta_types mapping
+				><dtml-call "sorted_meta_types.append(name)"
+			></dtml-in><dtml-call "sorted_meta_types.sort()"
+			><dtml-in sorted_meta_types
+				><option value="&dtml-sequence-item;"
+				<dtml-if "not obj_metatypes">
+				<dtml-else>
+					<dtml-var "(_['sequence-item'] in obj_metatypes) and 'selected=\042selected\042' or ''">
+				</dtml-if>
+				>&dtml-sequence-item;</option>
+			</dtml-in
+		></dtml-let>
+		</select>
+	</div>
+	</td>
+</tr>
+
+<tr class="simple-search">
+	<td>
+	<label for="ids" class="form-label">With ids:</label>
+	</td>
+	<td>
+	<input id="ids" class="form-control" type="text" name="obj_ids:tokens" value="<dtml-var "' '.join(obj_ids or [])" html_quote>" />
+	</td>
+</tr>
+
+<tr class="simple-search">
+	<td>
+	<label for="contain" class="form-label">Containing:</label>
+	</td>
+	<td>
+	<input id="contain" class="form-control" type="text" name="obj_searchterm"
+		value="<dtml-var "obj_searchterm and obj_searchterm or ''" html_quote>" />
+	</td>
+</tr>
+
+<tr class="advanced-search-only" <dtml-if "searchtype!='advanced'">style="display:none;"</dtml-if>>
+	<td>
+	<label for="expr" class="form-label">Expr:</label>
+	</td>
+	<td>
+	<textarea id="expr" class="form-control" name="obj_expr" rows="4" cols="30"
+		><dtml-var "obj_expr and obj_expr or ''"></textarea>
+	</td>
+</tr>
+
+<tr class="advanced-search-only" <dtml-if "searchtype!='advanced'">style="display:none;"</dtml-if>>
+	<td>
+	<label for="roles" class="form-label">Where the roles:</label>
+	</td>
+	<td>
+	<div class="form-element">
+		<select id="roles" class="form-control" name="obj_roles:list" size="3" multiple="multiple">
+		<dtml-in valid_roles>
+			<dtml-if obj_roles>
+				<option value="&dtml-sequence-item;"<dtml-if "_['sequence-item'] in obj_roles"> selected="selected"</dtml-if>>&dtml-sequence-item;</option>
+			<dtml-else>
+			 <option value="&dtml-sequence-item;">&dtml-sequence-item;</option>
+			</dtml-if>
+		</dtml-in>
+		</select>
+	</div>
+	</td>
+</tr>
+
+<tr class="advanced-search-only" <dtml-if "searchtype!='advanced'">style="display:none;"</dtml-if>>
+	<td>
+	<label for="perm" class="form-label">Have permission:</label>
+	</td>
+	<td>
+	<div class="form-element">
+		<select id="perm" class="form-control" name="obj_permission">
+		<dtml-in permission_settings mapping>
+			<option value="&dtml-name;"> &dtml-name;</option>
+		</dtml-in>
+		</select>
+	</div>
+	</td>
+</tr>
+
+<tr class="advanced-search-only" <dtml-if "searchtype!='advanced'">style="display:none;"</dtml-if>>
+	<td>
+	<label for="skey" class="form-label">Sort results by:</label>
+	</td>
+	<td>
+	<div class="form-group">
+		<select name="skey" id="skey" class="form-control">
+			<option value="meta_type">Type</option>
+			<option value="id">Id</option>
+		</select>
+		<div class="form-check px-4 mt-2">
+			<input id="rkey" class="form-check-input" type="checkbox" name="rkey" value="reverse" />
+			<label for="rkey" class="form-check-label">Reverse?</label>
+		</div>
+	</div>
+	</td>
+</tr>
+
+<tr class="simple-search">
+	<td>
+	<label for="mod" class="form-label">Modified:</label>
+	</td>
+	<td>
+	<div class="form-inline">
+		<div class="input-group px-0 col-12">
+			<select id="mod" name="obj_mspec" class="input-group-prepend form-control col-4 col-md-3">
+				<option value="&lt;"> before</option>
+				<option value="&gt;"> after</option>
+			</select>
+			<input class="form-control col-8 col-md-9 px-0" type="text" name="obj_mtime" />
+		</div>
+	</div>
+	</td>
+</tr>
+
+<tr class="simple-search">
+	<td>
+	<label for="skinspec" class="form-label">Mark the object used in skin:</label>
+	</td>
+	<td>
+	<div class="form-inline">
+      <select id="skinspec" name="obj_skinspec" class="form-control">
+        <dtml-in getSkinSelections>
+          <option value="&dtml-sequence-item;"
+                  <dtml-if "_['sequence-item'] == getDefaultSkin()">selected</dtml-if>>
+                  <dtml-var sequence-item>
+          </option>
+        </dtml-in>
+			</select>
+		</div>
+	</div>
+	</td>
+</tr>
+
+<tr class="simple-search">
+	<td>&nbsp;</td>
+	<td>
+		<div class="form-check">
+			<input id="thisfolder" class="form-check-input" type="radio" name="search_sub:int" value="0" />
+			<label for="thisfolder" class="form-check-label">Search only in this folder</label>
+		</div>
+		<div class="form-check">
+			<input id="subfolder" class="form-check-input" type="radio" name="search_sub:int" value="1" checked="checked" />
+			<label for="subfolder" class="form-check-label">Search all subfolders</label>
+		</div>
+	</td>
+</tr>
 
-</main>
+<tr class="simple-search">
+	<td>&nbsp;</td>
+	<td>
+		<div class="zmi-controls">
+			<input class="btn btn-primary" type="submit" name="btn_submit" value="Find" />
+			<div class="btn ml-3" >
+				<input id="searchtype"
+					onclick="$('.advanced-search-only').toggle()"
+					class="form-check-input" type="checkbox" name="searchtype" value="advanced" <dtml-if "searchtype=='advanced'"> checked="checked"</dtml-if> />
+				<label for="searchtype" class="form-check-label">Advanced Search</label>
+			</div>
+		</div>
+	</td>
+</tr>
+</table>
+</form>
 
 <dtml-var manage_page_footer>
diff --git a/src/Products/CMFCore/dtml/findResult.dtml b/src/Products/CMFCore/dtml/findResult.dtml
deleted file mode 100644
index 6e0ca36a..00000000
--- a/src/Products/CMFCore/dtml/findResult.dtml
+++ /dev/null
@@ -1,313 +0,0 @@
-<dtml-var manage_page_header>
-<dtml-var manage_tabs>
-
-<main class="container-fluid">
-
-<dtml-in expr="('obj_ids', 'obj_metatypes', 'obj_searchterm', 'obj_expr', 'obj_mtime', 'obj_mspec', 'obj_permission', 'obj_roles', 'search_sub')">
-<dtml-else expr="_.hasattr(REQUEST, _['sequence-item'])">
-<dtml-call expr="REQUEST.set(_['sequence-item'], _.None)">
-</dtml-else>
-</dtml-in>
-
-<dtml-if btn_submit>
-<dtml-with "_.namespace(
-    results=PrincipiaFind(this(), 
-	obj_ids=obj_ids, 
-        obj_metatypes=obj_metatypes, 
-        obj_searchterm=obj_searchterm, 
-        obj_expr=obj_expr, 
-        obj_mtime=obj_mtime, 
-        obj_mspec=obj_mspec, 
-        obj_permission=obj_permission, 
-        obj_roles=obj_roles, 
-        search_sub=search_sub, 
-        REQUEST=REQUEST))">
-
-<dtml-unless batch_size>
-<dtml-call "REQUEST.set('batch_size',20)">
-</dtml-unless>
-
-<dtml-if results>
-<p class="std-text">
-Displaying items
-<dtml-in name="results" size=batch_size start=query_start>
-<dtml-if sequence-start>&dtml-sequence-number;</dtml-if><dtml-if 
- sequence-end>-&dtml-sequence-number; of <dtml-var 
- "_.len(results)"></dtml-if></dtml-in> items matching your query. You can 
-<a href="#form">revise</a> your search terms below.
-</p>
-<dtml-else>
-<p class="std-text">
-No items were found matching your query. You can <a href="#form">revise</a> 
-your search terms below.
-</p>
-</dtml-if>
-
-<dtml-unless searchtype>
-<dtml-call expr="REQUEST.set('searchtype', 'simple')">
-</dtml-unless>
-<dtml-unless skey>
-<dtml-call expr="REQUEST.set('skey', 'id')">
-</dtml-unless>
-<dtml-unless rkey>
-<dtml-call expr="REQUEST.set('rkey', '')">
-</dtml-unless>
-<dtml-if "rkey == 'reverse'">
-<dtml-call "REQUEST.set('rkey', skey)">
-</dtml-if>
-
-<TABLE width="100%" CELLSPACING="0" CELLPADDING="2" border="0">
-<dtml-if expr="_.len(results) > batch_size">
-<tr class="list-header">
-<td width="50%">
- <div class="list-item">
- <dtml-in name="results" previous size="batch_size" start="query_start">
- <strong> <a href="&dtml-URL;&dtml-sequence-query;query_start=&dtml-previous-sequence-start-number;">&lt; Previous</a></strong>
- <dtml-else>&nbsp;</dtml-in></div>
-</td>
-<td align="right" width="50%">
- <div class="list-item">
- <dtml-in name="results" next size=batch_size start=query_start>
- <strong><a href="&dtml-URL;&dtml-sequence-query;query_start=&dtml-next-sequence-start-number;">Next &gt;</a></strong>
- <dtml-else>&nbsp;</dtml-in></div>
-</td>
-</tr>
-</dtml-if>
-</table>
-
-<FORM ACTION="manage_compareResults" METHOD="GET">
-<TABLE width="100%" CELLSPACING="0" CELLPADDING="2" border="0">
-<dtml-in results size="batch_size" start="query_start" sort_expr="skey" reverse_expr="rkey">
-<dtml-if sequence-odd>
-<TR class="row-normal">
-<dtml-else>
-<TR class="row-hilite">
-</dtml-if>
-  <TD ALIGN="LEFT" VALIGN="TOP" WIDTH="40">
-  <input type="checkbox" value="&dtml.url_quote-sequence-key;" name="item_paths:list"/>
-  <A HREF="&dtml.url_quote-sequence-key;/manage_workspace">
-  <IMG SRC="&dtml-BASEPATH1;/&dtml-icon;"
-   ALT="[&dtml-meta_type;]" BORDER="0"></A>
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="list-item">
-  <A HREF="&dtml.url_quote-sequence-key;/manage_workspace">
-  <dtml-if "isFirstInSkin(_['sequence-key'], obj_skinspec)">
-    <span style="color: red">*</span>
-  </dtml-if>
-  &dtml-sequence-key;
-  <dtml-if title>
-  (&dtml-title;)
-  </dtml-if>
-  </A>
-  </div>
-</TD>
-</TR>
-</dtml-in>
-</TABLE>
-<INPUT TYPE="SUBMIT" NAME="btn_submit" VALUE="Compare">  
-</FORM>
-</dtml-with>
-
-</dtml-if>
-
-<a name="form">
-<FORM ACTION="manage_findResult" METHOD="GET">
-<TABLE class="action">
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-label">
-  Find objects of type:</a>
-  </div>
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-element">
-  <SELECT NAME="obj_metatypes:list" SIZE="4" MULTIPLE>
-  <OPTION VALUE="all" <dtml-in obj_metatypes><dtml-if "_['sequence-item'] == 'all'">SELECTED</dtml-if></dtml-in>> All types
-<dtml-in all_meta_types mapping>
-  <OPTION VALUE="&dtml-name;" <dtml-in obj_metatypes><dtml-if "_['sequence-item'] == _['name']">SELECTED</dtml-if></dtml-in>>&dtml-name;
-</dtml-in>
-  </SELECT>
-  </div>
-  </TD>
-</TR>
-
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-label">
-  with ids:
-  </div>
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <INPUT TYPE="TEXT" NAME="obj_ids:tokens" SIZE="30" VALUE="<dtml-unless "REQUEST.obj_ids == []">
-<dtml-in expr="REQUEST.obj_ids">
-&dtml-sequence-item;&nbsp;
-
-</dtml-in>
-</dtml-unless>">
-  </TD>
-</TR>
-
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-label">
-  containing:
-  </div>
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <INPUT TYPE="TEXT" NAME="obj_searchterm" SIZE="30" VALUE="<dtml-var "REQUEST.obj_searchterm" html_quote>">
-  </TD>
-</TR>
-
-<dtml-if "searchtype == 'advanced'">
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-label">
-  expr:
-  </div>
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <TEXTAREA NAME="obj_expr" ROWS="4" COLS="30">&dtml-obj_expr;</TEXTAREA>
-  </TD>
-</TR>
-</dtml-if>
-
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-label">
-  modified:
-  </div>
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-element">
-  <SELECT NAME="obj_mspec">
-
-  <OPTION VALUE="&lt;" <dtml-if "REQUEST.obj_mspec == '<'">SELECTED</dtml-if>> before
-  <OPTION VALUE="&gt;" <dtml-if "REQUEST.obj_mspec == '>'">SELECTED</dtml-if>> after
-  </SELECT> 
-  </div>
-  <INPUT TYPE="TEXT" NAME="obj_mtime" SIZE="22" VALUE="&dtml-obj_mtime;">
-  </TD>
-</TR>
-
-
-
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-label">
-  mark the object used in skin:
-  </div>
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-element">
-  <SELECT NAME="obj_skinspec">
-   <dtml-in getSkinSelections>
-    <OPTION value="&dtml-sequence-item;"
-            <dtml-if "_['sequence-item'] == obj_skinspec">selected</dtml-if>>
-            <dtml-var sequence-item>
-    </OPTION>
-   </dtml-in>
-  </SELECT>
-  </div>
-  </TD>
-</TR>
-
-<dtml-if "searchtype == 'advanced'">
-<INPUT TYPE = "hidden" NAME="searchtype" VALUE="advanced">
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-label">
-  where the roles:
-  </div>
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-element">
-  <SELECT NAME="obj_roles:list" SIZE="3" MULTIPLE>
-<dtml-in valid_roles>
-<dtml-if obj_roles>
-  <OPTION VALUE="&dtml-sequence-item;"<dtml-if "_['sequence-item'] in obj_roles">SELECTED</dtml-if>>&dtml-sequence-item;
-<dtml-else>
- <OPTION VALUE="&dtml-sequence-item;">&dtml-sequence-item;
-</dtml-if>
- 
-</dtml-in>
-  </SELECT>
-  </div>
-  </TD>
-</TR>
-
-
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-label">
-  have permission:
-  </div>
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-element">
-  <SELECT NAME="obj_permission">
-<dtml-in permission_settings mapping>
-  <OPTION VALUE="&dtml-name;"<dtml-in obj_metatypes><dtml-if "_['sequence-item'] == _['name']">SELECTED</dtml-if></dtml-in>> &dtml-name;
-</dtml-in>
-  </SELECT>
-  </div>
-  </TD>
-</TR>
-
-
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-label">
-  Sort results by:
-  </div>
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-element">
-  <SELECT NAME="skey">
-  <OPTION VALUE="id">Id
-  <OPTION VALUE="meta_type">Type
-  </SELECT> 
-  <span class="form-label">
-  <INPUT TYPE="checkbox" NAME="rkey" VALUE="reverse"> Reverse?
-  </span>
-  </div>
-  </TD>
-</TR>
-</dtml-if>
-
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-text">
-  <INPUT TYPE="RADIO" NAME="search_sub:int" VALUE="0" <dtml-if "REQUEST.search_sub == 0">CHECKED</dtml-if>> 
-  Search only in this folder
-  <BR>
-  <INPUT TYPE="RADIO" NAME="search_sub:int" VALUE="1" <dtml-if "REQUEST.search_sub == 1">CHECKED</dtml-if>> 
-  Search all subfolders
-  </div>
-  </TD>
-</TR>
-
-<TR>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  </TD>
-  <TD ALIGN="LEFT" VALIGN="TOP">
-  <div class="form-element">
-  <INPUT TYPE="SUBMIT" NAME="btn_submit" VALUE="Find">  
-  <span class="form-text">
- <dtml-if "searchtype == 'advanced'">
- <a href="manage_findForm">Simple...<a>
- <dtml-else>
- <a href="manage_findAdv">Advanced...<a>
- </dtml-if>
-  </span>
-  </div>
-  </TD>
-</TR>
-</TABLE>
-</FORM>
-
-</main>
-
-<dtml-var manage_page_footer>
