r624 - in zope-cmfplone/branches/upstream/current: . browser exportimport/tests migrations migrations/v2_5 profiles/default profiles/default/structure setup skins/plone_3rdParty skins/plone_content skins/plone_ecmascript skins/plone_form_scripts skins/plone_forms skins/plone_images skins/plone_login skins/plone_prefs skins/plone_scripts skins/plone_styles skins/plone_tableless skins/plone_templates tests www

Fabio Tranchitella kobold at alioth.debian.org
Fri Feb 9 14:51:11 CET 2007


Author: kobold
Date: 2007-02-09 14:51:10 +0100 (Fri, 09 Feb 2007)
New Revision: 624

Added:
   zope-cmfplone/branches/upstream/current/migrations/v2_5/two51_two52.py
Removed:
   zope-cmfplone/branches/upstream/current/www/main.dtml
Modified:
   zope-cmfplone/branches/upstream/current/ActionsTool.py
   zope-cmfplone/branches/upstream/current/CatalogTool.py
   zope-cmfplone/branches/upstream/current/HISTORY.txt
   zope-cmfplone/branches/upstream/current/INSTALL.txt
   zope-cmfplone/branches/upstream/current/MembershipTool.py
   zope-cmfplone/branches/upstream/current/PloneFolder.py
   zope-cmfplone/branches/upstream/current/PloneTool.py
   zope-cmfplone/branches/upstream/current/Portal.py
   zope-cmfplone/branches/upstream/current/RELEASENOTES.txt
   zope-cmfplone/branches/upstream/current/RegistrationTool.py
   zope-cmfplone/branches/upstream/current/browser/navigation.py
   zope-cmfplone/branches/upstream/current/exportimport/tests/base.py
   zope-cmfplone/branches/upstream/current/factory.py
   zope-cmfplone/branches/upstream/current/i18nl10n.py
   zope-cmfplone/branches/upstream/current/migrations/__init__.py
   zope-cmfplone/branches/upstream/current/migrations/v2_5/__init__.py
   zope-cmfplone/branches/upstream/current/migrations/v2_5/final_two51.py
   zope-cmfplone/branches/upstream/current/profiles/default/jsregistry.xml
   zope-cmfplone/branches/upstream/current/profiles/default/structure/front-page
   zope-cmfplone/branches/upstream/current/setup/dependencies.py
   zope-cmfplone/branches/upstream/current/setuphandlers.py
   zope-cmfplone/branches/upstream/current/skins/plone_3rdParty/event-registration.js
   zope-cmfplone/branches/upstream/current/skins/plone_3rdParty/livesearch.js
   zope-cmfplone/branches/upstream/current/skins/plone_3rdParty/se-highlight.js
   zope-cmfplone/branches/upstream/current/skins/plone_content/document_byline.pt
   zope-cmfplone/branches/upstream/current/skins/plone_content/document_view.pt
   zope-cmfplone/branches/upstream/current/skins/plone_content/event_view.pt
   zope-cmfplone/branches/upstream/current/skins/plone_content/file_view.pt
   zope-cmfplone/branches/upstream/current/skins/plone_content/folder_tabular_view.pt
   zope-cmfplone/branches/upstream/current/skins/plone_content/image_view_fullscreen.pt
   zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/dragdropreorder.js
   zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/highlightsearchterms.js
   zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/mark_special_links.js
   zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/plone_javascript_variables.js.pt
   zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/register_function.js
   zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/testHighlightsearchterms.js
   zope-cmfplone/branches/upstream/current/skins/plone_form_scripts/enableSyndication.cpy
   zope-cmfplone/branches/upstream/current/skins/plone_form_scripts/send_feedback.cpy
   zope-cmfplone/branches/upstream/current/skins/plone_form_scripts/send_feedback_site.cpy
   zope-cmfplone/branches/upstream/current/skins/plone_form_scripts/sendto.cpy
   zope-cmfplone/branches/upstream/current/skins/plone_forms/content_status_history.cpt
   zope-cmfplone/branches/upstream/current/skins/plone_forms/discussion_reply_form.cpt
   zope-cmfplone/branches/upstream/current/skins/plone_forms/folder_localrole_form.pt
   zope-cmfplone/branches/upstream/current/skins/plone_forms/history_form.pt
   zope-cmfplone/branches/upstream/current/skins/plone_forms/member_search_form.pt
   zope-cmfplone/branches/upstream/current/skins/plone_forms/member_search_results.pt
   zope-cmfplone/branches/upstream/current/skins/plone_forms/undo_form.pt
   zope-cmfplone/branches/upstream/current/skins/plone_images/add_icon.gif
   zope-cmfplone/branches/upstream/current/skins/plone_login/enabling_cookies.pt
   zope-cmfplone/branches/upstream/current/skins/plone_login/insufficient_privileges.pt
   zope-cmfplone/branches/upstream/current/skins/plone_login/login_failed.pt
   zope-cmfplone/branches/upstream/current/skins/plone_prefs/personalize_form.cpt
   zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_error_log_form.pt
   zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_error_log_showEntry.pt
   zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_group_edit.py
   zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_group_members.cpt
   zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_main_template.pt
   zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_navigation_form.cpt
   zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_navigation_set.cpy
   zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_search_macros.pt
   zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_user_details.cpt
   zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_users_overview.cpt
   zope-cmfplone/branches/upstream/current/skins/plone_prefs/reconfig_form.cpt
   zope-cmfplone/branches/upstream/current/skins/plone_scripts/check_id.py
   zope-cmfplone/branches/upstream/current/skins/plone_scripts/computeRoleMap.py
   zope-cmfplone/branches/upstream/current/skins/plone_scripts/folder_rename.cpy
   zope-cmfplone/branches/upstream/current/skins/plone_scripts/getEventString.py
   zope-cmfplone/branches/upstream/current/skins/plone_scripts/hasIndexHtml.py
   zope-cmfplone/branches/upstream/current/skins/plone_scripts/livesearch_reply.py
   zope-cmfplone/branches/upstream/current/skins/plone_scripts/selectedTabs.py
   zope-cmfplone/branches/upstream/current/skins/plone_styles/IEFixes.css.dtml
   zope-cmfplone/branches/upstream/current/skins/plone_styles/authoring.css.dtml
   zope-cmfplone/branches/upstream/current/skins/plone_styles/base.css.dtml
   zope-cmfplone/branches/upstream/current/skins/plone_styles/base_properties.props
   zope-cmfplone/branches/upstream/current/skins/plone_styles/columns.css.dtml
   zope-cmfplone/branches/upstream/current/skins/plone_styles/portlets.css.dtml
   zope-cmfplone/branches/upstream/current/skins/plone_styles/public.css.dtml
   zope-cmfplone/branches/upstream/current/skins/plone_tableless/main_template.pt
   zope-cmfplone/branches/upstream/current/skins/plone_templates/folder_contents.pt
   zope-cmfplone/branches/upstream/current/skins/plone_templates/header.pt
   zope-cmfplone/branches/upstream/current/skins/plone_templates/main_template.pt
   zope-cmfplone/branches/upstream/current/skins/plone_templates/registered_notify_template.pt
   zope-cmfplone/branches/upstream/current/skins/plone_templates/rss_template.pt
   zope-cmfplone/branches/upstream/current/skins/plone_templates/site_feedback_template.pt
   zope-cmfplone/branches/upstream/current/skins/plone_templates/standard_error_message.py
   zope-cmfplone/branches/upstream/current/tests/forms.txt
   zope-cmfplone/branches/upstream/current/tests/rendering.txt
   zope-cmfplone/branches/upstream/current/tests/testCalendarView.py
   zope-cmfplone/branches/upstream/current/tests/testCookieAuth.py
   zope-cmfplone/branches/upstream/current/tests/testMigrations.py
   zope-cmfplone/branches/upstream/current/tests/testPortalCreation.py
   zope-cmfplone/branches/upstream/current/tests/testRegistrationTool.py
   zope-cmfplone/branches/upstream/current/tests/testTranslationServiceTool.py
   zope-cmfplone/branches/upstream/current/tests/test_doctests.py
   zope-cmfplone/branches/upstream/current/tests/test_functional.py
   zope-cmfplone/branches/upstream/current/tests/zcheck.py
   zope-cmfplone/branches/upstream/current/utils.py
   zope-cmfplone/branches/upstream/current/version.txt
   zope-cmfplone/branches/upstream/current/www/addSite.zpt
Log:
[svn-upgrade] Integrating new upstream version, zope-cmfplone (2.5.2)

Modified: zope-cmfplone/branches/upstream/current/ActionsTool.py
===================================================================
--- zope-cmfplone/branches/upstream/current/ActionsTool.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/ActionsTool.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -43,8 +43,8 @@
         actions = []
 
         # Include actions from specific tools.
-        [self._getActions(provider_name, actions, object) \
-         for provider_name in self.listActionProviders()]
+        for provider_name in self.listActionProviders():
+            self._getActions(provider_name, actions, object)
 
         # Include actions from object.
         if object is not None:

Modified: zope-cmfplone/branches/upstream/current/CatalogTool.py
===================================================================
--- zope-cmfplone/branches/upstream/current/CatalogTool.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/CatalogTool.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -29,6 +29,7 @@
      INonStructuralFolder as z2INonStructuralFolder
 from Products.CMFPlone.utils import base_hasattr
 from Products.CMFPlone.utils import safe_callable
+from Products.CMFPlone.utils import safe_unicode
 from Products.CMFPlone.utils import log_deprecated
 from OFS.IOrderSupport import IOrderedContainer
 from ZODB.POSException import ConflictError
@@ -140,7 +141,6 @@
     >>> sortable_title(self.folder, self.portal)
     'plone00000042 _foo'
     """
-    def_charset = portal.plone_utils.getSiteEncoding()
     title = getattr(obj, 'Title', None)
     if title is not None:
         if safe_callable(title):
@@ -150,17 +150,7 @@
             # Replace numbers with zero filled numbers
             sortabletitle = num_sort_regex.sub(zero_fill, sortabletitle)
             # Truncate to prevent bloat
-            for charset in [def_charset, 'latin-1', 'utf-8']:
-                try:
-                    sortabletitle = unicode(sortabletitle, charset)[:30]
-                    sortabletitle = sortabletitle.encode(def_charset or 'utf-8')
-                    break
-                except UnicodeError:
-                    pass
-                except TypeError:
-                    # If we get a TypeError if we already have a unicode string
-                    sortabletitle = sortabletitle[:30]
-                    break
+            sortabletitle = safe_unicode(sortabletitle)[:30].encode('utf-8')
             return sortabletitle
     return ''
 

Modified: zope-cmfplone/branches/upstream/current/HISTORY.txt
===================================================================
--- zope-cmfplone/branches/upstream/current/HISTORY.txt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/HISTORY.txt	2007-02-09 13:51:10 UTC (rev 624)
@@ -2,10 +2,191 @@
 
     (name of developer listed in brackets)
 
+Plone 2.5.2 - Orb - released January 16, 2007
+
+    - Fix issue with drag and drop caused by changing of css ids in
+      folder_contents.
+      [alecm]
+
+    - Added some classes to document_byline.pt for more flexibility when styling
+      this template. This closes
+      http://dev.plone.org/plone/ticket/5025
+      [spliter]
+
+
+Plone 2.5.2 - Release Candidate - released January 3, 2007
+
+    - In livesearch results, don't append ... at the end, when the lenght of
+      the title or description is exactly the limit. This closes
+      http://dev.plone.org/plone/ticket/5989.
+      [hannosch]
+
+    - Do not display the right column on prefs_main_template anymore, as it
+      was unneeded and could cause design problems. This closes
+      http://dev.plone.org/plone/ticket/5803.
+      [hannosch]
+
+    - Moved the global_cache_settings call in main_template before the call to
+      header.pt as otherwise the encoding in the header would not be defined
+      and fall back to ZPublishers default_encoding. This closes
+      http://dev.plone.org/plone/ticket/6013
+      [hannosch]
+
+    - Optimized the check_id.py uniqueness check to not use contentIds,
+      fixes http://dev.plone.org/plone/ticket/5976
+      [alecm]
+
+    - Add search term highlighting to livesearch result links.
+      [alecm]
+
+    - links in Contents table behave as they should now - show the "pointer" 
+      hand when hovering the mouse over them. It was broken due to ajax sorting 
+      feature somehow
+      [spliter]
+
+    - event_view.pt has a better position for details table now, letting byLine 
+      and Description info to be content-wide and not to be shifted to the left,
+      bacuse of Details table
+      [spliter]
+
+    - main table for columns (#portal-columns) should not have paddings or 
+      spacings - they can confuse when styling. Fixed with CSS for the table 
+      cells, thanks to deo ;)
+      [spliter]
+
+    - Make the parameters for member image scaling more easily configurable
+      by putting them in a mutable data structure.  Eventually, we should
+      provide a TTW configuration for this.
+      [alecm]
+
+    - Make hasIndexHtml script more efficient for BTreeFolders.  Fixes
+      http://dev.plone.org/plone/ticket/5769
+      [alecm]
+
+    - Add event support to OrderedContainer so that moveObjectToPosition
+      doesn't break on Zope 2.9.  Should fix
+      http://dev.plone.org/plone/ticket/5961
+      [alecm]
+
+    - Make css ids for rows in folder_contents sane.  Fixes
+      http://dev.plone.org/plone/ticket/5940
+      [alecm]
+
+    - Make various icons in folder_contents explicitly render alt tags, because
+      the rendering of those images magically picks up items named 'alt' in
+      the context, which breaks the page (plus it adds usability).  Fixes
+      http://dev.plone.org/plone/ticket/5934
+      [alecm]
+
+    - Don't assume portal_catalog when reindexing during ownership change.
+      Fixes http://dev.plone.org/plone/ticket/5063
+      [alecm]
+
+    - Ensure rss_template max items is an integer.  Should fix
+      http://dev.plone.org/plone/ticket/5553
+      [alecm]
+
+    - Applied patch from aaronv to add includeTop setting to navigation
+      prefs form.  Fixes http://dev.plone.org/plone/ticket/5519
+      [alecm]
+
+    - Made standard_error_message more tolerant of security issues and
+      acquisition problems.  Fixes http://dev.plone.org/plone/ticket/5955
+      [alecm]
+
+    - Fixed issue with search for members of groups, using patch from
+      derek_richardson.  Fixes http://dev.plone.org/plone/ticket/5902
+      [alecm]
+
+    - Use some url unquoting to ensure that the rename form redirects to the
+      correct url after rename, even if quoted characters are involved.  Fixes
+      http://dev.plone.org/plone/ticket/5843
+      [alecm]
+
+    - Use current_page_url instead of ACTUAL_URL for accessibility anchors.
+      Fixes http://dev.plone.org/plone/ticket/5777
+      [alecm]
+
+    - Made the error displayed on SMTPRecipientsRefused during password reset
+      not display the email address, as this is an undesirable privacy leakage.
+      Fixes https://dev.plone.org/plone/ticket/5962
+      [alecm]
+
+    - Applied the Hotfix for CVE-2006-4249, which also fixes
+      http://dev.plone.org/plone/ticket/5906
+      [wiggy, alecm]
+
+    - Non-ascii characters in actions used in the portal tabs provoked an
+      UnicodeDecodeError. This closes http://dev.plone.org/plone/ticket/5791.
+      [hannosch]
+
+    - Fixed another UnicodeDecodeError in livesearch_reply.
+      This fixed http://dev.plone.org/plone/ticket/5828.
+      [hannosch]
+
+    - Added a general safe_unicode method to utils.py, which can be used to
+      convert any Unicode, 'utf-8' or 'ascii' encoded string to Unicode.
+      [hannosch]
+
+    - Added button tag styling that conforms to the standard input button 
+      look.
+      [limi]
+
+    - Added optgroup styling, since the default in Firefox looks like crap.
+      [limi]
+
+    - Fixed the Live search error: 0x80040111 (NS_ERROR_NOT_AVAILABLE). This
+      closes http://dev.plone.org/plone/ticket/4519.
+      [deo]
+
+    - Injected Plone 2.1.4 into the migration chain.
+      [stefan]
+
+    - Lots of minor whitespace corrections, found by using the new i18ndude 3.0
+      which is based on zope.tal.talgettext for extraction of translation files.
+      [hannosch]
+
+    - Fixed a minor spelling inconsistency in folder_localrole_form.
+      [hannosch]
+
+    - Fixed flawed lookup of email_from_address in send_feedback scripts. This
+      closes http://dev.plone.org/plone/ticket/5839.
+      [hannosch]
+
+    - Added option to choose different base profile while creating a new Plone
+      site. This closes http://dev.plone.org/plone/ticket/5890.
+      [hannosch]
+
+    - Removed redundant getToolByName call in send_feedback_site. This closes
+      http://dev.plone.org/plone/ticket/5863.
+      [hannosch]
+
+    - Fixed the calendar portlet to display correctly in Internet Explorer 7.
+      [limi]
+
+    - Updated links in the automatically generated front-page.
+      [hannosch]
+
+    - Added a few macro hooks in personalize_form and prefs_user_details to
+      allow at least some form of easy customization without the need to
+      customize the entire forms. Now it looks for a file additional_memberdata
+      in your skin and uses the macros in there to inject them into these
+      horrible forms. Now it sucks slightly less ;-).
+      [ender]
+
+    - livesearch_reply.py mixed up utf-8-encoded strings and unicode strings
+      leading to unpredictable UnicodeDecodeErrors. This fixes
+      http://dev.plone.org/plone/ticket/5828.
+      [ajung]
+
+    - livesearch_reply.py wrote quotes (") in the title-attribute. misformed
+      XML was generated. replaced quotes by ".
+      [jensens]
+
 Plone 2.5.1 - released September 28, 2006
 
-    - The content tab selection logic now checks the request in addition 
-      to template_id when trying to determine which tab should be 
+    - The content tab selection logic now checks the request in addition
+      to template_id when trying to determine which tab should be
       selected.
       [rocky]
 
@@ -32,13 +213,9 @@
 
     - Made login_form and default_error_message not invoke the portlets, since
       they are irrelevant and expensive in those forms. Also made the error
-      template a valid HTML document. 
+      template a valid HTML document.
       [limi]
 
-    - Updated the CSS validation link to use the CSS 2.1 and CSS 3 compatible
-      profile, which is what Plone uses.
-      [limi]
-
     - Added description in the dict in WorkflowTool's getTransitionsFor.
       [ender]
 
@@ -49,9 +226,9 @@
     - Make the object_delete and folder_delete methods require non-GET
       requests. This is a bit of a band-aid and it is likely we will want
       to do the same for other object actions which could be easily triggered
-      by a crawler (a paste for instance, which may have been preceeded by a 
+      by a crawler (a paste for instance, which may have been preceeded by a
       cut or copy). Related to http://dev.plone.org/plone/ticket/4886
-      [alecm, limi]
+      [alecm] [limi]
 
     - Make the syntool methods for enabling and disabling syndication check
       for the Manager properties permission on the object.
@@ -66,7 +243,7 @@
       images using PIL. This will throw an IOError on any invalid image and
       also save some bandwidth and space in the zodb.
       [alecm]
-      
+
     - Added method and management template to membership tool to cleanup
       members with bad images.
       [alecm]
@@ -99,7 +276,7 @@
       [alecm]
 
     - Made the code in utranslate more error resilient and added tests for it.
-      [rafrombrc, hannosch]
+      [rafrombrc] [hannosch]
 
     - Enhanced accessibility of adjacent links in main_template. This fixes
       http://dev.plone.org/plone/ticket/5210.
@@ -143,11 +320,11 @@
 
     - Applied patch from paregorius to add ids to all visualClear divs. Fixes
       http://dev.plone.org/plone/ticket/4145.
-      [paregorius, alecm]
+      [paregorius] [alecm]
 
     - Applied patch from paregorius to make the LiveSearch div vanish in IE
-      as needed. Fixes https://dev.plone.org/plone/ticket/5705.
-      [paregorius, alecm]
+      as needed. Fixes http://dev.plone.org/plone/ticket/5705.
+      [paregorius] [alecm]
 
     - Made PloneTool.browserDefault check for a result of None from getLayout
       and raise a sensible error.  Generally this means that the FTI is missing
@@ -186,7 +363,7 @@
       [ender]
 
     - Added test that ensures the language is getting set in header.
-      This is related to http://dev.plone.org/plone/ticket/5444 and 
+      This is related to http://dev.plone.org/plone/ticket/5444 and
       http://dev.plone.org/plone/ticket/4770.
       [hannosch]
 
@@ -1062,8 +1239,52 @@
       in the next release.
       [hannosch]
 
-Plone 2.1.4 - Devo - Unreleased
+Plone 2.1.5 - Fischerspooner - (Unreleased)
 
+    - Fixed handling of login_time and last_login member properties:
+      last_login_time is now the time of the previous login and login_time is
+      the time of the current login. This fixes
+      http://dev.plone.org/plone/ticket/5965.
+      [hannosch]
+
+    - Fixed the sharing page to handle groups which come from non-traditional
+      PAS sources. This closes
+      http://dev.plone.org/plone/ticket/5727.
+      [hannosch]
+
+    - Fixed the view of livesearch in fullscreen mode (contentActions were 
+      overlapping the livesearch output).
+      [spliter]
+
+    - Enabled IEFixes.css for all IE's, not for <IE7 only
+      [spliter]
+   
+    - Re-enabled livesearch back (removed overflow:hidden from 
+      #portal-searchbox) and fixed horizontal scroll issue for IE's due to 
+      floated searchbox.
+      [spliter]
+    
+    - Removed www/main.dtml as it turns out we can use the default just fine.
+      [stefan]
+
+Plone 2.1.4 - Devo - Released September 19, 2006
+
+    - No changes since RC1.
+
+   RC1 - Released September 12, 2006
+
+    - Made sure validate_email is turned on by default.
+      [stefan]
+
+    - Fixed a bug in the highlighting of selected tabs in an environment which
+      uses Apache rewrite rules. This closes
+      http://dev.plone.org/plone/ticket/5518.
+      [hannosch]
+
+    - Updated the CSS validation link to use the CSS 2.1 and CSS 3 compatible
+      profile, which is what Plone uses.
+      [limi]
+
     - Using 'indexObject' instead of 'reindexObject' for
       CatalogTool.clearFindAndRebuild works just as well, but does not
       touch every object and cause a monster transaction to be committed.

Modified: zope-cmfplone/branches/upstream/current/INSTALL.txt
===================================================================
--- zope-cmfplone/branches/upstream/current/INSTALL.txt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/INSTALL.txt	2007-02-09 13:51:10 UTC (rev 624)
@@ -34,15 +34,13 @@
 
   **MANDATORY**
 
-  - Zope 2.9.4+ (does not run natively on Zope 3)
-     http://www.zope.org/Products/Zope/2.9.4
-     **If you are running Zope 2.9.5+ you should consider removing the ``Five``
-     Product included with Plone**
+  - Zope 2.9.5+ (does not run natively on Zope 3)
+     http://www.zope.org/Products/Zope/2.9.5
    or
     Zope 2.8.7+
      http://www.zope.org/Products/Zope/2.8.7
-     **To use Plone 2.5 with Zope 2.8, you must remove the included ``Five``
-     package and replace it with Five 1.2.6+ from
+     **To use Plone 2.5 with Zope 2.8, you must add ``Five`` to your instance
+     Products, you may find it here:
      http://codespeak.net/z3/five/release/Five-1.2.6.tgz**
 
   - CMF 1.6.2+ (neither 1.5 nor 2.x+ will work)
@@ -51,25 +49,25 @@
   - CMFQuickInstallerTool 1.5.9 or newer
      Included in the Plone tarball
 
-  - GroupUserFolder 3.54 or newer
+  - GroupUserFolder 3.54.1 or newer
      Included in the Plone tarball
 
-  - CMFFormController 2.0.5 or newer
+  - CMFFormController 2.0.6 or newer
      Included in the Plone tarball
 
   - SecureMailHost 1.0.4 or newer
      Included in the Plone tarball
 
-  - Archetypes 1.4.1 or newer
+  - Archetypes 1.4.2 or newer
      Included in the Plone tarball
 
-  - ATContentTypes 1.1.3 or newer
+  - ATContentTypes 1.1.4 or newer
      Included in the Plone tarball
 
-  - ATReferenceBrowserWidget 1.5 or newer
+  - ATReferenceBrowserWidget 1.7 or newer
      Included in the Plone tarball
 
-  - ResourceRegistries 1.3.2 or newer
+  - ResourceRegistries 1.3.3 or newer
      Included in the Plone tarball
 
   - ExtendedPathIndex 2.4 or newer
@@ -88,39 +86,39 @@
      Not included in the Plone tarball
      http://effbot.org/downloads/#elementtree
 
-  - Placeless Translation Service 1.3.2 or newer
+  - Placeless Translation Service 1.3.4 or newer
      Included in the Plone tarball
 
-  - PloneTranslations 2.6.0
+  - PloneTranslations 2.6.1
      Included in the Plone tarball
 
-  - PloneLanguageTool 1.4 or newer
+  - PloneLanguageTool 1.5 or newer
      Included in the Plone tarball
 
   - CMFPlacefulWorkflow 1.0.2 or newer
      Included in the Plone tarball
 
-  - PlonePAS 2.1 or newer
+  - PlonePAS 2.2 or newer
      Included in the Plone tarball
 
-  - PasswordResetTool 0.4 or newer
+  - PasswordResetTool 0.4.2 or newer
      Included in the Plone tarball
 
-  - PluggableAuthService 1.4 or newer
+  - PluggableAuthService 1.4.1 or newer
      Included in the Plone tarball
 
-  - PluginRegistry 1.1 or newer
+  - PluginRegistry 1.1.1 or newer
      Included in the Plone tarball
 
-  - ExternalEditor 0.9.2 or newer
+  - ExternalEditor 0.9.3 or newer
      Included in the Plone tarball
 
-  - kupu 1.3.8 or newer
+  - kupu 1.3.9 or newer
      Included in the Plone tarball
 
   **OPTIONAL**
 
-  - CacheFu 1.0.1 or newer
+  - CacheFu 1.0.2 or newer
      Included in the Plone tarball
      In order to use CacheFu, you must copy or link the directories
      ``CacheSetup``, ``CMFSquidTool``, ``PageCacheManager``, and

Modified: zope-cmfplone/branches/upstream/current/MembershipTool.py
===================================================================
--- zope-cmfplone/branches/upstream/current/MembershipTool.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/MembershipTool.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -564,7 +564,7 @@
         if not self.isAnonymousUser():
             member = self.getAuthenticatedMember()
             login_time = member.getProperty('login_time', '2000/01/01')
-            if  str(login_time) == '2000/01/01':
+            if str(login_time) == '2000/01/01':
                 login_time = self.ZopeTime()
             member.setProperties(login_time=self.ZopeTime(),
                                  last_login_time=login_time)

Modified: zope-cmfplone/branches/upstream/current/PloneFolder.py
===================================================================
--- zope-cmfplone/branches/upstream/current/PloneFolder.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/PloneFolder.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -27,6 +27,7 @@
 from Products.CMFPlone import PloneMessageFactory as _
 
 from zope.interface import implements
+from zope.app.container.contained import notifyContainerModified
 
 # ATM it's safer to define our own
 from interfaces.OrderedContainer import IOrderedContainer
@@ -129,7 +130,8 @@
     # the 2.7 specific class OFS.OrderedContainer.OrderedContainer
 
     security.declareProtected(ModifyPortalContent, 'moveObjectsByDelta')
-    def moveObjectsByDelta(self, ids, delta, subset_ids=None):
+    def moveObjectsByDelta(self, ids, delta, subset_ids=None,
+                           suppress_events=False):
         """Move specified sub-objects by delta."""
         if type(ids) is StringType:
             ids = (ids,)
@@ -175,6 +177,10 @@
                         raise ValueError('The object with the id "%s" does '
                                          'not exist.' % subset_ids[pos])
             self._objects = tuple(objects)
+
+        if not suppress_events:
+            notifyContainerModified(self)
+
         return counter
 
     security.declarePrivate('getCMFObjectsSubsetIds')
@@ -224,10 +230,11 @@
             RESPONSE.redirect('manage_workspace')
 
     security.declareProtected(ModifyPortalContent, 'moveObjectToPosition')
-    def moveObjectToPosition(self, id, position):
+    def moveObjectToPosition(self, id, position, suppress_events=False):
         """Move specified object to absolute position."""
         delta = position - self.getObjectPosition(id)
-        return self.moveObjectsByDelta(id, delta)
+        return self.moveObjectsByDelta(id, delta,
+                                       suppress_events=suppress_events)
 
     security.declareProtected(ModifyPortalContent, 'orderObjects')
     def orderObjects(self, key, reverse=None):

Modified: zope-cmfplone/branches/upstream/current/PloneTool.py
===================================================================
--- zope-cmfplone/branches/upstream/current/PloneTool.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/PloneTool.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -459,17 +459,19 @@
             object.manage_setLocalRoles(user_id, roles)
 
         fixOwnerRole(object, user.getId())
-        catalog_tool = getToolByName(self, 'portal_catalog')
-        catalog_tool.reindexObject(object)
+        if base_hasattr(object, 'reindexObject'):
+            object.reindexObject()
 
         if recursive:
+            catalog_tool = getToolByName(self, 'portal_catalog')
             purl = getToolByName(self, 'portal_url')
             _path = purl.getRelativeContentURL(object)
             subobjects = [b.getObject() for b in \
                          catalog_tool(path={'query':_path,'level':1})]
             for obj in subobjects:
                 fixOwnerRole(obj, user.getId())
-                catalog_tool.reindexObject(obj)
+                if base_hasattr(obj, 'reindexObject'):
+                    obj.reindexObject()
 
     security.declarePublic('urlparse')
     def urlparse(self, url):

Modified: zope-cmfplone/branches/upstream/current/Portal.py
===================================================================
--- zope-cmfplone/branches/upstream/current/Portal.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/Portal.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -65,7 +65,7 @@
     # Switch off ZMI ordering interface as it assumes a slightly
     # different functionality
     has_order_support = 0
-    manage_main = Globals.DTMLFile('www/main', globals())
+    _default_sort_key = 'id'
 
     def __browser_default__(self, request):
         """ Set default so we can return whatever we want instead

Modified: zope-cmfplone/branches/upstream/current/RELEASENOTES.txt
===================================================================
--- zope-cmfplone/branches/upstream/current/RELEASENOTES.txt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/RELEASENOTES.txt	2007-02-09 13:51:10 UTC (rev 624)
@@ -1,18 +1,15 @@
-Plone 2.5.1 - September 20, 2006
+Plone 2.5.2 - January 16, 2007
 =========================
 
 The following is a list of important things to note when installing or upgrading
-to Plone 2.5.1:
+to Plone 2.5.2:
 
-* The recommended Zope version for this release is now 2.9.5+ (which is not yet
-released), it will work out of the box with Zope 2.9.4, and can be used with
-Zope 2.8.7 by replacing the included ``Five`` product with the latest "Five
-1.2.x release":http://codespeak.net/z3/five  **Note:  This has changed from
+* The recommended Zope version for this release is now 2.9.5+ (which
+is not yet released), it will work out of the box with Zope 2.9.4, and
+can be used with Zope 2.8.7 by installing the latest "Five 1.2.x
+release":http://codespeak.net/z3/five **Note: This has changed from
 the previous release**
 
-* When used with Zope 2.9.5+ the included ``Five`` product should be removed
-as a newer version is included with Zope.
-
 * This release includes a number of important fixes addressing Cross Site
 Scripting vulnerabilities in user uploaded content, including member portraits.
 Details on the issues and steps for cleaning up any existing content exploiting
@@ -31,7 +28,7 @@
 * Sites which have migrated from Plone 2.1.x and had local roles assigned to
 groups in parts of the portal may find that those roles are now invalid because
 they have the previously mandatory ``group_`` prefix.  There is an
-``External Method`` included with Plone 2.5.1 which will reassign these roles
+``External Method`` included with Plone 2.5.1+ which will reassign these roles
 to the proper groups.  You may run this method on the portal to clean up any
 folders or objects with invalid group roles.  You should not use this method
 if you have groups on your site that are intentionally named with a ``group_``

Modified: zope-cmfplone/branches/upstream/current/RegistrationTool.py
===================================================================
--- zope-cmfplone/branches/upstream/current/RegistrationTool.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/RegistrationTool.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -1,5 +1,6 @@
 import random
 import md5
+from smtplib import SMTPRecipientsRefused
 
 from Products.CMFCore.utils import getToolByName
 from Products.CMFDefault.RegistrationTool import RegistrationTool as BaseTool
@@ -11,6 +12,9 @@
 from Products.CMFPlone.PloneBaseTool import PloneBaseTool
 from Products.CMFPlone.PloneTool import EMAIL_RE
 
+from Products.PluggableAuthService.interfaces.authservice \
+        import IPluggableAuthService
+
 # - remove '1', 'l', and 'I' to avoid confusion
 # - remove '0', 'O', and 'Q' to avoid confusion
 # - remove vowels to avoid spelling words
@@ -170,9 +174,12 @@
             # add the single email address
             if not utils.validateSingleEmailAddress(member.getProperty('email')):
                 raise ValueError, 'The email address did not validate'
+        try:
+            return BaseTool.mailPassword(self, forgotten_userid, REQUEST)
+        except SMTPRecipientsRefused:
+            # Don't disclose email address on failure
+            raise SMTPRecipientsRefused('Recipient address rejected by server')
 
-        return BaseTool.mailPassword(self, forgotten_userid, REQUEST)
-
     security.declarePublic('registeredNotify')
     def registeredNotify(self, new_member_id):
         """ Wrapper around registeredNotify """
@@ -208,8 +215,27 @@
 
         return self.mail_password_response( self, self.REQUEST )
 
+    def isMemberIdAllowed(self, id):
+        if len(id) < 1 or id == 'Anonymous User':
+            return 0
+        if not self._ALLOWED_MEMBER_ID_PATTERN.match( id ):
+            return 0
 
+        pas = getToolByName(self, 'acl_users')
+        if IPluggableAuthService.providedBy(pas):
+            results = pas.searchPrincipals(id=id)
+            if results:
+                return 0
+        else:
+            membership = getToolByName(self, 'portal_membership')
+            if membership.getMemberById(id) is not None:
+                return 0
+            groups = getToolByName(self, 'portal_groups')
+            if groups.getGroupById(id) is not None:
+                return 0
 
+        return 1
+
 RegistrationTool.__doc__ = BaseTool.__doc__
 
 InitializeClass(RegistrationTool)

Modified: zope-cmfplone/branches/upstream/current/browser/navigation.py
===================================================================
--- zope-cmfplone/branches/upstream/current/browser/navigation.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/browser/navigation.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -17,7 +17,6 @@
 from Products.CMFPlone.browser.navtree import buildFolderTree
 from Products.CMFPlone.browser.navtree import NavtreeQueryBuilder, SitemapQueryBuilder
 from Products.CMFPlone.browser.navtree import getNavigationRoot
-
 from Products.CMFPlone.browser.navtree import DefaultNavtreeStrategy, SitemapNavtreeStrategy
 
 def get_url(item):
@@ -211,7 +210,8 @@
                 data = actionInfo.copy()
                 # We use PMF instead of _() here, as this should not be picked
                 # up by the extraction tool.
-                data['name'] = PMF(data['title'], default=data['title'])
+                title = utils.safe_unicode(data['title'])
+                data['name'] = PMF(title, default=title)
                 result.append(data)
 
         # check whether we only want actions

Modified: zope-cmfplone/branches/upstream/current/exportimport/tests/base.py
===================================================================
--- zope-cmfplone/branches/upstream/current/exportimport/tests/base.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/exportimport/tests/base.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -1,15 +1,16 @@
 
 from Products.GenericSetup.testing import BodyAdapterTestCase
 from Products.GenericSetup.testing import NodeAdapterTestCase
-from Products.PloneTestCase.layer import ZCMLLayer
-import Products.PloneTestCase.setup as setup
+from Products.PloneTestCase import layer
+from Products.PloneTestCase import setup
 
+
 # Disable PlacelessSetup as PTC does not like it
 
 class BodyAdapterTestCase(BodyAdapterTestCase):
 
     if setup.USELAYER:
-        layer = ZCMLLayer
+        layer = layer.ZCML
 
     def setUp(self):
         pass
@@ -21,7 +22,7 @@
 class NodeAdapterTestCase(NodeAdapterTestCase):
 
     if setup.USELAYER:
-        layer = ZCMLLayer
+        layer = layer.ZCML
 
     def setUp(self):
         pass

Modified: zope-cmfplone/branches/upstream/current/factory.py
===================================================================
--- zope-cmfplone/branches/upstream/current/factory.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/factory.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -3,33 +3,41 @@
 from Products.CMFCore.utils import getToolByName
 from Products.GenericSetup.tool import SetupTool
 from Products.GenericSetup import profile_registry
-from Products.GenericSetup import EXTENSION
+from Products.GenericSetup import BASE, EXTENSION
 
 from Portal import PloneSite
 from utils import WWW_DIR
 from interfaces import IPloneSiteRoot
 
 _TOOL_ID = 'portal_setup'
+_DEFAULT_PROFILE = 'CMFPlone:plone'
 
-
 def addPloneSiteForm(dispatcher):
     """
     Wrap the PTF in 'dispatcher'.
     """
     wrapped = PageTemplateFile('addSite', WWW_DIR).__of__(dispatcher)
 
+    base_profiles = []
     extension_profiles = []
     for info in profile_registry.listProfileInfo():
         if info.get('type') == EXTENSION and \
            info.get('for') in (IPloneSiteRoot, None):
             extension_profiles.append(info)
-    
-    return wrapped(extension_profiles=tuple(extension_profiles))
 
+    for info in profile_registry.listProfileInfo():
+        if info.get('type') == BASE and \
+           info.get('for') in (IPloneSiteRoot, None):
+            base_profiles.append(info)
+
+    return wrapped(base_profiles=tuple(base_profiles),
+                   extension_profiles=tuple(extension_profiles),
+                   default_profile=_DEFAULT_PROFILE)
+
 def addPloneSite(dispatcher, id, title='', description='',
                  create_userfolder=1, email_from_address='',
                  email_from_name='', validate_email=0,
-                 profile_id='CMFPlone:plone', snapshot=False,
+                 profile_id=_DEFAULT_PROFILE, snapshot=False,
                  RESPONSE=None, extension_ids=()):
     """ Add a PloneSite to 'dispatcher', configured according to 'profile_id'.
     """

Modified: zope-cmfplone/branches/upstream/current/i18nl10n.py
===================================================================
--- zope-cmfplone/branches/upstream/current/i18nl10n.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/i18nl10n.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -1,11 +1,13 @@
 """
 Collection of i18n and l10n utility methods.
-All methods here may return unicode type.
 """
 import re
+import logging
 from DateTime import DateTime
-from log import log_exc
 
+from Products.CMFPlone.log import log
+from Products.CMFPlone.utils import safe_unicode
+
 # get the registered translation service and the dummy
 from Products.PageTemplates.GlobalTranslationService import \
      getGlobalTranslationService
@@ -30,12 +32,7 @@
     # of the utranslate method. As we have no context here which we could use
     # to get to the site encoding, we only try to decode from utf-8 here.
     text = service.translate(*args, **kw)
-    if isinstance(text, str):
-        try:
-            text = unicode(text, 'utf-8')
-        except UnicodeDecodeError:
-            pass
-    return text
+    return safe_unicode(text)
 
 # unicode aware localized time method (l10n)
 def ulocalized_time(time, long_format = None, context = None, domain='plone'):
@@ -76,7 +73,8 @@
     try:
         time = DateTime(time)
     except:
-        log_exc('Failed to convert %s to a DateTime object' % time)
+        log('Failed to convert %s to a DateTime object' % time,
+            severity=logging.DEBUG)
         return None
        
     if context is None:

Modified: zope-cmfplone/branches/upstream/current/migrations/__init__.py
===================================================================
--- zope-cmfplone/branches/upstream/current/migrations/__init__.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/migrations/__init__.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -154,6 +154,14 @@
                                       null)
 
     MigrationTool.registerUpgradePath('2.1.3',
+                                      '2.1.4-rc1',
+                                      null)
+
+    MigrationTool.registerUpgradePath('2.1.4-rc1',
+                                      '2.1.4',
+                                      null)
+
+    MigrationTool.registerUpgradePath('2.1.4',
                                       '2.5-alpha1',
                                       v2_5.alphas.two5_alpha1)
 
@@ -193,3 +201,11 @@
                                       '2.5.1',
                                       null)
 
+    MigrationTool.registerUpgradePath('2.5.1',
+                                      '2.5.2-rc1',
+                                      v2_5.two51_two52.two51_two52)
+
+    MigrationTool.registerUpgradePath('2.5.2-rc1',
+                                      '2.5.2',
+                                      null)
+

Modified: zope-cmfplone/branches/upstream/current/migrations/v2_5/__init__.py
===================================================================
--- zope-cmfplone/branches/upstream/current/migrations/v2_5/__init__.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/migrations/v2_5/__init__.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -3,3 +3,4 @@
 import betas
 import rcs
 import final_two51
+import two51_two52

Modified: zope-cmfplone/branches/upstream/current/migrations/v2_5/final_two51.py
===================================================================
--- zope-cmfplone/branches/upstream/current/migrations/v2_5/final_two51.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/migrations/v2_5/final_two51.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -86,7 +86,7 @@
     newaction = { 'id'         : 'delete',
                   'name'       : 'Delete',
                   'action'     : 'string:${globals_view/getCurrentObjectUrl}/delete_confirmation',
-                  'condition'  : 'python:checkPermission(&quot;Delete objects&quot;, globals_view.getParentObject()) and not globals_view.isPortalOrPortalDefaultPage()',
+                  'condition'  : 'python:checkPermission("Delete objects", globals_view.getParentObject()) and not globals_view.isPortalOrPortalDefaultPage()',
                   'permission' : 'Delete objects',
                   'category'   : 'object_buttons',
                 }

Added: zope-cmfplone/branches/upstream/current/migrations/v2_5/two51_two52.py
===================================================================
--- zope-cmfplone/branches/upstream/current/migrations/v2_5/two51_two52.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/migrations/v2_5/two51_two52.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -0,0 +1,32 @@
+from Products.CMFCore.utils import getToolByName
+
+
+def two51_two52(portal):
+    """2.5.1 -> 2.5.2
+    """
+    out = []
+
+    # Make sure the cookie auth redirects to the correct location
+    setLoginFormInCookieAuth(portal, out)
+
+    return out
+
+
+def setLoginFormInCookieAuth(portal, out):
+    """Makes sure the cookie auth redirects to 'require_login' instead
+       of 'login_form'."""
+    uf = portal._getOb('acl_users', None)
+    if uf is None or getattr(uf.aq_base, '_getOb', None) is None:
+        # we have no user folder or it's not a PAS folder, do nothing
+        return
+    cookie_auth = uf._getOb('credentials_cookie_auth', None)
+    if cookie_auth is None:
+        # there's no cookie auth object, do nothing
+        return
+    current_login_form = cookie_auth.getProperty('login_path')
+    if current_login_form != 'login_form':
+        # it's customized already, do nothing
+        return
+    cookie_auth.manage_changeProperties(login_path='require_login')
+    out.append("Changed credentials_cookie_path login_path property "
+               "to 'require_login'.")

Modified: zope-cmfplone/branches/upstream/current/profiles/default/jsregistry.xml
===================================================================
--- zope-cmfplone/branches/upstream/current/profiles/default/jsregistry.xml	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/profiles/default/jsregistry.xml	2007-02-09 13:51:10 UTC (rev 624)
@@ -1,6 +1,8 @@
 <?xml version="1.0"?>
 <object name="portal_javascripts" meta_type="JavaScripts Registry">
  <javascript cacheable="True" compression="safe" cookable="True"
+    enabled="True" expression="" id="event-registration.js" inline="False"/>
+ <javascript cacheable="True" compression="safe" cookable="True"
     enabled="True" expression="" id="register_function.js" inline="False"/>
  <javascript cacheable="True" compression="safe" cookable="True"
     enabled="True" expression="" id="cssQuery.js" inline="False"/>

Modified: zope-cmfplone/branches/upstream/current/profiles/default/structure/front-page
===================================================================
--- zope-cmfplone/branches/upstream/current/profiles/default/structure/front-page	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/profiles/default/structure/front-page	2007-02-09 13:51:10 UTC (rev 624)
@@ -1,17 +1,17 @@
-id: front-page
-title: Welcome to Plone
-excludeFromNav: False
-subject: 
-description: Congratulations! You have successfully installed Plone.
-contributors: 
-effectiveDate: None
-expirationDate: None
-language: 
-rights: 
-creation_date: 2005/11/01 14:28:30 US/Central
-modification_date: 2005/11/01 14:28:30 US/Central
-relatedItems: 
-allowDiscussion: None
+id: front-page
+title: Welcome to Plone
+excludeFromNav: False
+subject: 
+description: Congratulations! You have successfully installed Plone.
+contributors: 
+effectiveDate: None
+expirationDate: None
+language: 
+rights: 
+creation_date: 2006/10/10 14:28:30 US/Central
+modification_date: 2006/10/10 14:28:30 US/Central
+relatedItems: 
+allowDiscussion: None
 Content-Type: text/html
 
 <p class="discreet">
@@ -77,7 +77,7 @@
 <p><a href="http://plone.org/documentation/whatsnew/2.5">What's new in Plone 2.5</a></p>
 <p><a href="http://plone.org/documentation">Plone documentation</a></p>
 <p><a href="http://plone.org/products">Plone add-on products</a></p>
-<p><a href="http://plone.org/contact">Plone mailing lists and support forums</a></p>
+<p><a href="http://plone.org/support">Plone mailing lists and support forums</a></p>
 <p><a href="http://plone.org/documentation/books">Available Plone books</a> <span class="discreet">(recommended!)</span></p>
 <p><a href="http://plone.org/documentation/faq/server-recommendations">Server recommendations for Plone</a></p>
 

Modified: zope-cmfplone/branches/upstream/current/setup/dependencies.py
===================================================================
--- zope-cmfplone/branches/upstream/current/setup/dependencies.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/setup/dependencies.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -105,10 +105,9 @@
     # TODO: we might want to check if the user has jpeg and zlib support, too
     import PIL.Image
 except ImportError:
-    log(("PIL not found. Plone needs PIL 1.1.5 or newer to scale images. "
+    log(("PIL not found. Plone needs PIL 1.1.5 or newer. "
          "Please download it from http://www.pythonware.com/products/pil/ or "
-         "http://effbot.org/downloads/#Imaging"),
-         severity=logging.INFO)
+         "http://effbot.org/downloads/#Imaging"))
 
 try:
     from elementtree import ElementTree

Modified: zope-cmfplone/branches/upstream/current/setuphandlers.py
===================================================================
--- zope-cmfplone/branches/upstream/current/setuphandlers.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/setuphandlers.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -171,6 +171,7 @@
         out = []
         migs.v2_1.alphas.addDefaultTypesToPortalFactory(p, out)
         migs.v2_1.rcs.enableSyndicationOnTopics(p, out)
+        migs.v2_5.two51_two52.setLoginFormInCookieAuth(p, out)
 
     def setATCTToolVersion(self, p):
         """

Modified: zope-cmfplone/branches/upstream/current/skins/plone_3rdParty/event-registration.js
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_3rdParty/event-registration.js	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_3rdParty/event-registration.js	2007-02-09 13:51:10 UTC (rev 624)
@@ -1,165 +1,99 @@
-// written by Dean Edwards, 2005
-// with input from Tino Zijdel - crisp at xs4all.nl
-// http://dean.edwards.name/weblog/2005/10/add-event/
-// this version from http://tanny.ica.com/ica/tko/tkoblog.nsf/dx/domcontentloaded-for-browsers-part-ii
+// this contains parts from:
+// http://tanny.ica.com/ica/tko/tkoblog.nsf/dx/domcontentloaded-for-browsers-part-ii
 
-function addEvent(element, type, handler) {
-	// Modification by Tanny O'Haley, http://tanny.ica.com to add the
-	// DOMContentLoaded for all browsers.
-	if (type == "DOMContentLoaded" || type == "domload") {
-		addDOMLoadEvent(handler);
-		return;
-	}
-	
-	if (element.addEventListener)
-		element.addEventListener(type, handler, false);
-	else {
-		if (!handler.$$guid) handler.$$guid = addEvent.guid++;
-		if (!element.events) element.events = {};
-		var handlers = element.events[type];
-		if (!handlers) {
-			handlers = element.events[type] = {};
-			if (element['on' + type]) handlers[0] = element['on' + type];
-			element['on' + type] = handleEvent;
-		}
-	
-		handlers[handler.$$guid] = handler;
-	}
-}
-
-addEvent.guid = 1;
-
-function removeEvent(element, type, handler) {
-	if (element.removeEventListener)
-		element.removeEventListener(type, handler, false);
-	else if (element.events && element.events[type] && handler.$$guid)
-		delete element.events[type][handler.$$guid];
-}
-
-function handleEvent(event) {
-	event = event || fixEvent(window.event);
-	var returnValue = true;
-	var handlers = this.events[event.type];
-
-	for (var i in handlers) {
-		if (!Object.prototype[i]) {
-			this.$$handler = handlers[i];
-			if (this.$$handler(event) === false) returnValue = false;
-		}
-	}
-
-	if (this.$$handler) this.$$handler = null;
-
-	return returnValue;
-}
-
-function fixEvent(event) {
-	event.preventDefault = fixEvent.preventDefault;
-	event.stopPropagation = fixEvent.stopPropagation;
-	return event;
-}
-
-fixEvent.preventDefault = function() {
-	this.returnValue = false;
-}
-
-fixEvent.stopPropagation = function() {
-	this.cancelBubble = true;
-}
-
-// This little snippet fixes the problem that the onload attribute on the body-element will overwrite
-// previous attached events on the window object for the onload event
-if (!window.addEventListener) {
-	document.onreadystatechange = function(){
-		if (window.onload && window.onload != handleEvent) {
-			addEvent(window, 'load', window.onload);
-			window.onload = handleEvent;
-		}
-	}
-}
-
-// End Dean Edwards addEvent.
-
-
-// Here are my functions for adding the DOMContentLoaded event to browsers other
-// than Mozilla.
-
 // Array of DOMContentLoaded event handlers.
 window.onDOMLoadEvents = new Array();
 window.DOMContentLoadedInitDone = false;
 
 // Function that adds DOMContentLoaded listeners to the array.
 function addDOMLoadEvent(listener) {
-	window.onDOMLoadEvents[window.onDOMLoadEvents.length]=listener;
+    window.onDOMLoadEvents[window.onDOMLoadEvents.length]=listener;
 }
 
 // Function to process the DOMContentLoaded events array.
 function DOMContentLoadedInit() {
-	// quit if this function has already been called
-	if (window.DOMContentLoadedInitDone) return;
+    // quit if this function has already been called
+    if (window.DOMContentLoadedInitDone) return;
 
-	// flag this function so we don't do the same thing twice
-	window.DOMContentLoadedInitDone = true;
+    // flag this function so we don't do the same thing twice
+    window.DOMContentLoadedInitDone = true;
 
-	// iterates through array of registered functions 
-	var exceptions = new Array();
-	for (var i=0; i<window.onDOMLoadEvents.length; i++) {
-		var func = window.onDOMLoadEvents[i];
-		try {
-			func();
-		} catch(e) {
-			// continue running init functions but save exceptions for later
-			exceptions[exceptions.length] = e;
-		}
-	}
-	for (var i=0; i<exceptions.length; i++) {
-		throw exceptions[i];
-	}
+    // iterates through array of registered functions 
+    var exceptions = new Array();
+    for (var i=0; i<window.onDOMLoadEvents.length; i++) {
+        var func = window.onDOMLoadEvents[i];
+        try {
+            func();
+        } catch(e) {
+            // continue running init functions but save exceptions for later
+            exceptions[exceptions.length] = e;
+        }
+    }
+    for (var i=0; i<exceptions.length; i++) {
+        throw exceptions[i];
+    }
 }
 
 function DOMContentLoadedScheduler() {
-	// quit if the init function has already been called
-	if (window.DOMContentLoadedInitDone) return true;
-	
-	// First check for Safari or
-	//if DOM methods are supported, and the body element exists
-	//(using a double-check including document.body, for the benefit of older moz builds [eg ns7.1] 
-	//in which getElementsByTagName('body')[0] is undefined, unless this script is in the body section)
-	if(/KHTML|WebKit/i.test(navigator.userAgent)) {
-		if(/loaded|complete/.test(document.readyState)) {
-			DOMContentLoadedInit();
-		} else {
-			// Not ready yet, wait a little more.
-			setTimeout("DOMContentLoadedScheduler()", 250);
-		}
-	} else if(typeof document.getElementsByTagName != 'undefined' && (document.getElementsByTagName('body')[0] != null || document.body != null)) {
-		DOMContentLoadedInit();
-	} else {
-		// Not ready yet, wait a little more.
-		setTimeout("DOMContentLoadedScheduler()", 250);
-	}
-	
-	return true;
+    // quit if the init function has already been called
+    if (window.DOMContentLoadedInitDone) return true;
+    
+    // First check for Safari or
+    //if DOM methods are supported, and the body element exists
+    //(using a double-check including document.body, for the benefit of older moz builds [eg ns7.1] 
+    //in which getElementsByTagName('body')[0] is undefined, unless this script is in the body section)
+    if(/KHTML|WebKit/i.test(navigator.userAgent)) {
+        if(/loaded|complete/.test(document.readyState)) {
+            DOMContentLoadedInit();
+        } else {
+            // Not ready yet, wait a little more.
+            setTimeout("DOMContentLoadedScheduler()", 250);
+        }
+    } else if(typeof document.getElementsByTagName != 'undefined') {
+        var body = document.getElementsByTagName('body');
+        if (body.length > 0 || document.body != null) {
+            DOMContentLoadedInit();
+        }
+    } else {
+        // Not ready yet, wait a little more.
+        setTimeout("DOMContentLoadedScheduler()", 250);
+    }
+    
+    return true;
 }
 
 // Schedule to run the init function.
 setTimeout("DOMContentLoadedScheduler()", 250);
 
 // Just in case window.onload happens first, add it there too.
-addEvent(window, "load", DOMContentLoadedInit);
+if (window.addEventListener) {
+    window.addEventListener("load", DOMContentLoadedInit, false);
+    // If addEventListener supports the DOMContentLoaded event.
+    document.addEventListener("DOMContentLoaded", DOMContentLoadedInit, false);
+} else if (window.attachEvent) {
+    window.attachEvent("onload", DOMContentLoadedInit);
+} else {
+    var _dummy = function() {
+        var $old_onload = window.onload;
+        window.onload = function(e) {
+            DOMContentLoadedInit();
+            $old_onload();
+        }
+    }
+}
 
-// If addEventListener supports the DOMContentLoaded event.
-if(document.addEventListener)
-	document.addEventListener("DOMContentLoaded", DOMContentLoadedInit, false);
-
 /* for Internet Explorer */
 /*@cc_on @*/
 /*@if (@_win32)
-	document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
-	var script = document.getElementById("__ie_onload");
-	script.onreadystatechange = function() {
-		if (this.readyState == "complete") {
-			DOMContentLoadedInit(); // call the onload handler
-		}
-	};
+{
+    var proto = "src='javascript:void(0)'";
+    if (location.protocol == "https:") proto = "src=//0";
+    document.write("<scr"+"ipt id=__ie_onload defer " + proto + "><\/scr"+"ipt>");
+    var script = document.getElementById("__ie_onload");
+    script.onreadystatechange = function() {
+        if (this.readyState == "complete") {
+            DOMContentLoadedInit(); // call the onload handler
+        }
+    }
+};
 /*@end @*/

Modified: zope-cmfplone/branches/upstream/current/skins/plone_3rdParty/livesearch.js
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_3rdParty/livesearch.js	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_3rdParty/livesearch.js	2007-02-09 13:51:10 UTC (rev 624)
@@ -14,34 +14,32 @@
 // +----------------------------------------------------------------------+
 // | Author: Bitflux GmbH <devel at bitflux.ch>                              |
 // +----------------------------------------------------------------------+
+*/
 
-*/
 var liveSearchReq = false;
 var t = null;
 var liveSearchLast = "";
 var queryTarget = "livesearch_reply?q=";
 
 var searchForm = null;
-var searchInput = null; 
+var searchInput = null;
 
 var isIE = false;
 
-
 var _cache = new Object();
 
-var widthOffset=1;
+var widthOffset = 1;
 
-function calculateWidth(){
+function calculateWidth() {
 }
 
-
 function getElementDimensions(elemID) {
     var base = document.getElementById(elemID);
     var offsetTrail = base;
     var offsetLeft = 0;
     var offsetTop = 0;
     var width = 0;
-    
+
     while (offsetTrail) {
         offsetLeft += offsetTrail.offsetLeft;
         offsetTop += offsetTrail.offsetTop;
@@ -52,27 +50,24 @@
         offsetLeft += document.body.leftMargin;
         offsetTop += document.body.topMargin;
     }
-
-    if(!isIE){
-    width =  searchInput.offsetWidth-widthOffset*2;
-    }
-    else {
-    width = searchInput.offsetWidth;
-    }
-
-    return { left:offsetLeft, 
-         top:offsetTop, 
-         width: width, 
+    if (!isIE)
+        width = searchInput.offsetWidth-widthOffset*2;
+    else
+        width = searchInput.offsetWidth;
+    return { left: offsetLeft,
+             top: offsetTop,
+             width: width,
              height: base.offsetHeight,
-         bottom: offsetTop + base.offsetHeight, 
-         right : offsetLeft + width};
+             bottom: offsetTop + base.offsetHeight,
+             right: offsetLeft + width};
 }
 
 function liveSearchInit() {
     searchInput = document.getElementById('searchGadget');
-    if (searchInput == null || searchInput == undefined) return
-//  Only keypress catches repeats in moz/FF but keydown is needed for
-//  khtml based browsers.
+    if (searchInput == null || searchInput == undefined)
+        return
+    // Only keypress catches repeats in moz/FF but keydown is needed for
+    // khtml based browsers.
     if (navigator.userAgent.indexOf("KHTML") > 0) {
         searchInput.addEventListener("keydown",liveSearchKeyPress,false);
         searchInput.addEventListener("focus",liveSearchDoSearch,false);
@@ -85,30 +80,32 @@
     } else {
         searchInput.attachEvent("onkeydown",liveSearchKeyPress);
         searchInput.attachEvent("onkeydown",liveSearchStart);
-        searchInput.attachEvent("onblur",liveSearchHide);
+        searchInput.attachEvent("onblur",liveSearchHideDelayed);
         isIE = true;
     }
 
-//  Why doesn't this work in konq, setting it inline does.
-    searchInput.setAttribute("autocomplete","off");
-
-    var pos = getElementDimensions('searchGadget'); 
+    // Why doesn't this work in konq, setting it inline does.
+    searchInput.setAttribute("autocomplete", "off");
+    var pos = getElementDimensions('searchGadget');
     result = document.getElementById('LSResult');
-    pos.left = pos.left - result.offsetParent.offsetLeft + pos.width;
-    result.style.display='none';
+    if ((typeof result.offsetParent != 'undefined') && (result.offsetParent != null)) {
+        pos.left = pos.left - result.offsetParent.offsetLeft + pos.width;
+    } else {
+        pos.left = pos.left + pos.width;
+    }
+    result.style.display = 'none';
 }
 
 
 function liveSearchHideDelayed() {
-    window.setTimeout("liveSearchHide()",400);
+    window.setTimeout("liveSearchHide()", 400);
 }
-    
-function liveSearchHide() { 
+
+function liveSearchHide() {
     document.getElementById("LSResult").style.display = "none";
     var highlight = document.getElementById("LSHighlight");
-    if (highlight) {
+    if (highlight)
         highlight.removeAttribute("id");
-    }
 }
 
 function getFirstHighlight() {
@@ -124,173 +121,176 @@
 function getHits() {
     var res = document.getElementById("LSShadow");
     var set = res.getElementsByTagName('li');
-    return set
+    return set;
 }
 
 function findChild(object, specifier) {
     var cur = object.firstChild;
     try {
-    while (cur != undefined) {
-        cur = cur.nextSibling;
-        if (specifier(cur) == true) return cur;
-    }
+        while (cur != undefined) {
+            cur = cur.nextSibling;
+            if (specifier(cur) == true)
+                return cur;
+        }
     } catch(e) {};
     return null;
-    
 }
 
 function findNext(object, specifier) {
- var cur = object;
- try {
- while (cur != undefined) {
-
-    cur = cur.nextSibling;
-    if (cur.nodeType==3) cur=cur.nextSibling;
-    
-    if (cur != undefined) {
-        if (specifier(cur) == true) return cur;
-    } else { break }
- }
- } catch(e) {};
- return null;
+    var cur = object;
+    try {
+        while (cur != undefined) {
+            cur = cur.nextSibling;
+            if (cur.nodeType==3)
+                cur=cur.nextSibling;
+            if (cur != undefined) {
+                if (specifier(cur) == true)
+                    return cur;
+            } else { break; }
+        }
+    } catch(e) {};
+    return null;
 }
 
 function findPrev(object, specifier) {
- var cur = object;
- try {
+    var cur = object;
+    try {
         cur = cur.previousSibling;
-        if (cur.nodeType==3) cur=cur.previousSibling;
-        if (cur!=undefined) {
-            if (specifier(cur) == true) 
+        if (cur.nodeType == 3)
+            cur = cur.previousSibling;
+        if (cur != undefined) {
+            if (specifier(cur) == true)
                 return cur;
-        } 
- } catch(e) {};
- return null;
+        }
+    } catch(e) {};
+    return null;
 }
 
-
 function liveSearchKeyPress(event) {
+    var highlight = document.getElementById("LSHighlight");
     if (event.keyCode == 40 )
     //KEY DOWN
     {
-        highlight = document.getElementById("LSHighlight");
         if (!highlight) {
             highlight = getFirstHighlight();
         } else {
             highlight.removeAttribute("id");
             highlight = findNext(highlight, function (o) {return o.className =="LSRow";});
-
         }
-        if (highlight) {
+        if (highlight)
             highlight.setAttribute("id","LSHighlight");
-        } 
-        if (!isIE) { event.preventDefault(); }
-    } 
+        if (!isIE)
+            event.preventDefault();
+    }
     //KEY UP
     else if (event.keyCode == 38 ) {
-        highlight = document.getElementById("LSHighlight");
         if (!highlight) {
             highlight = getLastHighlight();
-        } 
+        }
         else {
             highlight.removeAttribute("id");
             highlight = findPrev(highlight, function (o) {return o.className=='LSRow';});
         }
-        if (highlight) {
-                highlight.setAttribute("id","LSHighlight");
-        }
-        if (!isIE) { event.preventDefault(); }
-    } 
+        if (highlight)
+            highlight.setAttribute("id","LSHighlight");
+        if (!isIE)
+            event.preventDefault();
+    }
     //ESC
     else if (event.keyCode == 27) {
-        highlight = document.getElementById("LSHighlight");
-        if (highlight) {
+        if (highlight)
             highlight.removeAttribute("id");
-        }
         document.getElementById("LSResult").style.display = "none";
-    } 
+    }
 }
+
 function liveSearchStart(event) {
     if (t) {
         window.clearTimeout(t);
     }
-    code = event.keyCode;
+    var code = event.keyCode;
     if (code!=40 && code!=38 && code!=27 && code!=37 && code!=39) {
-        t = window.setTimeout("liveSearchDoSearch()",200);
-    } 
+        t = window.setTimeout("liveSearchDoSearch()", 200);
+    }
 }
 
 function liveSearchDoSearch() {
-
     if (typeof liveSearchRoot == "undefined") {
-        liveSearchRoot = "";
+        if (typeof portal_url == "undefined") {
+            liveSearchRoot = "";
+        } else {
+            if (portal_url[portal_url.length-1] == '/') {
+                liveSearchRoot = portal_url;
+            } else {
+                liveSearchRoot = portal_url + '/';
+            }
+        }
     }
     if (typeof liveSearchRootSubDir == "undefined") {
         liveSearchRootSubDir = "";
     }
-
     if (liveSearchLast != searchInput.value) {
-    if (liveSearchReq && liveSearchReq.readyState < 4) {
-        liveSearchReq.abort();
+        if (liveSearchReq && liveSearchReq.readyState < 4) {
+            liveSearchReq.abort();
+        }
+        if ( searchInput.value == "") {
+            liveSearchHide();
+            return false;
+        }
+        // Do nothing as long as we have less then two characters -
+        // the search results makes no sense, and it's harder on the server.
+        if ( searchInput.value.length < 2) {
+            liveSearchHide();
+            return false;
+        }
+        // Do we have cached results
+        var result = _cache[searchInput.value];
+        if (result) {
+            showResult(result);
+            return;
+        }
+        liveSearchReq = new XMLHttpRequest();
+        liveSearchReq.onreadystatechange = liveSearchProcessReqChange;
+        // Need to use encodeURIComponent instead of encodeURI, to escape +
+        liveSearchReq.open("GET", liveSearchRoot + queryTarget + encodeURIComponent(searchInput.value));
+        liveSearchLast = searchInput.value;
+        liveSearchReq.send(null);
     }
-    if ( searchInput.value == "") {
-        liveSearchHide();
-        return false;
-    }
-
-    // Do nothing as long as we have less then two characters - 
-    // the search results makes no sense, and it's harder on the server.
-    if ( searchInput.value.length < 2) {
-        liveSearchHide();
-        return false;
-    }
-
-    // Do we have cached results
-    var result = _cache[searchInput.value];
-    if (result) {
-        showResult(result); 
-        return;
-    }
-    liveSearchReq = new XMLHttpRequest();
-    liveSearchReq.onreadystatechange= liveSearchProcessReqChange;
-    // need to use encodeURIComponent instead of encodeURI, to escape +
-    liveSearchReq.open("GET", liveSearchRoot + queryTarget + encodeURIComponent(searchInput.value) );
-    liveSearchLast = searchInput.value;
-    liveSearchReq.send(null);
-    }
 }
 
 function showResult(result) {
-  var  res = document.getElementById("LSResult");
-  res.style.display = "block";
-  var  sh = document.getElementById("LSShadow");
-  sh.innerHTML = result;
+    var res = document.getElementById("LSResult");
+    res.style.display = "block";
+    var sh = document.getElementById("LSShadow");
+    sh.innerHTML = result;
 }
 
 function liveSearchProcessReqChange() {
     if (liveSearchReq.readyState == 4) {
-        if (liveSearchReq.status > 299 || liveSearchReq.status < 200  ||
-            liveSearchReq.responseText.length < 10) return; 
-    showResult(liveSearchReq.responseText);
-    _cache[liveSearchLast] = liveSearchReq.responseText;
+        try {
+            if (liveSearchReq.status > 299 || liveSearchReq.status < 200  ||
+                liveSearchReq.responseText.length < 10)
+                return;
+        } catch(e) {
+            return;
+        }
+        showResult(liveSearchReq.responseText);
+        _cache[liveSearchLast] = liveSearchReq.responseText;
     }
 }
 
 function liveSearchSubmit() {
     var highlight = document.getElementById("LSHighlight");
-    
-    if (highlight){
-        target = highlight.getElementsByTagName('a')[0];
+    if (highlight) {
+        var target = highlight.getElementsByTagName('a')[0];
         window.location = liveSearchRoot + liveSearchRootSubDir + target;
         return false;
-    } 
-    else {
+    } else {
         return true;
     }
 }
 
-
-
-if (window.addEventListener) window.addEventListener("load",liveSearchInit,false);
-else if (window.attachEvent) window.attachEvent("onload", liveSearchInit);
-
+if (window.addEventListener)
+    window.addEventListener("load", liveSearchInit, false);
+else if (window.attachEvent)
+    window.attachEvent("onload", liveSearchInit);

Modified: zope-cmfplone/branches/upstream/current/skins/plone_3rdParty/se-highlight.js
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_3rdParty/se-highlight.js	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_3rdParty/se-highlight.js	2007-02-09 13:51:10 UTC (rev 624)
@@ -5,14 +5,15 @@
  * details.
  */
 var searchEngines = [
-    ['^http://(www)?\\.?google.*', 'q='],              // Google
+    ['^http://([^.]+\\.)?google.*', 'q='],              // Google
     ['^http://search\\.yahoo.*', 'p='],                // Yahoo
     ['^http://search\\.msn.*', 'q='],                  // MSN
     ['^http://search\\.aol.*', 'userQuery='],          // AOL
     ['^http://(www\\.)?altavista.*', 'q='],            // AltaVista
     ['^http://(www\\.)?feedster.*', 'q='],             // Feedster
     ['^http://search\\.lycos.*', 'query='],            // Lycos
-    ['^http://(www\\.)?alltheweb.*', 'q=']             // AllTheWeb
+    ['^http://(www\\.)?alltheweb.*', 'q='],             // AllTheWeb
+    ['^http://(www\\.)?ask\\.com.*', 'q=']                   // Ask.com
 ]
 
 function decodeReferrer(ref) {
@@ -25,9 +26,19 @@
     var match = new RegExp('');
     var seQuery = '';
     for (var i = 0; i < searchEngines.length; i ++) {
-        match.compile(searchEngines[i][0], 'i');
+        if (!match.compile) {
+            // Safari doesn't support the non-standard compile method
+            match = new RegExp(searchEngines[i][0], 'i');
+        } else {
+            match.compile(searchEngines[i][0], 'i');
+        }
         if (ref.match(match)) {
-            match.compile('^.*'+searchEngines[i][1]+'([^&]+)&?.*$');
+            
+            if (!match.compile) {
+                match = new RegExp('^.*'+searchEngines[i][1]+'([^&]+)&?.*$', 'i');
+            } else {
+                match.compile('^.*'+searchEngines[i][1]+'([^&]+)&?.*$');
+            }
             seQuery = ref.replace(match, '$1');
             if (seQuery) {
                 seQuery = decodeURIComponent(seQuery);

Modified: zope-cmfplone/branches/upstream/current/skins/plone_content/document_byline.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_content/document_byline.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_content/document_byline.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -5,16 +5,15 @@
 
     <div class="documentByLine">
         <img src="" alt=""
-           title="This document is locked."
            tal:define="locked portal/lock_icon.gif;"
            tal:condition="isLocked"
            tal:replace="structure python:locked.tag(title='Locked')"
-           i18n:attributes="title label_document_locked;"
            />
 
         <tal:name tal:condition="creator"
             tal:define="author python:mtool.getMemberInfo(creator)">
-          <span i18n:translate="label_by_author">
+          <span class="documentAuthor"
+                i18n:translate="label_by_author">
             by
           <a href="#"
              tal:attributes="href string:${portal_url}/author/${creator}"
@@ -23,18 +22,20 @@
              i18n:name="author">
             Bob Dobalina
           </a>
-          </span>
 
           &mdash;
-
+          
+          </span>
         </tal:name>
 
-        <span i18n:translate="box_last_modified">
-        last modified
+        <span class="documentModified">
+            <span i18n:translate="box_last_modified">
+            last modified
+            </span>
+            <span tal:replace="python:toLocalizedTime(here.ModificationDate(),long_format=1)">
+            August 16, 2001 at 23:35:59
+            </span>
         </span>
-        <span tal:replace="python:toLocalizedTime(here.ModificationDate(),long_format=1)">
-        August 16, 2001 at 23:35:59
-        </span>
 
         <span class="state-expired"
             tal:condition="python:portal.isExpired(here)"
@@ -42,15 +43,16 @@
         &mdash; expired
         </span>
 
-        <span tal:define="locked portal/lock_icon.gif"
+        <span class="documentLocked"
+              tal:define="locked portal/lock_icon.gif"
               tal:condition="isLocked">
             <img src=""
                  tal:replace="structure python:locked.tag(title='This item is locked')"
-                 alt="Object locked"
-                 i18n:attributes="alt label_object_locked;" />
+                 alt="Object locked" />
         </span>
 
-        <div tal:condition="here/Contributors"
+        <div class="documentContributors"
+             tal:condition="here/Contributors"
              i18n:translate="text_contributors">
             Contributors:
             <span i18n:name="name"

Modified: zope-cmfplone/branches/upstream/current/skins/plone_content/document_view.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_content/document_view.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_content/document_view.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -25,7 +25,6 @@
            tal:condition="here/Description">
             Description
         </p>
-    
         <p tal:condition="python: not text and is_editable"
            i18n:translate="no_body_text"
            class="discreet">

Modified: zope-cmfplone/branches/upstream/current/skins/plone_content/event_view.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_content/event_view.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_content/event_view.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -16,6 +16,16 @@
             Title or id
         </h1>
 
+        <div metal:use-macro="here/document_byline/macros/byline">
+            Get the byline - contains details about author and modification date.
+        </div>
+
+        <p class="documentDescription description"
+           tal:content="here/Description"
+           tal:condition="here/Description">
+            Description
+        </p>
+        
         <div class="eventDetails vcard">
         <table class="vertical listing"
                summary="Event details" i18n:attributes="summary summary_event_details;">
@@ -113,16 +123,6 @@
         </table>
         </div>
 
-        <div metal:use-macro="here/document_byline/macros/byline">
-            Get the byline - contains details about author and modification date.
-        </div>
-
-        <p class="documentDescription description"
-           tal:content="here/Description"
-           tal:condition="here/Description">
-            Description
-        </p>
-
         <div tal:condition="here/getText|nothing">
             <div tal:replace="structure here/getText" />
         </div>

Modified: zope-cmfplone/branches/upstream/current/skins/plone_content/file_view.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_content/file_view.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_content/file_view.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -64,13 +64,12 @@
         </small>
     
         <div class="row"
-             tal:condition="python:test(content_type.startswith('text'),1,0)">
+             tal:condition="python: content_type.startswith('text')">
     
                 <h2 i18n:translate="heading_file_contents">File contents</h2>
     
                 <pre tal:content="here/get_data|here/data|nothing">
                 </pre>
-
         </div>
 
         <div metal:use-macro="here/document_relateditems/macros/relatedItems">

Modified: zope-cmfplone/branches/upstream/current/skins/plone_content/folder_tabular_view.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_content/folder_tabular_view.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_content/folder_tabular_view.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -103,7 +103,7 @@
                                     <a href="#"
                                        tal:content="item_title_or_id"
                                        tal:attributes="href item/getRemoteUrl;
-                                                       class item_wf_state_class;
+                                                       class string:${item_wf_state_class} visualIconPadding;
                                                        title item_description;">
                                         External Link
                                     </a>

Modified: zope-cmfplone/branches/upstream/current/skins/plone_content/image_view_fullscreen.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_content/image_view_fullscreen.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_content/image_view_fullscreen.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -1,3 +1,4 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
       lang="en"
       i18n:domain="plone">

Modified: zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/dragdropreorder.js
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/dragdropreorder.js	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/dragdropreorder.js	2007-02-09 13:51:10 UTC (rev 624)
@@ -105,7 +105,9 @@
     var req = new XMLHttpRequest();
     req.open("POST", "folder_moveitem", true);
     req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
-    req.send("item_id="+ploneDnDReorder.dragging.id+"&delta:int="+delta);
+    // Strip off id prefix
+    var item_id = ploneDnDReorder.dragging.id.substr('folder-contents-item-'.length);
+    req.send("item_id="+item_id+"&delta:int="+delta);
 }
 
 ploneDnDReorder.initializeDragDrop = function() {

Modified: zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/highlightsearchterms.js
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/highlightsearchterms.js	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/highlightsearchterms.js	2007-02-09 13:51:10 UTC (rev 624)
@@ -25,6 +25,8 @@
     for (var term_index=0; term_index < terms.length; term_index++) {
         // don't highlight reserved catalog search terms
         var term = terms[term_index];
+        if (term.length < 1)
+            continue;
         var term_lower = term.toLowerCase();
         if (term_lower != 'not'
             && term_lower != 'and'

Modified: zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/mark_special_links.js
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/mark_special_links.js	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/mark_special_links.js	2007-02-09 13:51:10 UTC (rev 624)
@@ -8,8 +8,40 @@
     // terminate if we hit a non-compliant DOM implementation
     if (!W3CDOM) { return false; }
 
+    // first make external links open in a new window, afterwards do the
+    // normal plone link wrapping in only the content area
+
+    if ((typeof external_links_in_content_only != 'undefined') &&
+        (external_links_in_content_only == false)) {
+        links = document.getElementsByTagName('a');
+        for (i=0; i < links.length; i++) {
+            if ( (links[i].getAttribute('href'))
+                 && (links[i].className.indexOf('link-plain')==-1) ) {
+                var linkval = links[i].getAttribute('href');
+
+                // check if the link href is a relative link, or an absolute link to
+                // the current host.
+                if (linkval.toLowerCase().indexOf(window.location.protocol
+                                                  + '//'
+                                                  + window.location.host)==0) {
+                    // absolute link internal to our host - do nothing
+                } else if (linkval.indexOf('http:') != 0) {
+                    // not a http-link. Possibly an internal relative link, but also
+                    // possibly a mailto or other protocol add tests for relevant
+                    // protocols as you like.
+                    // do nothing
+                } else {
+                    // we are in here if the link points to somewhere else than our
+                    // site.
+                    links[i].setAttribute('target', '_blank');
+                }
+            }
+        }
+    }
+
     contentarea = getContentArea();
-    if (!contentarea) { return false; }
+    if (!contentarea)
+        return false;
 
     links = contentarea.getElementsByTagName('a');
     for (i=0; i < links.length; i++) {
@@ -45,10 +77,14 @@
                     // we do not want to mess with those links that already have
                     // images in them
                     wrapNode(links[i], 'span', 'link-external');
-                    // uncomment the next line if you want external links to be
-                    // opened in a new window.
-                    // links[i].setAttribute('target', '_blank');
                 }
+                // set open_links_in_external_window in plone_javascript_variables.js.pt
+                // to true if you want external links to be opened in a new
+                // window.
+                if ((typeof external_links_open_new_window != 'undefined') &&
+                    (external_links_open_new_window == true)) {
+                    links[i].setAttribute('target', '_blank');
+                }
             }
         }
     }

Modified: zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/plone_javascript_variables.js.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/plone_javascript_variables.js.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/plone_javascript_variables.js.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -4,4 +4,10 @@
 var portal_url = '<tal:block replace="here/portal_url" />';
 var form_modified_message = '<tal:block tal:replace="python: here.translate('text_form_modified_message', default='Your form has not been saved. All changes you have made will be lost.', escape_for_js=True)" />';
 var form_resubmit_message = '<tal:block tal:replace="python: here.translate('text_form_resubmit_message', default='Your already clicked the submit button. Do you really want to submit this form again?', escape_for_js=True)" />';
+
+// the following are flags for mark_special_links.js
+// links get the target="_blank" attribute
+var external_links_open_new_window = false;
+// apply only to links in content area (id="content" or id="region-content")
+var external_links_in_content_only = true;
 </metal:block>
\ No newline at end of file

Modified: zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/register_function.js
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/register_function.js	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/register_function.js	2007-02-09 13:51:10 UTC (rev 624)
@@ -72,7 +72,7 @@
 if (typeof addDOMLoadEvent != 'undefined') {
     registerPloneFunction = function (func) {
         // registers a function to fire ondomload.
-        registerEventListener(window, "domload", func);
+        addDOMLoadEvent(func);
     }
 } else {
     registerPloneFunction = function (func) {

Modified: zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/testHighlightsearchterms.js
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/testHighlightsearchterms.js	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_ecmascript/testHighlightsearchterms.js	2007-02-09 13:51:10 UTC (rev 624)
@@ -42,6 +42,10 @@
         this.sandbox.appendChild(testnode);
     }
 
+    this.testEndlessLoop = function() {
+        highlightSearchTerms(['','site:plone.org','plone','rules'], this.sandbox)
+    }
+
     this.tearDown = function() {
         clearChildNodes(this.sandbox);
     }

Modified: zope-cmfplone/branches/upstream/current/skins/plone_form_scripts/enableSyndication.cpy
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_form_scripts/enableSyndication.cpy	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_form_scripts/enableSyndication.cpy	2007-02-09 13:51:10 UTC (rev 624)
@@ -9,6 +9,7 @@
 ##parameters=
 
 from Products.CMFPlone import PloneMessageFactory as _
+from Products.CMFPlone.utils import safe_unicode
 
 if context.portal_syndication.isSiteSyndicationAllowed():
     context.portal_syndication.enableSyndication(context)
@@ -17,7 +18,7 @@
     message=_(u'Syndication not allowed')
 
 from Products.CMFPlone.utils import transaction_note
-transaction_note('%s for %s at %s' % (message, unicode(context.title_or_id(), 'utf-8'), context.absolute_url()))
+transaction_note('%s for %s at %s' % (message, safe_unicode(context.title_or_id()), context.absolute_url()))
 
 context.plone_utils.addPortalMessage(message)
 return state

Modified: zope-cmfplone/branches/upstream/current/skins/plone_form_scripts/send_feedback.cpy
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_form_scripts/send_feedback.cpy	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_form_scripts/send_feedback.cpy	2007-02-09 13:51:10 UTC (rev 624)
@@ -15,17 +15,15 @@
 from Products.CMFPlone import PloneMessageFactory as _
 from ZODB.POSException import ConflictError
 
-##
 ## This may change depending on the called (portal_feedback or author)
 state_success = "success"
 state_failure = "failure"
 
-
 plone_utils = getToolByName(context, 'plone_utils')
 mtool = getToolByName(context, 'portal_membership')
+urltool = getToolByName(context, 'portal_url')
+portal = urltool.getPortalObject()
 
-site_properties = getToolByName(context, 'portal_properties').site_properties
-
 ## make these arguments?
 referer = REQUEST.get('referer', 'unknown referer')
 subject = REQUEST.get('subject', '')
@@ -33,12 +31,10 @@
 author = REQUEST.get('author', None) # None means portal administrator
 
 sender = mtool.getAuthenticatedMember()
+envelope_from = portal.getProperty('email_from_address')
 
-site_properties = getToolByName(context, 'portal_properties').site_properties
-envelope_from = site_properties.email_from_address
-
 if author is None:
-    send_to_address = site_properties.email_from_address
+    send_to_address = portal.getProperty('email_from_address')
 else:
     send_to_address = mtool.getMemberById(author).getProperty('email')
     state_success = "success_author"
@@ -52,7 +48,7 @@
     # happens if you don't exist as user in the portal (but at a higher level)
     # or if your memberdata is incomplete.
     # Would be nicer to check in the feedback form, but that's hard to do securely
-    context.plone_utils.addPortalMessage(_(u'Could not find a valid email address'))
+    plone_utils.addPortalMessage(_(u'Could not find a valid email address'))
     return state.set(status=state_failure)
     
 sender_id = "%s (%s), %s" % (sender.getProperty('fullname'), sender.getId(), send_from_address)
@@ -77,10 +73,10 @@
 except ConflictError:
     raise
 except: # TODO Too many things could possibly go wrong. So we catch all.
-    exception = context.plone_utils.exceptionString()
+    exception = plone_utils.exceptionString()
     message = _(u'Unable to send mail: ${exception}',
                 mapping={u'exception' : exception})
-    context.plone_utils.addPortalMessage(message)
+    plone_utils.addPortalMessage(message)
     return state.set(status=state_failure)
 
 tmsg='Sent feedback from %s to %s' % ('x', 'y')
@@ -90,5 +86,5 @@
 REQUEST.set('message', None)
 REQUEST.set('subject', None)
 
-context.plone_utils.addPortalMessage(_(u'Mail sent.'))
+plone_utils.addPortalMessage(_(u'Mail sent.'))
 return state

Modified: zope-cmfplone/branches/upstream/current/skins/plone_form_scripts/send_feedback_site.cpy
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_form_scripts/send_feedback_site.cpy	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_form_scripts/send_feedback_site.cpy	2007-02-09 13:51:10 UTC (rev 624)
@@ -20,24 +20,20 @@
 state_success = "success"
 state_failure = "failure"
 
-
 plone_utils = getToolByName(context, 'plone_utils')
-mtool = getToolByName(context, 'portal_membership')
+urltool = getToolByName(context, 'portal_url')
+portal = urltool.getPortalObject()
+url = urltool()
 
-site_properties = getToolByName(context, 'portal_properties').site_properties
-
 ## make these arguments?
 subject = REQUEST.get('subject', '')
 message = REQUEST.get('message', '')
 sender_from_address = REQUEST.get('sender_from_address', '')
 sender_fullname = REQUEST.get('sender_fullname', '')
 
-url     = context.portal_url
+send_to_address = portal.getProperty('email_from_address')
+envelope_from = portal.getProperty('email_from_address')
 
-site_properties = getToolByName(context, 'portal_properties').site_properties
-send_to_address = site_properties.email_from_address
-envelope_from = site_properties.email_from_address
-
 state.set(status=state_success) ## until proven otherwise
 
 host = context.MailHost # plone_utils.getMailHost() (is private)
@@ -56,10 +52,10 @@
 except ConflictError:
     raise
 except: # TODO Too many things could possibly go wrong. So we catch all.
-    exception = context.plone_utils.exceptionString()
+    exception = plone_utils.exceptionString()
     message = _(u'Unable to send mail: ${exception}',
                 mapping={u'exception' : exception})
-    context.plone_utils.addPortalMessage(message)
+    plone_utils.addPortalMessage(message)
     return state.set(status=state_failure)
 
 ## clear request variables so form is cleared as well
@@ -68,5 +64,5 @@
 REQUEST.set('sender_from_address', None)
 REQUEST.set('sender_fullname', None)
 
-context.plone_utils.addPortalMessage(_(u'Mail sent.'))
+plone_utils.addPortalMessage(_(u'Mail sent.'))
 return state

Modified: zope-cmfplone/branches/upstream/current/skins/plone_form_scripts/sendto.cpy
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_form_scripts/sendto.cpy	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_form_scripts/sendto.cpy	2007-02-09 13:51:10 UTC (rev 624)
@@ -20,7 +20,6 @@
 mtool = getToolByName(context, 'portal_membership')
 site_properties = getToolByName(context, 'portal_properties').site_properties
 pretty_title_or_id = plone_utils.pretty_title_or_id
-empty_title = plone_utils.getEmptyTitle()
 
 if not mtool.checkPermission(AllowSendto, context):
     context.plone_utils.addPortalMessage(_(u'You are not allowed to send this link.'))

Modified: zope-cmfplone/branches/upstream/current/skins/plone_forms/content_status_history.cpt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_forms/content_status_history.cpt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_forms/content_status_history.cpt	2007-02-09 13:51:10 UTC (rev 624)
@@ -47,7 +47,7 @@
 
       <p i18n:translate="description_publishing_process">
         An item's status (also called its review state) determines who
-        can see it.  A <strong>private</strong> item can only be
+        can see it. A <strong>private</strong> item can only be
         viewed by its Owner and by the site management. Only
         <strong>published</strong> items are available to the general
         user base and anonymous visitors. To make an item published,
@@ -58,7 +58,7 @@
         Another way to control the visibility of an item is with its
         <strong>effective date</strong>. An item is not publicly
         searchable before its effective date, <em>even if its status is
-        <strong>published</strong></em>.  This will prevent the item
+        <strong>published</strong></em>. This will prevent the item
         from showing up in portlets (or any other templates fed by catalog
         queries), although the item will still be available if accessed 
         directly via URL.
@@ -111,7 +111,7 @@
             <div class="formHelp"
                  i18n:translate="help_effective_date">
               The date when the item will be available (of course it
-              needs to be published too).  If no date is selected the
+              needs to be published too). If no date is selected the
               item will be effective immediately.
             </div>
 

Modified: zope-cmfplone/branches/upstream/current/skins/plone_forms/discussion_reply_form.cpt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_forms/discussion_reply_form.cpt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_forms/discussion_reply_form.cpt	2007-02-09 13:51:10 UTC (rev 624)
@@ -66,7 +66,8 @@
 
             <legend i18n:translate="legend_add_comment">Add comment</legend>
             <p i18n:translate="description_add_comment">
-                You can add a comment by filling out the form below. Plain text formatting.
+                You can add a comment by filling out the form below. Plain text
+                formatting.
             </p>
 
             <input type="hidden" name="Creator" value=""
@@ -78,9 +79,10 @@
                 <tal:block replace="structure here/info.gif"/>
 
                 <p i18n:translate="legend_note_reply_anonymous">
-                    Note: you are not logged in.  You may optionally enter your username
-                    and password below.  If you don't enter your username and
-                    password below, this comment will be posted as the 'Anonymous User'.
+                    Note: you are not logged in. You may optionally enter your
+                    username and password below. If you don't enter your
+                    username and password below, this comment will be posted as
+                    the 'Anonymous User'.
                 </p>
 
                 <div class="field">

Modified: zope-cmfplone/branches/upstream/current/skins/plone_forms/folder_localrole_form.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_forms/folder_localrole_form.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_forms/folder_localrole_form.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -393,7 +393,7 @@
                           tabindex=""
                           tal:attributes="tabindex tabindex/next;">
                       <option value="fullname" i18n:translate="label_fullname">
-                          User Full Name
+                          Full Name
                       </option>
                       <option value="login" i18n:translate="label_login_name">
                           Login Name

Modified: zope-cmfplone/branches/upstream/current/skins/plone_forms/history_form.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_forms/history_form.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_forms/history_form.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -55,7 +55,7 @@
   <metal:block tal:condition="not: has_history">
   <h2 i18n:translate="label_historical_unavailable">Historical not available</h2>
   <span tal:omit-tag="" i18n:translate="description_historical_unavailable">
-  This class does not support the historical interface.  The content must
+  This class does not support the historical interface. The content must
   mix-in OFS.History.Historical
   </span>
   </metal:block>

Modified: zope-cmfplone/branches/upstream/current/skins/plone_forms/member_search_form.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_forms/member_search_form.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_forms/member_search_form.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -38,6 +38,23 @@
                        tal:attributes="tabindex tabindex/next;"
                        />
             </div>
+
+           <div class="field">
+                <label for="fullname"
+                       i18n:translate="label_fullname">Full Name</label>
+
+                <div class="formHelp" i18n:translate="help_search_fullname">
+                Return users with full names containing this value.
+                </div>
+
+                <input type="text"
+                       id="fullname"
+                       name="fullname"
+                       size="25"
+                       tabindex=""
+                       tal:attributes="tabindex tabindex/next;"
+                       />
+            </div>
     
             <div class="field">
                 <label for="email"

Modified: zope-cmfplone/branches/upstream/current/skins/plone_forms/member_search_results.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_forms/member_search_results.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_forms/member_search_results.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -26,7 +26,7 @@
 
         <div>
         <metal:block tal:repeat="result batch">
-            <div class="card" tal:define="userid result/getUserId;
+            <div class="card" tal:define="userid result/getMemberId;
                                            home python:container.portal_membership.getHomeUrl(userid, verifyPermission=1);
                                            portrait python: here.portal_membership.getPersonalPortrait(userid);">
                 <a href="#" tal:attributes="href home">

Modified: zope-cmfplone/branches/upstream/current/skins/plone_forms/undo_form.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_forms/undo_form.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_forms/undo_form.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -32,7 +32,7 @@
 
         <p i18n:translate="description_undo_action_select">
         Select one or more transactions below and then click on the &quot;Undo&quot;
-        button to undo the transactions.  Note that even though a transaction
+        button to undo the transactions. Note that even though a transaction
         is shown below, you will not be able to undo it if later transactions
         modified objects that were modified by the transaction.
         </p>

Modified: zope-cmfplone/branches/upstream/current/skins/plone_images/add_icon.gif
===================================================================
(Binary files differ)

Modified: zope-cmfplone/branches/upstream/current/skins/plone_login/enabling_cookies.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_login/enabling_cookies.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_login/enabling_cookies.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -50,7 +50,7 @@
 
 <ol>
   <li i18n:translate="text_moz_cookies_step1">Click Edit on the menu at the top of your browser and select Preferences</li>
-  <li i18n:translate="text_moz_cookies_step2">Find "Privacy &amp; Security" in the menu on the left.  If there is a [+] to the left of "Privacy &amp; Security", click it.</li>
+  <li i18n:translate="text_moz_cookies_step2">Find "Privacy &amp; Security" in the menu on the left. If there is a [+] to the left of "Privacy &amp; Security", click it.</li>
   <li i18n:translate="text_moz_cookies_step3">Select "Cookies".</li>
   <li i18n:translate="text_moz_cookies_step4">Select "Enable cookies for the originating web site only" or "Enable all cookies" and click "OK"</li>
 </ol>
@@ -68,7 +68,7 @@
 
 <ol>
   <li i18n:translate="text_netscape6_cookies_step1">Click Edit on the menu at the top of your browser and select Preferences</li>
-  <li i18n:translate="text_netscape6_cookies_step2">Find "Privacy &amp; Security" in the menu on the left.  If there is a triangle pointing to the right next to Privacy &amp; Security, click it.</li>
+  <li i18n:translate="text_netscape6_cookies_step2">Find "Privacy &amp; Security" in the menu on the left. If there is a triangle pointing to the right next to Privacy &amp; Security, click it.</li>
   <li i18n:translate="text_netscape6_cookies_step3">Select "Cookies" under "Privacy &amp; Security"</li>
   <li i18n:translate="text_netscape6_cookies_step4">Select "Enable cookies for the originating web site only" or "Enable all cookies" and click "OK"</li>
 </ol>

Modified: zope-cmfplone/branches/upstream/current/skins/plone_login/insufficient_privileges.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_login/insufficient_privileges.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_login/insufficient_privileges.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -10,12 +10,12 @@
       <h1 i18n:translate="heading_no_privileges">Insufficient Privileges</h1>
 
       <p i18n:translate="description_no_privileges">
-      You do not have sufficient privileges to view this page.  If you believe
+      You do not have sufficient privileges to view this page. If you believe
       you are receiving this message in error, please send an e-mail to
       </p>
 
       <a tal:replace="structure python: here.spamProtect(site_properties.email_from_address)" />.
-      
+
    </div>
 </div>
 

Modified: zope-cmfplone/branches/upstream/current/skins/plone_login/login_failed.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_login/login_failed.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_login/login_failed.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -37,7 +37,7 @@
     <ul>
       <li i18n:translate="description_still_failure_reason1">
         You may be running web filtering software that
-        disables cookies.  If so, you will need to configure the
+        disables cookies. If so, you will need to configure the
         software so that it enables you to accept cookies from
         <span tal:content="utool" tal:omit-tag="" i18n:name="url">url</span>
       </li>

Modified: zope-cmfplone/branches/upstream/current/skins/plone_prefs/personalize_form.cpt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_prefs/personalize_form.cpt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_prefs/personalize_form.cpt	2007-02-09 13:51:10 UTC (rev 624)
@@ -63,9 +63,19 @@
                       tal:condition="member"
                       tal:attributes="action template_id">
 
-                    <fieldset>
+                    <fieldset tal:define="macros here/additional_memberdata/macros | nothing;
+                                          top_macro macros/top | nothing;
+                                          showTop python:top_macro;
+                                          bottom_macro macros/bottom | nothing;
+                                          showBottom python:bottom_macro;
+                                          after_primary macros/after_primary| nothing;
+                                          showAfterPrimary python:after_primary;">
 
                         <legend i18n:translate="legend_personal_details">Personal Details</legend>
+                        
+                        <tal:macro condition="showTop">
+                            <div metal:use-macro="top_macro"/>
+                        </tal:macro>
 
                         <div class="field"
                              tal:define="error errors/fullname | nothing;
@@ -114,7 +124,11 @@
                                    />
 
                         </div>
-
+                        
+                        <tal:macro condition="showAfterPrimary">
+                            <div metal:use-macro="after_primary"/>
+                        </tal:macro>
+                        
                         <div class="field"
                              tal:define="error errors/location | nothing;
                                          location python:request.get('location', member.getProperty('location', ''));"
@@ -397,7 +411,11 @@
                             <label for="pdelete" i18n:translate="label_delete_portrait">Delete Portrait</label>
 
                         </div>
-
+                        
+                        <tal:macro condition="showBottom">
+                            <div metal:use-macro="bottom_macro" />
+                        </tal:macro>
+                        
                         <div class="formControls">
                             <input class="context"
                                    tabindex=""

Modified: zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_error_log_form.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_error_log_form.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_error_log_form.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -21,7 +21,7 @@
 
     <p i18n:translate="description_error_log_setup">
         This page lists the exceptions that have occurred in this site
-        recently.  You can configure how many exceptions should be kept
+        recently. You can configure how many exceptions should be kept
         and whether the exceptions should be copied to Zope's event log
         file(s). 
     </p>

Modified: zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_error_log_showEntry.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_error_log_showEntry.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_error_log_showEntry.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -25,7 +25,9 @@
         <div tal:define="entry python:here.error_log.getLogEntryById(request.get('id'))">
 
             <em tal:condition="not:entry">
-                <span i18n:translate="text_errlog_notfound"> The specified log entry was not found.  It may have expired.</span>
+                <span i18n:translate="text_errlog_notfound">
+                    The specified log entry was not found. It may have expired.
+                </span>
             </em>
 
             <div tal:condition="entry">

Modified: zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_group_edit.py
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_group_edit.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_group_edit.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -14,7 +14,12 @@
 msg = _(u'No changes done.')
 
 if addname:
-    context.portal_groups.addGroup(addname,(),())
+    success = context.portal_groups.addGroup(addname,(),())
+    if not success:
+        msg = _(u'Could not add group ${name}, perhaps a member or group with '
+                u'this name already exists.', mapping={u'name' : addname})
+        context.plone_utils.addPortalMessage(msg)
+        return context.prefs_group_details()
     group=context.portal_groups.getGroupById(addname)
     msg = _(u'Group ${name} has been added.',
             mapping={u'name' : addname})

Modified: zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_group_members.cpt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_group_members.cpt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_group_members.cpt	2007-02-09 13:51:10 UTC (rev 624)
@@ -134,7 +134,8 @@
                             <a href="" tal:attributes="href string:prefs_group_details?groupname=${this_user/getGroupName}"
                                          tal:content="this_user/getGroupTitleOrName | default">
                               <span i18n:translate="link_groupname_not_available">
-                              groupname not available</span>
+                                  groupname not available
+                              </span>
                             </a>
                           </td>
                         </tal:block>
@@ -145,7 +146,8 @@
                             <a href="" tal:attributes="href string:prefs_user_details?userid=${this_user/getId}"
                                 tal:content="this_user/getUserName | default">
                                 <span i18n:translate="link_username_not_available">
-                                username not available</span>
+                                    username not available
+                                </span>
                             </a>
                           </td>
                         </tal:block>

Modified: zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_main_template.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_main_template.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_main_template.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -1,8 +1,6 @@
 <metal:page define-macro="master">
   <tal:block metal:use-macro="here/main_template/macros/master">
 
- 
- 
   <head metal:use-macro="here/header/macros/html_header">
 
     <metal:fillbase fill-slot="base">
@@ -12,7 +10,8 @@
 
     <metal:headslot fill-slot="head_slot">
       <metal:headslot define-slot="head_slot" />
-      <tal:override-slot define="global sl python:True" />
+      <tal:override-slot define="global sl python:True;
+                                 global hidecolumns string:visualColumnHideTwo" />
     </metal:headslot>
 
     <metal:cssslot fill-slot="css_slot">
@@ -25,7 +24,6 @@
 
   </head>
 
-
     <metal:block fill-slot="top_slot"
                  tal:define="dummy python:request.set('disable_border',1)" />
 

Modified: zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_navigation_form.cpt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_navigation_form.cpt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_navigation_form.cpt	2007-02-09 13:51:10 UTC (rev 624)
@@ -57,7 +57,6 @@
                     prefer manually constructing this part of the navigation.
                 </div>
             </div>
-            
             <div class="field"
                 tal:define="value python:navtree_props.getProperty('name', None);
                             value request/name|value;
@@ -82,8 +81,29 @@
                        tal:attributes="value value;"/>
                 <div tal:content="error">Validation error output</div>
               </div>
-              
               <div class="field"
+                   tal:define="value python:navtree_props.getProperty('includeTop', False);
+                               value request/includeTop|value;
+                               error errors/includeTop|nothing"
+                   tal:attributes="class python:test(error, 'field error', 'field')">
+
+                <input type="checkbox"
+                       class="noborder"
+                       id="cb_include_top"
+                       name="includeTop"
+                       value="1"
+                       tal:attributes="checked python:test(value, 'checked', None)" />
+                <label for="cb_include_top"
+                       i18n:translate="label_include_top_enable">
+                    Include top level navigation link
+                </label>
+
+                <div class="formHelp" i18n:translate="help_include_top">
+                    By default, a 'Home' link is generated that points to the root of your site.  You can turn this off if you
+                    prefer not to display it.
+                </div>
+            </div> 
+              <div class="field"
                 tal:define="value python:navtree_props.getProperty('root', None);
                             value request/root|value;
                             error errors/root|nothing"

Modified: zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_navigation_set.cpy
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_navigation_set.cpy	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_navigation_set.cpy	2007-02-09 13:51:10 UTC (rev 624)
@@ -5,7 +5,7 @@
 ##bind script=script
 ##bind state=state
 ##bind subpath=traverse_subpath
-##parameters=generated_tabs=False, portaltypes=[], enable_wf_state_filtering=False, wf_states_to_show=[], bottomLevel=0, name='Navigation', root='/', currentFolderOnlyInNavtree=False, topLevel=0, RESPONSE=None
+##parameters=generated_tabs=False, portaltypes=[], enable_wf_state_filtering=False, wf_states_to_show=[], bottomLevel=0, name='Navigation', root='/', currentFolderOnlyInNavtree=False, topLevel=0, includeTop=False, RESPONSE=None
 ##title=Set Navigation Prefs
 ##
 
@@ -36,7 +36,8 @@
                         root=root,
                         currentFolderOnlyInNavtree=currentFolderOnlyInNavtree,
                         topLevel=topLevel,
-                        bottomLevel=bottomLevel)
+                        bottomLevel=bottomLevel,
+                        includeTop=includeTop)
 
 context.plone_utils.addPortalMessage(_(u'Navigation settings updated.'))
 return state

Modified: zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_search_macros.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_search_macros.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_search_macros.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -89,7 +89,8 @@
                   <a href="" tal:attributes="href string:prefs_group_details?groupname=${obj/getGroupName}"
                             tal:content="obj/getGroupName | default">
                         <span i18n:translate="link_groupname_not_available">
-                        groupname not available</span>
+                            groupname not available
+                        </span>
                 </a>
         </tal:block>
         <tal:block tal:condition="not:obj/getGroupName | nothing">
@@ -97,7 +98,8 @@
                   <a href="" tal:attributes="href string:prefs_user_details?userid=${obj/getId}"
                         tal:content="obj/getUserName | default">
                         <span i18n:translate="link_username_not_available">
-                        username not available</span>
+                            username not available
+                        </span>
                 </a>
                 </tal:block>
               </td>

Modified: zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_user_details.cpt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_user_details.cpt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_user_details.cpt	2007-02-09 13:51:10 UTC (rev 624)
@@ -75,9 +75,21 @@
                   tal:condition="user | nothing"
               tal:attributes="action template_id">
 
-          <fieldset>
+          <fieldset tal:define="macros here/additional_memberdata/macros | nothing;
+                                          top_macro macros/top | nothing;
+                                          showTop python:top_macro;
+                                          bottom_macro macros/bottom | nothing;
+                                          showBottom python:bottom_macro;
+                                          after_primary macros/after_primary| nothing;
+                                          showAfterPrimary python:after_primary;">
+                                          
             <legend i18n:translate="legend_member_details">User Details</legend>
     
+            <tal:macro condition="showTop">
+                <div metal:use-macro="top_macro"/>
+            </tal:macro>
+    
+    
             <input type="hidden" name="userid" value="username"
                    tal:attributes="value member/getId" />
     
@@ -133,6 +145,10 @@
                          />
           </div>
 
+            <tal:macro condition="showAfterPrimary">
+                <div metal:use-macro="after_primary"/>
+            </tal:macro>
+            
             <div class="field"
                  tal:define="error errors/location | nothing;
                              location python:request.get('location', member.getProperty('location', ''));"
@@ -355,7 +371,10 @@
 
             </div>
 
-    
+            <tal:macro condition="showBottom">
+                <div metal:use-macro="bottom_macro" />
+            </tal:macro>
+
             <div class="formControls">
                     <input class="context"
                         tabindex=""

Modified: zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_users_overview.cpt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_users_overview.cpt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_prefs/prefs_users_overview.cpt	2007-02-09 13:51:10 UTC (rev 624)
@@ -56,7 +56,7 @@
         <p i18n:translate="description_user_management">
           Click the user's name to see and change the details of a
           specific user. Click the envelope icon to send a mail to
-          the user.  You can also edit the e-mail addresses, and
+          the user. You can also edit the e-mail addresses, and
           add/remove users.
         </p>
         <p i18n:translate="user_role_note">

Modified: zope-cmfplone/branches/upstream/current/skins/plone_prefs/reconfig_form.cpt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_prefs/reconfig_form.cpt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_prefs/reconfig_form.cpt	2007-02-09 13:51:10 UTC (rev 624)
@@ -206,7 +206,7 @@
                     Determines if your Plone is optimized for small or large
                     sites. In environments with a lot of users and/or groups it
                     can be very slow or impossible to build a list all users or
-                    groups.  This option tunes the user interface and behaviour
+                    groups. This option tunes the user interface and behaviour
                     of Plone for this case by allowing you to search for
                     users/groups instead of listing all of them.
                 </div>

Modified: zope-cmfplone/branches/upstream/current/skins/plone_scripts/check_id.py
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_scripts/check_id.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_scripts/check_id.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -31,6 +31,7 @@
 from ZODB.POSException import ConflictError
 from Products.CMFCore.utils import getToolByName
 from Products.CMFPlone import PloneMessageFactory as _
+from Products.CMFPlone.utils import base_hasattr
 
 # if an alternative id has been supplied, see if we need to use it
 
@@ -99,13 +100,28 @@
         except Unauthorized:
             return # nothing we can do
 
-    if hasattr(contained_by, 'contentIds'):
+    # Check for an existing object.  If it is a content object, then we don't
+    # try to replace it; there may be other attributes we shouldn't replace,
+    # but because there are some always replaceable attributes, this is the
+    # only type of filter we can reasonably expect to work.
+    exists = False
+    # Optimization for BTreeFolders
+    if base_hasattr(contained_by, 'has_key'):
+        exists = contained_by.has_key(id)
+    # Otherwise check object ids (using getattr can trigger Unauth exceptions)
+    elif base_hasattr(contained_by, 'objectIds'):
+        exists = id in contained_by.objectIds()
+    if exists:
         try:
-            if id in contained_by.contentIds():
+            existing_obj = getattr(contained_by, id, None)
+            if base_hasattr(existing_obj, 'portal_type'):
                 return _(u'There is already an item named ${name} in this folder.',
-                         mapping={u'name' : id})
+                     mapping={u'name' : id})
         except Unauthorized:
-            pass # ignore if we don't have permission
+            # If we cannot access the object it is safe to assume we cannot
+            # replace it
+            return _(u'There is already an item named ${name} in this folder.',
+                     mapping={u'name' : id})
 
     if hasattr(contained_by, 'checkIdAvailable'):
         try:

Modified: zope-cmfplone/branches/upstream/current/skins/plone_scripts/computeRoleMap.py
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_scripts/computeRoleMap.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_scripts/computeRoleMap.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -55,5 +55,3 @@
 result = [a[-1] for a in dec_users]
 return result
 
-
-

Modified: zope-cmfplone/branches/upstream/current/skins/plone_scripts/folder_rename.cpy
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_scripts/folder_rename.cpy	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_scripts/folder_rename.cpy	2007-02-09 13:51:10 UTC (rev 624)
@@ -12,6 +12,7 @@
 from Products.CMFPlone.utils import transaction_note
 from Products.CMFPlone import PloneMessageFactory as _
 from ZODB.POSException import ConflictError
+from Products.PythonScripts.standard import url_unquote
 
 portal = context.portal_url.getPortalObject()
 failed = {}
@@ -43,7 +44,8 @@
                 # care that the user is not redirected to the object
                 # with the original id but with the new id.
                 newObjPath = parent[new_id].absolute_url_path()
-                orig_template = orig_template.replace(origPath, newObjPath)
+                orig_template = orig_template.replace(url_unquote(origPath),
+                                                      newObjPath)
                 request.set('orig_template', orig_template)
                 message = "Renamed '%s' to '%s'" % (id, new_id)
         else:

Modified: zope-cmfplone/branches/upstream/current/skins/plone_scripts/getEventString.py
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_scripts/getEventString.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_scripts/getEventString.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -1,12 +1,10 @@
 ##parameters=event
 from Products.CMFCore.utils import getToolByName
+from Products.CMFPlone.utils import safe_unicode
 
-plone_utils = getToolByName(context, 'plone_utils')
-encoding = plone_utils.getSiteEncoding()
-
 start = event['start'] and ':'.join(event['start'].split(':')[:2]) or ''
 end = event['end'] and ':'.join(event['end'].split(':')[:2]) or ''
-title = unicode(event['title'], encoding) or 'event'
+title = safe_unicode(event['title']) or 'event'
 
 if start and end:
     eventstring = "%s-%s %s" % (start, end, title)

Modified: zope-cmfplone/branches/upstream/current/skins/plone_scripts/hasIndexHtml.py
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_scripts/hasIndexHtml.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_scripts/hasIndexHtml.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -7,17 +7,20 @@
 ##bind subpath=traverse_subpath
 ##parameters=
 from AccessControl import Unauthorized
+from Products.CMFPlone.utils import base_hasattr
 # It's silly but because this is often called on the parent folder, we must
 # ensure we have permission.
 try:
     if not context.isPrincipiaFolderish:
         return False
 except Unauthorized:
-        return False
+    return False
 
-if 'index_html' in context.objectIds():
+# Use the BTreeFolder API if possible
+if base_hasattr(context, 'has_key'):
+    # BTreeFolder's has_key returns numeric values
+    return context.has_key('index_html') and True or False
+elif 'index_html' in context.objectIds():
     return True
 else:
     return False
-    
-    

Modified: zope-cmfplone/branches/upstream/current/skins/plone_scripts/livesearch_reply.py
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_scripts/livesearch_reply.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_scripts/livesearch_reply.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -9,7 +9,9 @@
 
 from Products.CMFCore.utils import getToolByName
 from Products.CMFPlone import PloneMessageFactory as _
+from Products.CMFPlone.utils import safe_unicode
 from Products.PythonScripts.standard import url_quote
+from Products.PythonScripts.standard import url_quote_plus
 
 ploneUtils = getToolByName(context, 'plone_utils')
 pretty_title_or_id = ploneUtils.pretty_title_or_id
@@ -59,10 +61,14 @@
 r = quote_bad_chars(r)+'*'
 searchterms = url_quote(r.replace(' ','+'))
 
+site_encoding = context.plone_utils.getSiteEncoding()
+
 results = catalog(SearchableText=r, portal_type=friendly_types)
 
+searchterm_query = '?searchterm=%s'%url_quote_plus(q)
+
 RESPONSE = context.REQUEST.RESPONSE
-RESPONSE.setHeader('Content-Type', 'text/xml;charset=%s' % context.plone_utils.getSiteEncoding())
+RESPONSE.setHeader('Content-Type', 'text/xml;charset=%s' % site_encoding)
 
 # replace named entities with their numbered counterparts, in the xml the named ones are not correct
 #   &darr;      --> &#8595;
@@ -74,56 +80,64 @@
 
 ts = getToolByName(context, 'translation_service')
 
+output = []
+
+def write(s):
+    output.append(safe_unicode(s))
+
+
 if not results:
-    print '''<fieldset class="livesearchContainer">'''
-    print '''<legend id="livesearchLegend">%s</legend>''' % ts.translate(legend_livesearch)
-    print '''<div class="LSIEFix">'''
-    print '''<div id="LSNothingFound">%s</div>''' % ts.translate(label_no_results_found)
-    print '''<div class="LSRow">'''
-    print '<a href="search_form" style="font-weight:normal">%s</a>' % ts.translate(label_advanced_search)
-    print '''</div>'''
-    print '''</div>'''
-    print '''</fieldset>'''
+    write('''<fieldset class="livesearchContainer">''')
+    write('''<legend id="livesearchLegend">%s</legend>''' % ts.translate(legend_livesearch))
+    write('''<div class="LSIEFix">''')
+    write('''<div id="LSNothingFound">%s</div>''' % ts.translate(label_no_results_found))
+    write('''<div class="LSRow">''')
+    write('<a href="search_form" style="font-weight:normal">%s</a>' % ts.translate(label_advanced_search))
+    write('''</div>''')
+    write('''</div>''')
+    write('''</fieldset>''')
 
 else:
-    print '''<fieldset class="livesearchContainer">'''
-    print '''<legend id="livesearchLegend">%s</legend>''' % ts.translate(legend_livesearch)
-    print '''<div class="LSIEFix">'''
-    print '''<ul class="LSTable">'''
+    write('''<fieldset class="livesearchContainer">''')
+    write('''<legend id="livesearchLegend">%s</legend>''' % ts.translate(legend_livesearch))
+    write('''<div class="LSIEFix">''')
+    write('''<ul class="LSTable">''')
     for result in results[:limit]:
 
         itemUrl = result.getURL()
         if result.portal_type in useViewAction:
             itemUrl += '/view'
+        itemUrl = itemUrl + searchterm_query
 
-        print '''<li class="LSRow">''',
-        print '''<img src="%s"/>''' % result.getIcon,
-        full_title = pretty_title_or_id(result)
-        if len(full_title) >= MAX_TITLE:
+        write('''<li class="LSRow">''')
+        write('''<img src="%s"/>''' % result.getIcon)
+        full_title = safe_unicode(pretty_title_or_id(result))
+        if len(full_title) > MAX_TITLE:
             display_title = ''.join((full_title[:MAX_TITLE],'...'))
         else:
             display_title = full_title
-        print '''<a href="%s" title="%s">%s</a>''' % (itemUrl, full_title, display_title)
-        print '''<span class="discreet">[%s%%]</span>''' % result.data_record_normalized_score_
-        display_description = result.Description
-        if len(display_description) >= MAX_DESCRIPTION:
+        full_title = full_title.replace('"', '&quot;')
+        write('''<a href="%s" title="%s">%s</a>''' % (itemUrl, full_title, display_title))
+        write('''<span class="discreet">[%s%%]</span>''' % result.data_record_normalized_score_)
+        display_description = safe_unicode(result.Description)
+        if len(display_description) > MAX_DESCRIPTION:
             display_description = ''.join((display_description[:MAX_DESCRIPTION],'...'))
-        print '''<div class="discreet" style="margin-left: 2.5em;">%s</div>''' % (display_description)
-        print '''</li>'''
+        write('''<div class="discreet" style="margin-left: 2.5em;">%s</div>''' % (display_description))
+        write('''</li>''')
         full_title, display_title, display_description = None, None, None
 
-    print '''<li class="LSRow">'''
-    print '<a href="search_form" style="font-weight:normal">%s</a>' % ts.translate(label_advanced_search)
-    print '''</li>'''
+    write('''<li class="LSRow">''')
+    write( '<a href="search_form" style="font-weight:normal">%s</a>' % ts.translate(label_advanced_search))
+    write('''</li>''')
 
     if len(results)>limit:
         # add a more... row
-        print '''<li class="LSRow">'''
-        print '<a href="%s" style="font-weight:normal">%s</a>' % ('search?SearchableText=' + searchterms, ts.translate(label_show_all))
-        print '''</li>'''
-    print '''</ul>'''
-    print '''</div>'''
-    print '''</fieldset>'''
+        write('''<li class="LSRow">''')
+        write( '<a href="%s" style="font-weight:normal">%s</a>' % ('search?SearchableText=' + searchterms, ts.translate(label_show_all)))
+        write('''</li>''')
+    write('''</ul>''')
+    write('''</div>''')
+    write('''</fieldset>''')
 
-return printed
+return '\n'.join(output).encode(site_encoding)
 

Modified: zope-cmfplone/branches/upstream/current/skins/plone_scripts/selectedTabs.py
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_scripts/selectedTabs.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_scripts/selectedTabs.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -17,7 +17,7 @@
 request = context.REQUEST
 valid_actions = []
 
-url = request['ACTUAL_URL']
+url = request['URL']
 path = url[len(plone_url):]
 
 for action in portal_tabs:

Modified: zope-cmfplone/branches/upstream/current/skins/plone_styles/IEFixes.css.dtml
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_styles/IEFixes.css.dtml	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_styles/IEFixes.css.dtml	2007-02-09 13:51:10 UTC (rev 624)
@@ -173,4 +173,13 @@
     height: auto;
 }
 
+/* fix for the horizontal scroll due to the floated searchbox without width definition */
+
+#portal-searchbox {
+    overflow: auto; 
+}
+body.fullscreen #portal-searchbox {
+    overflow: visible;
+}
+
 /* </dtml-with> */

Modified: zope-cmfplone/branches/upstream/current/skins/plone_styles/authoring.css.dtml
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_styles/authoring.css.dtml	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_styles/authoring.css.dtml	2007-02-09 13:51:10 UTC (rev 624)
@@ -141,6 +141,11 @@
     vertical-align: middle;
 }
 
+.listing td a label,
+.stx table td a label {
+    cursor: pointer;
+}
+
 /* Vertical addition class */
 
 .vertical {

Modified: zope-cmfplone/branches/upstream/current/skins/plone_styles/base.css.dtml
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_styles/base.css.dtml	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_styles/base.css.dtml	2007-02-09 13:51:10 UTC (rev 624)
@@ -173,12 +173,38 @@
     vertical-align: middle;
     background: White url(&dtml-portal_url;/input_background.gif) repeat-x;
 }
+button {
+    font-family: <dtml-var fontFamily>;
+    visibility: visible;
+    border: &dtml-borderWidth; solid &dtml-globalBorderColor;;
+    color: &dtml-inputFontColor;;
+    vertical-align: middle;
+    background-color: &dtml-globalBackgroundColor;;
+    padding: 1px;
+    cursor: pointer;
+    font-size: &dtml-fontSmallSize;;
+    text-transform: &dtml-textTransform;;    
+}
 select {
     border: &dtml-borderWidth; solid &dtml-globalBorderColor;;
     color: &dtml-inputFontColor;;
     background-color: White;
     vertical-align: top;
 }
+optgroup {
+  font-style: normal;
+  font-weight: bold;
+  color: #999;
+  padding-left: 0.25em;
+}
+
+option {
+  color: black;
+}
+
+optgroup > option {
+  padding: 0 0.25em 0 1em;
+}
 abbr, acronym, .explain {
     border-bottom: &dtml-borderWidth; dotted &dtml-fontColor;;
     color: &dtml-fontColor;;

Modified: zope-cmfplone/branches/upstream/current/skins/plone_styles/base_properties.props
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_styles/base_properties.props	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_styles/base_properties.props	2007-02-09 13:51:10 UTC (rev 624)
@@ -1,8 +1,3 @@
-# Please note that this approach will gradually be phased out, probably in
-# Plone 3.0 or 3.5. Using DTML in CSS is something we want to stop doing.
-
-DEPRECATED:string=This approach is deprecated and will be phased out in Plone 3.0 or 3.5
-
 title:string=Plone's color, font, logo and border defaults
 
 plone_skin:string=Plone Default

Modified: zope-cmfplone/branches/upstream/current/skins/plone_styles/columns.css.dtml
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_styles/columns.css.dtml	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_styles/columns.css.dtml	2007-02-09 13:51:10 UTC (rev 624)
@@ -16,17 +16,23 @@
 #portal-column-one {
     vertical-align: top;
     width: <dtml-var columnOneWidth missing="16em">;
+    border-collapse: collapse;
+    padding: 0;
 }
 
 #portal-column-content {
     vertical-align: top;
     margin: 0;
     padding: 0;
+    border-collapse: collapse;
+    padding: 0;    
 }
 
 #portal-column-two {
     vertical-align: top;
     width: <dtml-var columnTwoWidth missing="16em">;
+    border-collapse: collapse;
+    padding: 0;    
 }
 
 /* fullscreen */

Modified: zope-cmfplone/branches/upstream/current/skins/plone_styles/portlets.css.dtml
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_styles/portlets.css.dtml	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_styles/portlets.css.dtml	2007-02-09 13:51:10 UTC (rev 624)
@@ -211,7 +211,7 @@
 .ploneCalendar {
     border: &dtml-borderWidth; &dtml-borderStyle; &dtml-globalBorderColor;;
     margin: 1px 0 1em 0;
-    border-collapse: separate;
+    border-collapse: collapse;
     border-spacing:0;
     width: 100%;
 }

Modified: zope-cmfplone/branches/upstream/current/skins/plone_styles/public.css.dtml
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_styles/public.css.dtml	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_styles/public.css.dtml	2007-02-09 13:51:10 UTC (rev 624)
@@ -1074,6 +1074,7 @@
     margin: 0.5em 2em 0 0.5em;
     padding: 0;
     position: relative;
+    z-index: 3;
 }
 
 /* Kupu image alignment classes */

Modified: zope-cmfplone/branches/upstream/current/skins/plone_tableless/main_template.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_tableless/main_template.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_tableless/main_template.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -8,6 +8,13 @@
       tal:attributes="lang language;
                       xml:lang language">
 
+  <tal:cache tal:define="lang language;
+                         charset site_properties/default_charset|string:utf-8">
+    <metal:cache use-macro="here/global_cache_settings/macros/cacheheaders">
+      Get the global cache headers located in global_cache_settings.
+    </metal:cache>
+  </tal:cache>
+
   <head metal:use-macro="here/header/macros/html_header">
 
     <metal:fillbase fill-slot="base">
@@ -16,20 +23,13 @@
       </metal:baseslot>
     </metal:fillbase>
 
-    <metal:headslot fill-slot="head_slot"
-                    tal:define="lang language;
-                                charset site_properties/default_charset|string:utf-8">
-
+    <metal:headslot fill-slot="head_slot">
       <tal:comment replace="nothing">min-width support for IE via Javascript, required for tableless</tal:comment>
       <tal:comment replace="structure string:&lt;!--[if IE]&gt;" />
       <script type="text/javascript"
               tal:attributes="src string:$portal_url/plone_minwidth.js"></script>
       <tal:comment replace="structure string:&lt;![endif]--&gt;" />
 
-      <metal:cache use-macro="here/global_cache_settings/macros/cacheheaders">
-        Get the global cache headers located in global_cache_settings.
-      </metal:cache>
-
       <metal:headslot define-slot="head_slot" />
       <tal:comment replace="nothing"> A slot where you can insert elements in the header from a template </tal:comment>
     </metal:headslot>

Modified: zope-cmfplone/branches/upstream/current/skins/plone_templates/folder_contents.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_templates/folder_contents.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_templates/folder_contents.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -34,7 +34,7 @@
             Document actions (print, sendto etc)
         </div>
         <h1>
-          <tal:block replace="structure python:getattr(here, here.getIcon(1))"/>
+          <tal:block replace="structure python:getattr(here, here.getIcon(1)).tag(alt=here.portal_type)"/>
           <span tal:content="python: view_title and here.utranslate(view_title) or putils.pretty_title_or_id(here)" tal:omit-tag="">Directory Id</span>
         </h1>
         <tal:full_view condition="full_view">
@@ -170,8 +170,10 @@
             </thead>
 
             <metal:block tal:condition="batch|not:standalone|nothing">
-            <tbody tal:define="arrowUp portal/arrowUp.gif;
-                               arrowDown portal/arrowDown.gif;
+            <tbody tal:define="arrowUp nocall:portal/arrowUp.gif;
+                               arrowUp python:arrowUp.tag(alt='Move Up');
+                               arrowDown nocall:portal/arrowDown.gif;
+                               arrowDown python:arrowDown.tag(alt='Move Down');
                                getRelativeContentURL nocall:utool/getRelativeContentURL
                                ">
                 <tal:items tal:repeat="item batch">
@@ -195,7 +197,7 @@
                                    isBrowserDefault     python:len(browserDefaultResult[1]) == 1 and item.id == here.browserDefault()[1][0];
                                    item_folderish       item/is_folderish|nothing"
                        tal:attributes="class python:test(oddrow, 'draggable even', 'draggable odd');
-                                       id item_id;" >
+                                       id string:folder-contents-item-${item_id};" >
 
                        <tal:comment replace="nothing">
                             * We have to check if the browserDefault stuff is really necessary

Modified: zope-cmfplone/branches/upstream/current/skins/plone_templates/header.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_templates/header.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_templates/header.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -62,7 +62,7 @@
     </metal:css>
 
     <!-- Internet Explorer CSS Fixes -->
-    <tal:iefixstart replace="structure string:&lt;!--[if lt IE 7]&gt;" />
+    <tal:iefixstart replace="structure string:&lt;!--[if IE]&gt;" />
         <style type="text/css" media="all" tal:condition="exists: portal/IEFixes.css"
                tal:content="string:@import url($portal_url/IEFixes.css);">
         </style>

Modified: zope-cmfplone/branches/upstream/current/skins/plone_templates/main_template.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_templates/main_template.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_templates/main_template.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -8,6 +8,13 @@
       tal:attributes="lang language;
                       xml:lang language">
 
+  <tal:cache tal:define="lang language;
+                         charset site_properties/default_charset|string:utf-8">
+    <metal:cache use-macro="here/global_cache_settings/macros/cacheheaders">
+      Get the global cache headers located in global_cache_settings.
+    </metal:cache>
+  </tal:cache>
+
   <head metal:use-macro="here/header/macros/html_header">
 
     <metal:fillbase fill-slot="base">
@@ -16,14 +23,7 @@
       </metal:baseslot>
     </metal:fillbase>
 
-    <metal:headslot fill-slot="head_slot"
-                    tal:define="lang language;
-                                charset site_properties/default_charset|string:utf-8">
-
-      <metal:cache use-macro="here/global_cache_settings/macros/cacheheaders">
-        Get the global cache headers located in global_cache_settings.
-      </metal:cache>
-
+    <metal:headslot fill-slot="head_slot">
       <metal:headslot define-slot="head_slot" />
       <tal:comment replace="nothing"> A slot where you can insert elements in the header from a template </tal:comment>
     </metal:headslot>
@@ -53,11 +53,11 @@
         <div id="portal-header">
           <p class="hiddenStructure">
             <a accesskey="2"
-               tal:attributes="href string:${request/ACTUAL_URL}#documentContent"
+               tal:attributes="href string:${current_page_url}#documentContent"
                i18n:translate="label_skiptocontent">Skip to content.</a> |
 
             <a accesskey="6"
-               tal:attributes="href string:${request/ACTUAL_URL}#portlet-navigation-tree"
+               tal:attributes="href string:${current_page_url}#portlet-navigation-tree"
                i18n:translate="label_skiptonavigation">Skip to navigation</a>
           </p>
 

Modified: zope-cmfplone/branches/upstream/current/skins/plone_templates/registered_notify_template.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_templates/registered_notify_template.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_templates/registered_notify_template.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -18,8 +18,8 @@
 
 Your login name and password are:
 
-Login name : <span i18n:name="username" tal:omit-tag="" tal:content="options/member/getUserName" />
-Password   : <span i18n:name="password" tal:omit-tag="" tal:content="request/password | options/password" />
+Login name: <span i18n:name="username" tal:omit-tag="" tal:content="options/member/getUserName" />
+Password: <span i18n:name="password" tal:omit-tag="" tal:content="request/password | options/password" />
 
 Log in here:
 

Modified: zope-cmfplone/branches/upstream/current/skins/plone_templates/rss_template.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_templates/rss_template.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_templates/rss_template.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -11,10 +11,11 @@
 
 <metal:block 
     define-macro="master" 
-    tal:define="
-                    syn context/portal_syndication; 
-                    max max_items|python:syn.getMaxItems(here);
-                    objects python: objectList[:max]"
+    tal:define="syn context/portal_syndication;
+                default_max syn/getMaxItems;
+                max max_items|python:syn.getMaxItems(here);
+                max python:same_type(max, 1) and max or default_max;
+                objects python: objectList[:max]"
     >
 
 <metal:block tal:define="dummy python:request.RESPONSE.setHeader('Content-Type', 'text/xml;;charset='+context.plone_utils.getSiteEncoding())" />

Modified: zope-cmfplone/branches/upstream/current/skins/plone_templates/site_feedback_template.pt
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_templates/site_feedback_template.pt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_templates/site_feedback_template.pt	2007-02-09 13:51:10 UTC (rev 624)
@@ -13,6 +13,6 @@
 
 </div>
 --
-<span tal:replace="utool/email_from_name" />
+<span tal:replace="portal/email_from_name" />
 
 </div>

Modified: zope-cmfplone/branches/upstream/current/skins/plone_templates/standard_error_message.py
===================================================================
--- zope-cmfplone/branches/upstream/current/skins/plone_templates/standard_error_message.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/skins/plone_templates/standard_error_message.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -12,6 +12,15 @@
 #  you could easily check for the error_type and
 #  dispatch to an appropriate PageTemplate.
 
+# Check if the object is traversable, if not it might be a view, get its parent
+# because we need to render the error on an actual content object
+from AccessControl import Unauthorized
+try:
+    while not hasattr(context.aq_explicit, 'restrictedTraverse'):
+        context = context.aq_parent
+except (Unauthorized, AttributeError):
+    context = context.portal_url.getPortalObject()
+
 error_type=kwargs.get('error_type', None)
 error_message=kwargs.get('error_message', None)
 error_log_url=kwargs.get('error_log_url', None)

Modified: zope-cmfplone/branches/upstream/current/tests/forms.txt
===================================================================
--- zope-cmfplone/branches/upstream/current/tests/forms.txt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/tests/forms.txt	2007-02-09 13:51:10 UTC (rev 624)
@@ -66,7 +66,7 @@
   ... """ % (edit_path, default_user, default_password),
   ...        handle_errors=False)
   HTTP/1.1 200 OK...
-  <h1> Edit ...Page... </h1>...
+  <h1 class="documentFirstHeading"> Edit ...Page... </h1>...
   <div class="field error ArchetypesStringWidget"...
   <div>Title is required, please correct.</div>
   <input...type="text"...name="title"...value="My Title".../>...

Modified: zope-cmfplone/branches/upstream/current/tests/rendering.txt
===================================================================
--- zope-cmfplone/branches/upstream/current/tests/rendering.txt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/tests/rendering.txt	2007-02-09 13:51:10 UTC (rev 624)
@@ -47,6 +47,6 @@
   ... """ % (edit_path, default_user, default_password),
   ...        handle_errors=False)
   HTTP/1.1 200 OK...
-  <h1> Edit ...Page... </h1>...
+  <h1 class="documentFirstHeading"> Edit ...Page... </h1>...
   <input...type="text"...name="title"...value="".../>...
   <input...type="submit"...name="form_submit"...value="Save".../>...

Modified: zope-cmfplone/branches/upstream/current/tests/testCalendarView.py
===================================================================
--- zope-cmfplone/branches/upstream/current/tests/testCalendarView.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/tests/testCalendarView.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -7,9 +7,9 @@
 
 from Products.CMFPlone.tests import PloneTestCase
 
-from Products.CMFPlone.tests.PloneTestCase import FunctionalTestCase
 from Products.CMFPlone.tests.PloneTestCase import default_user
 from Products.CMFPlone.tests.PloneTestCase import default_password
+from Products.PloneTestCase import setup
 
 try:
     from zope.app.testing.ztapi import provideUtility
@@ -144,32 +144,32 @@
         self.failUnless('event2' in response.getBody())
         self.failUnless('event3' in response.getBody())
 
-    def testLocalizedCalendarWithEvents(self):
-        self.populateSite()
+    # BBB: Conditional check can be removed in Plone 3.0
+    if setup.USELAYER:
 
-        # set up some messages to test the calendar date/time formatting
-        messages = {
-            ('ja', 'date_format_long'): u'${Y}\u5e74${m}\u6708${d}\u65e5 ${H}\u6642${M}\u5206',
-            ('ja', 'date_format_short'): u'${Y}\u5e74${m}\u6708${d}\u65e5'}
-        dates = SimpleTranslationDomain('plone', messages)
-        provideUtility(ITranslationDomain, dates, 'plone')
+        def testLocalizedCalendarWithEvents(self):
+            self.populateSite()
 
-        response = self.publish(self.portal_path, self.basic_auth,
-                                env={'HTTP_ACCEPT_LANGUAGE': 'ja'})
-        self.assertEquals(response.getStatus(), 200)
-        self.failUnless('id="thePloneCalendar"' in response.getBody())
-        self.failUnless('event1' in response.getBody())
-        self.failUnless('event2' in response.getBody())
-        self.failUnless('event3' in response.getBody())
-        # construct our date
-        event1_date = self.portal.event1.start_date.strftime('%Y[s%m[s%d[s')
-        event1_date = event1_date.replace('[s','%s')%(u'\u5e74', u'\u6708',
-                                                      u'\u65e5')
-        self.failUnless(event1_date.encode('utf-8')
-                        in response.getBody())
+            # set up some messages to test the calendar date/time formatting
+            messages = {
+                ('ja', 'date_format_long'): u'${Y}\u5e74${m}\u6708${d}\u65e5 ${H}\u6642${M}\u5206',
+                ('ja', 'date_format_short'): u'${Y}\u5e74${m}\u6708${d}\u65e5'}
+            dates = SimpleTranslationDomain('plone', messages)
+            provideUtility(ITranslationDomain, dates, 'plone')
 
-        # Clean up after ourselves
-        unprovideUtility(ITranslationDomain, name='plone')
+            response = self.publish(self.portal_path, self.basic_auth,
+                                    env={'HTTP_ACCEPT_LANGUAGE': 'ja'})
+            self.assertEquals(response.getStatus(), 200)
+            self.failUnless('id="thePloneCalendar"' in response.getBody())
+            self.failUnless('event1' in response.getBody())
+            self.failUnless('event2' in response.getBody())
+            self.failUnless('event3' in response.getBody())
+            # construct our date
+            event1_date = self.portal.event1.start_date.strftime('%Y[s%m[s%d[s')
+            event1_date = event1_date.replace('[s','%s')%(u'\u5e74', u'\u6708',
+                                                          u'\u65e5')
+            self.failUnless(event1_date.encode('utf-8')
+                            in response.getBody())
 
 
 def test_suite():

Modified: zope-cmfplone/branches/upstream/current/tests/testCookieAuth.py
===================================================================
--- zope-cmfplone/branches/upstream/current/tests/testCookieAuth.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/tests/testCookieAuth.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -10,6 +10,8 @@
 
 import base64
 from urlparse import urlparse
+from urllib import quote
+from urllib import urlencode
 
 default_user = PloneTestCase.default_user
 default_password = PloneTestCase.default_password
@@ -26,35 +28,35 @@
         self.folder.manage_permission('View', ['Manager'], acquire=0)
 
     def testAutoLoginPage(self):
-        # Should send us to the login_form
+        # Should send us to login_form
         response = self.publish(self.folder_path)
         self.assertEqual(response.getStatus(), 302)
 
         location = response.getHeader('Location')
         self.failUnless(location.startswith(self.portal_url))
-        self.failUnless(urlparse(location)[2].endswith('/login_form'))
+        self.failUnless(urlparse(location)[2].endswith('/require_login'))
 
     def testInsufficientPrivileges(self):
-        # Should send us to insufficient_privileges
+        # Should send us to login_form
         response = self.publish(self.folder_path, extra={'__ac': self.cookie})
         self.assertEqual(response.getStatus(), 302)
 
         location = response.getHeader('Location')
         self.failUnless(location.startswith(self.portal_url))
-        urlpath=urlparse(location)[2]
-        self.failUnless(urlpath.endswith('/insufficient_privileges') or
-            urlpath.endswith('/login_form'))
+        self.failUnless(urlparse(location)[2].endswith('/require_login'))
 
     def testSetSessionCookie(self):
         # The __ac cookie should be set for the session only
         form = {'__ac_name': default_user, '__ac_password': default_password}
 
-        response = self.publish(self.portal_path + '/logged_in', extra=form)
+        response = self.publish(self.portal_path + '/logged_in',
+                                env={'QUERY_STRING': urlencode(form)})
+
         self.assertEqual(response.getStatus(), 200)
 
         cookie = response.getCookie('__ac')
         self.assertEqual(cookie.get('path'), '/')
-        self.assertEqual(cookie.get('value'), self.cookie)
+        self.assertEqual(cookie.get('value'), quote(self.cookie))
         self.assertEqual(cookie.get('expires'), None)
 
     def testSetPersistentCookie(self):
@@ -62,12 +64,14 @@
         self.portal.portal_properties.site_properties.auth_cookie_length = 7
         form = {'__ac_name': default_user, '__ac_password': default_password}
 
-        response = self.publish(self.portal_path + '/logged_in', extra=form)
+        response = self.publish(self.portal_path + '/logged_in',
+                                env={'QUERY_STRING': urlencode(form)})
+
         self.assertEqual(response.getStatus(), 200)
 
         cookie = response.getCookie('__ac')
         self.assertEqual(cookie.get('path'), '/')
-        self.assertEqual(cookie.get('value'), self.cookie)
+        self.assertEqual(cookie.get('value'), quote(self.cookie))
         self.failIfEqual(cookie.get('expires'), None)
 
 

Modified: zope-cmfplone/branches/upstream/current/tests/testMigrations.py
===================================================================
--- zope-cmfplone/branches/upstream/current/tests/testMigrations.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/tests/testMigrations.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -150,6 +150,8 @@
 from Products.CMFPlone.migrations.v2_5.final_two51 import fixupPloneLexicon
 from Products.CMFPlone.migrations.v2_5.final_two51 import fixObjDeleteAction
 
+from Products.CMFPlone.migrations.v2_5.two51_two52 import setLoginFormInCookieAuth
+
 from Products.CMFDynamicViewFTI.migrate import migrateFTI
 
 import types
@@ -4101,11 +4103,33 @@
             self.failUnless(a in actions)
         self.failUnlessEqual(len(editActions), len(actions))
 
-    def testtFixHomeActionNoTool(self):
+    def testFixObjDeleteActionNoTool(self):
         self.portal._delObject('portal_actions')
         fixObjDeleteAction(self.portal, [])
 
+    def testSetLoginFormInCookieAuth(self):
+        setLoginFormInCookieAuth(self.portal, [])
+        cookie_auth = self.portal.acl_users.credentials_cookie_auth
+        self.failUnlessEqual(cookie_auth.getProperty('login_path'),
+                             'require_login')
 
+    def testSetLoginFormNoCookieAuth(self):
+        # Shouldn't error
+        uf = self.portal.acl_users
+        uf._delOb('credentials_cookie_auth')
+        setLoginFormInCookieAuth(self.portal, [])
+
+    def testSetLoginFormAlreadyChanged(self):
+        # Shouldn't change the value if it's not the default
+        cookie_auth = self.portal.acl_users.credentials_cookie_auth
+        cookie_auth.manage_changeProperties(login_path='foo')
+        out = []
+        setLoginFormInCookieAuth(self.portal, out)
+        self.failIf(len(out) > 0)
+        self.failIfEqual(cookie_auth.getProperty('login_path'),
+                         'require_login')
+
+
 def test_suite():
     from unittest import TestSuite, makeSuite
     suite = TestSuite()

Modified: zope-cmfplone/branches/upstream/current/tests/testPortalCreation.py
===================================================================
--- zope-cmfplone/branches/upstream/current/tests/testPortalCreation.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/tests/testPortalCreation.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -702,7 +702,11 @@
         snapshot_id = self.setup._mangleTimestampName('test')
         self.setup.createSnapshot(snapshot_id)
 
+    def testValidateEmail(self):
+        # validate_email should be on by default
+        self.failUnless(self.portal.getProperty('validate_email'))
 
+
 class TestPortalBugs(PloneTestCase.PloneTestCase):
 
     def afterSetUp(self):

Modified: zope-cmfplone/branches/upstream/current/tests/testRegistrationTool.py
===================================================================
--- zope-cmfplone/branches/upstream/current/tests/testRegistrationTool.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/tests/testRegistrationTool.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -18,6 +18,9 @@
 
     def afterSetUp(self):
         self.registration = self.portal.portal_registration
+        self.portal.acl_users.userFolderAddUser("userid", "password",
+                (), (), ())
+        self.portal.acl_users._doAddGroup("groupid", ())
 
     def testJoinCreatesUser(self):
         self.registration.addMember(member_id, 'secret',
@@ -80,8 +83,18 @@
     def testInvalidCMFDefaultEmailFailsValidation(self):
         # http://dev.plone.org/plone/ticket/3910
         self.failIf(self.registration.isValidEmail('bogus at 127.0.0.1'))
-    
 
+    def testNewIdAllowed(self):
+        self.assertEqual(self.registration.isMemberIdAllowed('newuser'), 1)
+
+
+    def testTakenUserId(self):
+        self.assertEqual(self.registration.isMemberIdAllowed('userid'), 0)
+
+
+    def testTakenGroupd(self):
+        self.assertEqual(self.registration.isMemberIdAllowed('groupid'), 0)
+
 class TestPasswordGeneration(PloneTestCase.PloneTestCase):
 
     def afterSetUp(self):

Modified: zope-cmfplone/branches/upstream/current/tests/testTranslationServiceTool.py
===================================================================
--- zope-cmfplone/branches/upstream/current/tests/testTranslationServiceTool.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/tests/testTranslationServiceTool.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -50,9 +50,9 @@
         value = self.tool.utranslate('domain', u'\xc3'.encode('utf-8'))
         self.assertEquals(value, u'\xc3')
 
-        # Test iso8859-1 value
+        # Test iso8859-1 value, should be replaced
         value = self.tool.utranslate('domain', u'\xc3'.encode('iso8859-1'))
-        self.assertEquals(value, '\xc3')
+        self.assertEquals(value, u'\ufffd')
 
         # Test empty string
         value = self.tool.utranslate('domain', '')

Modified: zope-cmfplone/branches/upstream/current/tests/test_doctests.py
===================================================================
--- zope-cmfplone/branches/upstream/current/tests/test_doctests.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/tests/test_doctests.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -10,8 +10,6 @@
 from unittest import TestSuite
 from Testing.ZopeTestCase import ZopeDocTestSuite
 from Products.CMFPlone.tests import PloneTestCase
-from Products.PloneTestCase.layer import ZCMLLayer
-from Products.PloneTestCase import setup
 
 
 def test_suite():
@@ -27,9 +25,14 @@
         ZopeDocTestSuite('Products.CMFPlone.utils'),
         )
 
+    # BBB: Fix for http://zope.org/Collectors/Zope/2178
+    from Products.PloneTestCase import layer
+    from Products.PloneTestCase import setup
+
     if setup.USELAYER:
         for s in suites:
-            s.layer = ZCMLLayer
+            if not hasattr(s, 'layer'):
+                s.layer = layer.PloneSite
 
     return TestSuite(suites)
 

Modified: zope-cmfplone/branches/upstream/current/tests/test_functional.py
===================================================================
--- zope-cmfplone/branches/upstream/current/tests/test_functional.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/tests/test_functional.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -17,8 +17,6 @@
 from Globals import package_home
 from Testing.ZopeTestCase import FunctionalDocFileSuite as Suite
 from Products.CMFPlone.tests import PloneTestCase, GLOBALS
-from Products.PloneTestCase.layer import ZCMLLayer
-import Products.PloneTestCase.setup as setup
 
 REQUIRE_TESTBROWSER = ['AddMoveAndDeleteDocument.txt',
                        'LoginAndLogout.txt']
@@ -54,9 +52,14 @@
                test_class=PloneTestCase.FunctionalTestCase)
               for filename in filenames]
 
+    # BBB: Fix for http://zope.org/Collectors/Zope/2178
+    from Products.PloneTestCase import layer
+    from Products.PloneTestCase import setup
+
     if setup.USELAYER:
         for s in suites:
-            s.layer=ZCMLLayer
+            if not hasattr(s, 'layer'):
+                s.layer = layer.PloneSite
 
     return unittest.TestSuite(suites)
 

Modified: zope-cmfplone/branches/upstream/current/tests/zcheck.py
===================================================================
--- zope-cmfplone/branches/upstream/current/tests/zcheck.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/tests/zcheck.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -22,6 +22,14 @@
 
 from Products.CMFPlone.tests import PloneTestCase
 
+from Products.PloneTestCase import setup
+from Products.PloneTestCase import layer
+
+if setup.USELAYER:
+    # Set up the Plone site "layer"
+    layer.ZCML.setUp()
+    layer.PloneSite.setUp()
+
 ignoredObjectIds = ['rssBody', 'RSS', 'rss_template', 'search_rss',
                     'test_ecmascripts',
                     # There is no DTD for the pdf topic stuff

Modified: zope-cmfplone/branches/upstream/current/utils.py
===================================================================
--- zope-cmfplone/branches/upstream/current/utils.py	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/utils.py	2007-02-09 13:51:10 UTC (rev 624)
@@ -20,9 +20,11 @@
 from Products.CMFCore.utils import getToolByName
 from Products.CMFPlone.UnicodeNormalizer import normalizeUnicode
 from Products.CMFPlone.interfaces.Translatable import ITranslatable
-from Products.CMFPlone import PloneMessageFactory as _
 import transaction
 
+from Products.PageTemplates.GlobalTranslationService import \
+     getGlobalTranslationService
+
 # Canonical way to get at CMFPlone directory
 PACKAGE_HOME = Globals.package_home(globals())
 WWW_DIR = join(PACKAGE_HOME, 'www')
@@ -32,12 +34,6 @@
 from log import log_exc
 from log import log_deprecated
 
-# Keep these here to not fully change the old API
-# please use i18nl10n directly
-from i18nl10n import utranslate
-from i18nl10n import ulocalized_time
-from i18nl10n import getGlobalTranslationService
-
 # Define and compile static regexes
 IGNORE_REGEX = re.compile(r"[']")
 FILENAME_REGEX = re.compile(r"^(.+)\.(\w{,4})$")
@@ -49,6 +45,10 @@
 PIL_SCALING_ALGO = Image.ANTIALIAS
 PIL_QUALITY = 88
 MEMBER_IMAGE_SCALE = (75, 100)
+IMAGE_SCALE_PARAMS = {'scale': MEMBER_IMAGE_SCALE,
+                      'quality': PIL_QUALITY,
+                      'algorithm': PIL_SCALING_ALGO,
+                      'default_format': 'PNG'}
 
 _marker = []
 
@@ -200,9 +200,10 @@
 def getEmptyTitle(context, translated=True):
     """Returns string to be used for objects with no title or id"""
     # The default is an extra fancy unicode elipsis
-    empty = unicode('\x5b\xc2\xb7\xc2\xb7\xc2\xb7\x5d', 'utf-8', 'ignore')
+    empty = unicode('\x5b\xc2\xb7\xc2\xb7\xc2\xb7\x5d', 'utf-8')
     if translated:
-        empty = _(u'title_unset', default=empty)
+        service = getGlobalTranslationService()
+        empty = service.translate('plone', 'title_unset', context=context, default=empty)
     return empty
 
 def typesToList(context):
@@ -444,6 +445,39 @@
     else:
         return callable(obj)
 
+
+def safe_unicode(value, encoding='utf-8'):
+    """Converts a value to unicode, even it is already a unicode string.
+
+        >>> from Products.CMFPlone.utils import safe_unicode
+
+        >>> safe_unicode('spam')
+        u'spam'
+        >>> safe_unicode(u'spam')
+        u'spam'
+        >>> safe_unicode(u'spam'.encode('utf-8'))
+        u'spam'
+        >>> safe_unicode('\xc6\xb5')
+        u'\u01b5'
+        >>> safe_unicode(u'\xc6\xb5'.encode('iso-8859-1'))
+        u'\u01b5'
+        >>> safe_unicode('\xc6\xb5', encoding='ascii')
+        u'\u01b5'
+        >>> safe_unicode(1)
+        1
+        >>> print safe_unicode(None)
+        None
+    """
+    if isinstance(value, unicode):
+        return value
+    elif isinstance(value, basestring):
+        try:
+            value = unicode(value, encoding)
+        except (UnicodeDecodeError):
+            value = value.decode('utf-8', 'replace')
+    return value
+
+
 def tuplize(value):
     if isinstance(value, tuple):
         return value
@@ -597,8 +631,7 @@
         setattr(klass, '__security__', security)
     return security
 
-def scale_image(image_file, max_size=MEMBER_IMAGE_SCALE,
-                default_format = 'PNG'):
+def scale_image(image_file, max_size=None, default_format=None):
     """Scales an image down to at most max_size preserving aspect ratio
     from an input file
 
@@ -685,6 +718,10 @@
         (50, 50)
 
     """
+    if max_size is None:
+        max_size = IMAGE_SCALE_PARAMS['scale']
+    if default_format is None:
+        default_format = IMAGE_SCALE_PARAMS['default_format']
     # Make sure we have ints
     size = (int(max_size[0]), int(max_size[1]))
     # Load up the image, don't try to catch errors, we want to fail miserably
@@ -708,13 +745,21 @@
         image = image.convert('RGBA')
     # Rescale in place with an method that will not alter the aspect ratio
     # and will only shrink the image not enlarge it.
-    image.thumbnail(size, resample=PIL_SCALING_ALGO)
+    image.thumbnail(size, resample=IMAGE_SCALE_PARAMS['algorithm'])
     # preserve palletted mode for GIF and PNG
     if original_mode == 'P' and format in ('GIF', 'PNG'):
         image = image.convert('P')
     # Save
     new_file = StringIO()
-    image.save(new_file, format, quality=PIL_QUALITY)
+    image.save(new_file, format, quality=IMAGE_SCALE_PARAMS['quality'])
     new_file.seek(0)
     # Return the file data and the new mimetype
     return new_file, mimetype
+
+
+# Keep these here to not fully change the old API
+# Put these at the end to avoid an ImportError for safe_unicode
+from i18nl10n import utranslate
+from i18nl10n import ulocalized_time
+from i18nl10n import getGlobalTranslationService
+

Modified: zope-cmfplone/branches/upstream/current/version.txt
===================================================================
--- zope-cmfplone/branches/upstream/current/version.txt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/version.txt	2007-02-09 13:51:10 UTC (rev 624)
@@ -1 +1 @@
-2.5.1
+2.5.2

Modified: zope-cmfplone/branches/upstream/current/www/addSite.zpt
===================================================================
--- zope-cmfplone/branches/upstream/current/www/addSite.zpt	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/www/addSite.zpt	2007-02-09 13:51:10 UTC (rev 624)
@@ -39,7 +39,27 @@
     <textarea name="description" cols="60" rows="10"
      style="width: 95%"></textarea>
 
+    <tal:baseprofile condition="python: len(options['base_profiles']) > 1">
+      <div class="form-label">
+        Base Profile
+      </div>
+      <div class="form-help">
+        You normally don't need to change anything here unless you have 
+        specific reasons and know what you are doing.
+      </div>
 
+      <tal:profiles tal:repeat="info options/base_profiles">
+        <input type="radio"
+               name="profile_id:string"
+               value="profile"
+               tal:attributes="value info/id;
+                               checked python: options['default_profile']==info['id'] and 'checked' or nothing"
+               />
+        <span tal:replace="info/title">profile title</span>
+        <br />
+      </tal:profiles>
+    </tal:baseprofile>
+
     <tal:extensionprofiles condition="options/extension_profiles">
       <div class="form-label">
         Extension Profiles

Deleted: zope-cmfplone/branches/upstream/current/www/main.dtml
===================================================================
--- zope-cmfplone/branches/upstream/current/www/main.dtml	2007-02-09 13:49:11 UTC (rev 623)
+++ zope-cmfplone/branches/upstream/current/www/main.dtml	2007-02-09 13:51:10 UTC (rev 624)
@@ -1,331 +0,0 @@
-<dtml-var manage_page_header>
-<dtml-var manage_tabs>
-
-<script type="text/javascript">
-<!-- 
-
-isSelected = false;
-
-function toggleSelect() {
-  if (isSelected == false) {
-    for (i = 0; i < document.objectItems.length; i++)
-      document.objectItems.elements[i].checked = true ;
-      isSelected = true;
-      document.objectItems.selectButton.value = "Deselect All";
-      return isSelected;
-  }
-  else {
-    for (i = 0; i < document.objectItems.length; i++)
-      document.objectItems.elements[i].checked = false ;
-      isSelected = false;
-      document.objectItems.selectButton.value = "Select All";
-      return isSelected;       
-  }
-}
-
-//-->
-</script>
-
-<!-- Add object widget -->
-<br />
-<dtml-if filtered_meta_types>
-  <table width="100%" cellspacing="0" cellpadding="0" border="0">
-  <tr>
-  <td align="left" valign="top">&nbsp;</td>
-  <td align="right" valign="top">
-  <div class="form-element">
-  <form action="&dtml-URL1;/" method="get">
-  <dtml-if "_.len(filtered_meta_types) > 1">
-    <select class="form-element" name=":action" 
-     onChange="location.href='&dtml-URL1;/'+this.options[this.selectedIndex].value">
-    <option value="manage_workspace" disabled>Select type to add...</option>
-    <dtml-in filtered_meta_types mapping sort=name>
-    <option value="&dtml.url_quote-action;">&dtml-name;</option>
-    </dtml-in>
-    </select>
-    <input class="form-element" type="submit" name="submit" value=" Add " />
-  <dtml-else>
-    <dtml-in filtered_meta_types mapping sort=name>
-    <input type="hidden" name=":method" value="&dtml.html_quote-action;" />
-    <input class="form-element" type="submit" name="submit" value="Add &dtml-name;" />
-    </dtml-in>
-  </dtml-if>
-  </form>
-  </div>
-  </td>
-  </tr>
-  </table>
-</dtml-if>
-
-<form action="&dtml-URL1;/" name="objectItems" method="post">
-<dtml-if objectItems>
-  <dtml-let hasOrderSupport="_.getattr(this().aq_explicit, 'has_order_support', 0)">
-  <dtml-unless skey>
-    <dtml-if hasOrderSupport>
-      <dtml-call expr="REQUEST.set('skey', getDefaultSorting()[0])">
-      <dtml-call expr="REQUEST.set('rkey', getDefaultSorting()[1])">
-    <dtml-else>
-      <dtml-call expr="REQUEST.set('skey', 'id')">
-    </dtml-if>
-  </dtml-unless>
-  <dtml-unless rkey><dtml-call expr="REQUEST.set('rkey', '')"></dtml-unless>
-
-<table width="100%" cellspacing="0" cellpadding="2" border="0">
-<tr class="list-header">
-  <td width="5%" align="right" colspan="2"><div 
-   class="list-item"><a href="./manage_main?skey=meta_type<dtml-if 
-   "skey == 'meta_type' and not rkey">&amp;rkey=meta_type</dtml-if>"
-   onMouseOver="window.status='Sort objects by type'; return true"
-   onMouseOut="window.status=''; return true"><dtml-if 
-   "skey == 'meta_type' or rkey == 'meta_type'"
-   ><strong>Type</strong><dtml-else>Type</dtml-if></a></div>
-  </td>
-  <td width="50%" align="left"><div class="list-item"><a 
-   href="./manage_main?skey=id<dtml-if 
-   "skey == 'id' and not rkey">&amp;rkey=id</dtml-if>"
-   onMouseOver="window.status='Sort objects by name'; return true"
-   onMouseOut="window.status=''; return true"><dtml-if 
-   "skey == 'id' or rkey == 'id'"
-   ><strong>Name</strong><dtml-else>Name</dtml-if></a></div>
-  </td>
-  <td width="15%" align="left"><div class="list-item"><a 
-   href="./manage_main?skey=get_size<dtml-if 
-   "skey == 'get_size' and not rkey">&amp;rkey=get_size</dtml-if>"
-   onMouseOver="window.status='Sort objects by size'; return true"
-   onMouseOut="window.status=''; return true"><dtml-if 
-   "skey == 'get_size' or rkey == 'get_size'"
-   ><strong>Size</strong><dtml-else>Size</dtml-if></a></div>
-  </td>
-  <td width="19%" align="left"><div class="list-item"><a 
-   href="./manage_main?skey=bobobase_modification_time<dtml-if 
-   "skey == 'bobobase_modification_time' and not rkey"
-   >&amp;rkey=bobobase_modification_time</dtml-if>"
-   onMouseOver="window.status='Sort objects by modification time'; return true"
-   onMouseOut="window.status=''; return true"><dtml-if 
-   "skey == 'bobobase_modification_time' or rkey == 'bobobase_modification_time'"
-   ><strong>Last Modified</strong><dtml-else>Last Modified</dtml-if></a></div>
-  </td>
-  <dtml-if hasOrderSupport>
-  <td width="10%" align="left"><div class="list-item"><a 
-   href="./manage_main?skey=position"
-   onMouseOver="window.status='Sort objects by position'; return true"
-   onMouseOut="window.status=''; return true"><dtml-if 
-   "skey == 'position'"
-   ><strong>Position</strong><dtml-else>Position</dtml-if></a></div>
-  </td>
-  </dtml-if>
-</tr>
-
-<dtml-in objectItems sort_expr="skey+'/cmp/asc'" 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="16">
-  <input type="checkbox" name="ids:list" value="&dtml-sequence-key;" />
-  </td>
-  <td align="left" valign="top" nowrap="1">
-
-  <dtml-if om_icons>
-  <a href="&dtml.url_quote-sequence-key;/manage_workspace">
-  <dtml-in om_icons mapping>
-  <img src="&dtml-BASEPATH1;/&dtml.url_quote-path;" alt="&dtml.missing-alt;" 
-   title="&dtml.missing-title;" border="0" /></dtml-in></a>
-  <dtml-else>
-
-  <dtml-if icon>
-  <a href="&dtml.url_quote-sequence-key;/manage_workspace">
-  <img src="&dtml-BASEPATH1;/&dtml-icon;" alt="&dtml-meta_type;" 
-   title="&dtml-meta_type;" border="0" /></a>
-  <dtml-else>
-  &nbsp;
-  </dtml-if>
-
-  </dtml-if>
-
-
-  </td>
-
-  <td align="left" valign="top">
-  <div class="list-item">
-  <a href="&dtml.url_quote-sequence-key;/manage_workspace">
-  &dtml-sequence-key; <dtml-if title>(&dtml-title;)</dtml-if>
-  </a>
-  <dtml-if locked_in_version>
-    <dtml-if modified_in_version>
-      <img src="&dtml-BASEPATH1;/p_/locked"
-       alt="This item has been modified in this version" />
-    <dtml-else>
-      <img src="&dtml-BASEPATH1;/p_/lockedo"
-       alt="This item has been modified in another version" />
-       (<em>&dtml-locked_in_version;</em>)
-    </dtml-if>
-  </dtml-if>
-  <dtml-try>
-    <dtml-if "wl_isLocked()==1">
-      <img src="/p_/davlocked">
-    </dtml-if>
-  <dtml-except>
-  </dtml-try>
-  </div>
-  </td>
-
-  <dtml-with sequence-key>
-  <td>
-  <div class="list-item">
-  <dtml-try>
-  <dtml-if get_size>
-  <dtml-let ob_size=get_size>
-  <dtml-if "ob_size < 1024">
-  1 Kb
-  <dtml-elif "ob_size > 1048576">
-  <dtml-var "ob_size / 1048576.0" fmt="%0.02f"> Mb
-  <dtml-else>
-  <dtml-var "_.int(ob_size / 1024)"> Kb
-  </dtml-if>
-  </dtml-let>
-  <dtml-else>
-  &nbsp;
-  </dtml-if>
-  <dtml-except>
-  &nbsp;
-  </dtml-try>
-  </div>
-  </td>
-
-  <td>
-  <div class="list-item">
-  <dtml-var bobobase_modification_time fmt="%Y-%m-%d %H:%M">
-  </div>
-  </td>
-  </dtml-with>
-
-  <dtml-if hasOrderSupport>
-  <td>
-  <div class="list-item">
-  <dtml-if "skey == 'position'">
-  <dtml-var sequence-number>
-  <dtml-else>
-  ...
-  </dtml-if>
-  </div>
-  </td>
-  </dtml-if>
-</tr>
-</dtml-in>
-</table>
-
-<table cellspacing="0" cellpadding="2" border="0">
-<tr>
-  <td align="left" valign="top" width="16"></td>
-  <td align="left" valign="top">
-  <div class="form-element">
-  <dtml-unless dontAllowCopyAndPaste>
-  <input class="form-element" type="submit" name="manage_renameForm:method" 
-   value="Rename" />
-  <dtml-if "_.SecurityCheckPermission('Delete objects',this())">
-  <input class="form-element" type="submit" name="manage_cutObjects:method"
-   value="Cut" />
-  </dtml-if>
-  <input class="form-element" type="submit" name="manage_copyObjects:method"
-   value="Copy" />
-  <dtml-if cb_dataValid>
-  <input class="form-element" type="submit" name="manage_pasteObjects:method"
-   value="Paste" />
-  </dtml-if>
-  </dtml-unless>
-  <dtml-if "_.SecurityCheckPermission('Delete objects',this())">
-  <input class="form-element" type="submit" name="manage_delObjects:method"
-   value="Delete" />
-  </dtml-if>
-  <dtml-if "_.SecurityCheckPermission('Import/Export objects', this())">
-  <input class="form-element" type="submit" 
-   name="manage_importExportForm:method" 
-   value="Import/Export" />
-  </dtml-if>
-<script type="text/javascript">
-<!-- 
-if (document.forms[0]) {
-  document.write('<input class="form-element" type="submit" name="selectButton" value="Select All" onClick="toggleSelect(); return false">')
-  }
-//-->
-</script>
-  </div>
-  </td>
-</tr>
-<dtml-if "hasOrderSupport and
-          _.SecurityCheckPermission( 'Manage properties', this() )">
-<tr>
-  <td align="left" valign="top" width="16"></td>
-  <td align="left" valign="top">
-  <div class="form-element">
-  <dtml-if expr="skey == 'position' and _.len(objectItems) > 1">
-  <input class="form-element" type="submit"
-         name="manage_move_objects_up:method" value="Up" />
-  /
-  <input class="form-element" type="submit"
-         name="manage_move_objects_down:method" value="Down" />
-  by
-  <select name="delta:int">
-  <dtml-in "_.range(1,_.min(5,_.len(objectIds())))">
-  <option>&dtml-sequence-item;</option>
-  </dtml-in>
-  <dtml-in "_.range(5,_.len(objectIds()),5)">
-  <option>&dtml-sequence-item;</option>
-  </dtml-in>
-  </select>
-  <input class="form-element" type="submit"
-         name="manage_move_objects_to_top:method" value="Top" />
-  <input class="form-element" type="submit"
-         name="manage_move_objects_to_bottom:method" value="Bottom" />
-  </dtml-if>
-  <dtml-unless expr="(skey, rkey and 1 or 0) == getDefaultSorting()">
-  <input type="hidden" name="key" value="&dtml-skey;">
-  <input type="hidden" name="reverse" value="&dtml-rkey;">
-  <input class="form-element" type="submit"
-         name="manage_set_default_sorting:method"
-         value="Set View as Default" />
-  </dtml-unless>
-  </div>
-  </td>
-</tr>
-</dtml-if>
-</table>
-
-  </dtml-let>
-<dtml-else>
-<table cellspacing="0" cellpadding="2" border="0">
-<tr>
-<td>
-<div class="std-text">
-There are currently no items in <em>&dtml-title_or_id;</em>
-<br /><br />
-</div>
-<dtml-unless dontAllowCopyAndPaste>
-<dtml-if cb_dataValid>
-<div class="form-element">
-<input class="form-element" type="submit" name="manage_pasteObjects:method" 
- value="Paste" />
-</div>
-</dtml-if>
-</dtml-unless>
-<dtml-if "_.SecurityCheckPermission('Import/Export objects', this())">
-<input class="form-element" type="submit"
-  name="manage_importExportForm:method" value="Import/Export" />
-</dtml-if>
-</td>
-</tr>
-</table>
-</dtml-if>
-</form>
-
-<dtml-if update_menu>
-<script type="text/javascript">
-<!--
-window.parent.update_menu();
-//-->
-</script>
-</dtml-if>
-
-<dtml-var manage_page_footer>




More information about the pkg-zope-commits mailing list